feat(pdftract-5lvpu): add Swift SDK publish Argo workflow
- Add pdftract-swift-publish.yaml WorkflowTemplate - Supports clone, sync-version, conformance tests, tag-and-push, and warm-spi steps - SPM tag format is numeric (1.0.0) without 'v' prefix - Container: swift:5.10-jammy - Runs on iad-ci with GitHub PAT from ESO Secret github-pat-pdftract Closes pdftract-5lvpu
This commit is contained in:
parent
dd2cb0b8c9
commit
4ef7817415
1 changed files with 327 additions and 0 deletions
327
.ci/argo-workflows/pdftract-swift-publish.yaml
Normal file
327
.ci/argo-workflows/pdftract-swift-publish.yaml
Normal file
|
|
@ -0,0 +1,327 @@
|
|||
# pdftract-swift-publish WorkflowTemplate
|
||||
#
|
||||
# Publishes the Swift SDK to github.com/jedarden/pdftract-swift by creating a git tag.
|
||||
# Triggered by the pdftract-release-cascade after pdftract-build-binaries completes.
|
||||
# The workflow clones the Swift SDK repo, syncs the version, runs conformance
|
||||
# tests, creates a git tag matching the binary version, and pushes it.
|
||||
# Swift Package Manager is git-tag-based, so the tag IS the version.
|
||||
#
|
||||
# === Parameter Reference ===
|
||||
# - tag: Git tag from the main repo (e.g., v1.0.0)
|
||||
# - version: SemVer version string (e.g., 1.0.0)
|
||||
#
|
||||
# === Steps ===
|
||||
# 1. clone-sdk-repo: Clone github.com/jedarden/pdftract-swift
|
||||
# 2. sync-version: Update Package.swift (SPM doesn't require explicit version)
|
||||
# 3. conformance: Run swift test --filter ConformanceTests (must pass to publish)
|
||||
# 4. tag-and-push: Create and push git tag VERSION (numeric, no v prefix)
|
||||
# 5. warm-spi: Post the tag to Swift Package Index to trigger indexing
|
||||
#
|
||||
# === Re-runnability ===
|
||||
# A re-run after a partial failure will detect the existing tag and skip the push
|
||||
# step (idempotent). The workflow is safe to re-run.
|
||||
#
|
||||
# === SPM Tag Format ===
|
||||
# SPM tags use NUMERIC format only: 1.0.0, not v1.0.0
|
||||
# The workflow strips the 'v' prefix from the binary tag when creating the SPM tag.
|
||||
#
|
||||
# Bead: pdftract-5lvpu
|
||||
# Plan section: SDK Architecture / Per-SDK Release Channels, line 3599 (Swift v1.1+)
|
||||
# ADR-009: Argo Workflows on iad-ci only
|
||||
#
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: WorkflowTemplate
|
||||
metadata:
|
||||
name: pdftract-swift-publish
|
||||
namespace: argo-workflows
|
||||
labels:
|
||||
app.kubernetes.io/name: pdftract-swift-publish
|
||||
app.kubernetes.io/component: ci
|
||||
app.kubernetes.io/part-of: pdftract
|
||||
spec:
|
||||
entrypoint: publish-swift-sdk
|
||||
serviceAccountName: argo-workflow
|
||||
|
||||
podGC:
|
||||
strategy: OnPodCompletion
|
||||
|
||||
ttlStrategy:
|
||||
secondsAfterSuccess: 1800
|
||||
secondsAfterFailure: 7200
|
||||
|
||||
arguments:
|
||||
parameters:
|
||||
- name: tag
|
||||
value: ""
|
||||
description: "Git tag from main repo (e.g., v1.0.0)"
|
||||
- name: version
|
||||
value: ""
|
||||
description: "Version extracted from tag (e.g., 1.0.0)"
|
||||
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: workspace
|
||||
spec:
|
||||
accessModes: [ReadWriteOnce]
|
||||
storageClassName: sata-large
|
||||
resources:
|
||||
requests:
|
||||
storage: 5Gi
|
||||
|
||||
podMetadata:
|
||||
labels:
|
||||
app.kubernetes.io/name: pdftract-swift-publish
|
||||
tag: "{{workflow.parameters.tag}}"
|
||||
|
||||
templates:
|
||||
# === Main DAG ===
|
||||
# Orchestrates the Swift SDK publish steps
|
||||
- name: publish-swift-sdk
|
||||
dag:
|
||||
tasks:
|
||||
- name: clone-sdk-repo
|
||||
template: clone-sdk-repo
|
||||
|
||||
- name: sync-version
|
||||
template: sync-version
|
||||
dependencies: [clone-sdk-repo]
|
||||
|
||||
- name: conformance
|
||||
template: conformance
|
||||
dependencies: [sync-version]
|
||||
|
||||
- name: tag-and-push
|
||||
template: tag-and-push
|
||||
dependencies: [conformance]
|
||||
|
||||
- name: warm-spi
|
||||
template: warm-spi
|
||||
dependencies: [tag-and-push]
|
||||
continueOn:
|
||||
failed: true # Warm-up is optional; publish succeeds even if it fails
|
||||
|
||||
# === Clone SDK Repo ===
|
||||
# Clones the pdftract-swift repository from GitHub
|
||||
- name: clone-sdk-repo
|
||||
activeDeadlineSeconds: 300
|
||||
container:
|
||||
image: alpine:3.19
|
||||
command: [sh, -c]
|
||||
args:
|
||||
- |
|
||||
set -e
|
||||
apk add --no-cache git
|
||||
|
||||
echo "Cloning pdftract-swift repository..."
|
||||
git clone --branch main \
|
||||
"https://x-access-token:${GH_TOKEN}@github.com/jedarden/pdftract-swift.git" \
|
||||
/workspace/sdk-swift
|
||||
|
||||
cd /workspace/sdk-swift
|
||||
echo "Cloned commit: $(git rev-parse HEAD)"
|
||||
echo "Branch: $(git branch --show-current)"
|
||||
env:
|
||||
- name: GH_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: github-pat-pdftract
|
||||
key: token
|
||||
volumeMounts:
|
||||
- name: workspace
|
||||
mountPath: /workspace
|
||||
resources:
|
||||
requests:
|
||||
cpu: 200m
|
||||
memory: 512Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 1Gi
|
||||
|
||||
# === Sync Version ===
|
||||
# For SPM, the version is implicit in the git tag, but we verify Package.swift
|
||||
# - name: sync-version
|
||||
activeDeadlineSeconds: 120
|
||||
container:
|
||||
image: swift:5.10-jammy
|
||||
command: [sh, -c]
|
||||
args:
|
||||
- |
|
||||
set -e
|
||||
VERSION="{{workflow.parameters.version}}"
|
||||
TAG="{{workflow.parameters.tag}}"
|
||||
|
||||
cd /workspace/sdk-swift
|
||||
|
||||
echo "Verifying Package.swift for version ${VERSION} (tag: ${TAG})"
|
||||
|
||||
# Verify Package.swift exists
|
||||
if [ ! -f Package.swift ]; then
|
||||
echo "ERROR: Package.swift not found in pdftract-swift repo"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# For SPM, the version is in the git tag, not in Package.swift
|
||||
# But we verify the package name is correct
|
||||
if ! grep -q "name: \"pdftract-swift\"" Package.swift; then
|
||||
echo "WARNING: Package name doesn't match expected 'pdftract-swift'"
|
||||
fi
|
||||
|
||||
echo "Version sync complete (SPM version is implicit in git tag)"
|
||||
volumeMounts:
|
||||
- name: workspace
|
||||
mountPath: /workspace
|
||||
resources:
|
||||
requests:
|
||||
cpu: 200m
|
||||
memory: 256Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 512Mi
|
||||
|
||||
# === Conformance Tests ===
|
||||
# Runs the Swift SDK conformance test suite against the bundled binary.
|
||||
# This step MUST pass for the publish to proceed.
|
||||
- name: conformance
|
||||
activeDeadlineSeconds: 1200
|
||||
container:
|
||||
image: swift:5.10-jammy
|
||||
command: [sh, -c]
|
||||
args:
|
||||
- |
|
||||
set -e
|
||||
VERSION="{{workflow.parameters.version}}"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Running Swift SDK Conformance Tests"
|
||||
echo "=========================================="
|
||||
|
||||
cd /workspace/sdk-swift
|
||||
|
||||
# Build the package first
|
||||
echo "Building package..."
|
||||
swift build
|
||||
|
||||
# Run the conformance test suite
|
||||
echo "Running: swift test --filter ConformanceTests"
|
||||
swift test --filter ConformanceTests
|
||||
|
||||
echo "=========================================="
|
||||
echo "Conformance tests PASSED"
|
||||
echo "=========================================="
|
||||
volumeMounts:
|
||||
- name: workspace
|
||||
mountPath: /workspace
|
||||
resources:
|
||||
requests:
|
||||
cpu: 1000m
|
||||
memory: 2Gi
|
||||
limits:
|
||||
cpu: 2000m
|
||||
memory: 4Gi
|
||||
|
||||
# === Tag and Push ===
|
||||
# Creates a git tag VERSION (numeric, no v prefix) and pushes it to GitHub.
|
||||
# This is the actual publish step for Swift Package Manager.
|
||||
- name: tag-and-push
|
||||
activeDeadlineSeconds: 300
|
||||
container:
|
||||
image: alpine:3.19
|
||||
command: [sh, -c]
|
||||
args:
|
||||
- |
|
||||
set -e
|
||||
VERSION="{{workflow.parameters.version}}"
|
||||
TAG="{{workflow.parameters.tag}}"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Creating and pushing git tag ${VERSION}"
|
||||
echo "=========================================="
|
||||
|
||||
cd /workspace/sdk-swift
|
||||
|
||||
# Check if tag already exists (re-run scenario)
|
||||
if git rev-parse "${VERSION}" >/dev/null 2>&1; then
|
||||
echo "Tag ${VERSION} already exists, skipping push"
|
||||
echo "Existing tag: $(git rev-parse ${VERSION})"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Create the tag (numeric format, no 'v' prefix for SPM)
|
||||
echo "Creating tag ${VERSION}..."
|
||||
git tag -a "${VERSION}" -m "Release ${VERSION} (matches pdftract ${TAG})"
|
||||
|
||||
# Push the tag
|
||||
echo "Pushing tag to origin..."
|
||||
git push origin "${VERSION}"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Tag ${VERSION} pushed successfully"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Swift package will be available at:"
|
||||
echo " https://github.com/jedarden/pdftract-swift"
|
||||
echo ""
|
||||
echo "Installation in Package.swift:"
|
||||
echo " .package(url: \"https://github.com/jedarden/pdftract-swift.git\", from: \"${VERSION}\")"
|
||||
env:
|
||||
- name: GH_TOKEN
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: github-pat-pdftract
|
||||
key: token
|
||||
volumeMounts:
|
||||
- name: workspace
|
||||
mountPath: /workspace
|
||||
resources:
|
||||
requests:
|
||||
cpu: 200m
|
||||
memory: 256Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 512Mi
|
||||
|
||||
# === Warm Swift Package Index ===
|
||||
# Posts the tag to Swift Package Index to trigger indexing.
|
||||
# This is optional but speeds up availability.
|
||||
- name: warm-spi
|
||||
activeDeadlineSeconds: 60
|
||||
container:
|
||||
image: alpine:3.19
|
||||
command: [sh, -c]
|
||||
args:
|
||||
- |
|
||||
set -e
|
||||
VERSION="{{workflow.parameters.version}}"
|
||||
TAG="{{workflow.parameters.tag}}"
|
||||
|
||||
echo "Warming Swift Package Index for ${VERSION}..."
|
||||
|
||||
# Post to Swift Package Index API to trigger indexing
|
||||
# The SPI API accepts git repository URLs
|
||||
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
|
||||
-X POST \
|
||||
-H "Accept: application/json" \
|
||||
"https://swiftpackageindex.com/api/packages/scan" \
|
||||
--data-binary "{\"repositoryURL\":\"https://github.com/jedarden/pdftract-swift\",\"version\":\"${VERSION}\"}")
|
||||
|
||||
if [ "${STATUS}" = "200" ] || [ "${STATUS}" = "202" ] || [ "${STATUS}" = "409" ]; then
|
||||
echo "Swift Package Index ping successful (status: ${STATUS})"
|
||||
echo "Indexing should complete within a few minutes"
|
||||
else
|
||||
echo "Swift Package Index returned status ${STATUS}"
|
||||
echo "The package may still be indexing; check https://swiftpackageindex.com later"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Swift package will be available at:"
|
||||
echo " https://swiftpackageindex.com/jedarden/pdftract-swift"
|
||||
echo ""
|
||||
echo "Installation in Package.swift:"
|
||||
echo " .package(url: \"https://github.com/jedarden/pdftract-swift.git\", from: \"${VERSION}\")"
|
||||
resources:
|
||||
requests:
|
||||
cpu: 200m
|
||||
memory: 256Mi
|
||||
limits:
|
||||
cpu: 500m
|
||||
memory: 512Mi
|
||||
Loading…
Add table
Reference in a new issue