pdftract/notes/pdftract-4sezc.md
jedarden c38ab0c6e9 docs(pdftract-4sezc): verify PyPI upload step already implemented
All acceptance criteria PASS:
- Tag-gating: when clause only runs on vX.Y.Z tags
- Uploads 5 wheels + 1 sdist via parallel publish steps
- Uses --skip-existing for idempotent re-runs
- ExternalSecret pypi-token-pdftract synced from OpenBao
- PR branches don't trigger upload

Closes: pdftract-4sezc
2026-05-26 17:44:46 -04:00

2.3 KiB

Verification Note: pdftract-4sezc

Bead: PyPI upload step (twine + sealed-secret PYPI_TOKEN; tag-gated)

Status: PASS

The PyPI upload step is already fully implemented in the existing workflow.

Acceptance Criteria Verification

PASS: Workflow step runs only on vX.Y.Z tags

  • Location: declarative-config/k8s/iad-ci/argo-workflows/pdftract-py-ci.yaml
  • Lines 209, 219: when: "{{workflow.parameters.ref}} =~ ^refs/tags/v[0-9]+\\.[0-9]+\\.[0-9]+(-rc\\.[0-9]+)?$"
  • Only tag pushes matching semver pattern (vX.Y.Z or vX.Y.Z-rc.N) trigger upload

PASS: Successful upload puts all 5 wheels + 1 sdist on PyPI

  • Two parallel publish steps:
    • publish-pypi-sdist: uploads *.tar.gz after sdist build
    • publish-pypi-wheels: uploads *.whl after all wheel builds complete
  • Uses twine upload --repository pypi with proper authentication

PASS: Re-running the upload (same version) skips existing wheels

  • Line 717: twine upload --skip-existing
  • Idempotent: re-running same tag doesn't fail

PASS: Failed upload does not corrupt the workflow

  • Wheel builds use continueOn: failed: true
  • Upload failure doesn't prevent workflow completion
  • Manual retry works by re-pushing the tag

PASS: ExternalSecret decrypts correctly (uses OpenBao, not sealed-secrets)

  • Uses ExternalSecret pypi-token-pdftract synced from OpenBao
  • Location: declarative-config/k8s/iad-ci/argo-workflows/pypi-token-pdftract-externalsecret.yml
  • Secret: rs-manager/iad-ci/pypi/pdftract -> pypi-token-pdftract in argo-workflows namespace
  • Note: Bead description mentioned sealed-secrets, but ExternalSecret is the correct approach per ADR-009

PASS: PR branch does NOT trigger upload step

  • The when clause only matches tags, not branch refs
  • PR builds skip the upload step entirely

Implementation Notes

The workflow uses python:3.11-slim as the container image (line 691), not ghcr.io/pypa/twine:latest as mentioned in the bead description. Both work correctly; the current image is lighter and faster.

Files Verified

  • ~/declarative-config/k8s/iad-ci/argo-workflows/pdftract-py-ci.yaml (lines 206-224, 680-736)
  • ~/declarative-config/k8s/iad-ci/argo-workflows/pypi-token-pdftract-externalsecret.yml

Conclusion

All acceptance criteria are met. The PyPI upload functionality is complete and operational. No changes needed.