Skip to main content

Release pipeline

Maintainer workflow for versioning and publishing the A2C workflow product (a2c-core, a2c-cli, a2c-tui).

Normative policy: ADR-0009 (supersedes ADR-0004). Python registry publishing: ADR-0010.

Package publishing details: package-publishing.md.

Script index: scripts/README.md. Implementation plan: plans/release-orchestration.md.

From a clean checkout with GITLAB_TOKEN set:

python scripts/publish_release.py --align-develop

Dry-run:

python scripts/publish_release.py --dry-run --bump patch

The orchestrator creates release/X.Y.Z, runs bump_release.py, waits for Development CI, pushes the tag, waits for Release CI (including ADR-0010 publish jobs), then ff-merges master (and develop with --align-develop).

Partial steps: --from-step, --stop-after. See python scripts/publish_release.py --help.

Branch and CI profiles (ADR-0009)

RefRoleCI profile
Feature branch or developDay-to-day workDevelopment CI
release/X.Y.ZRelease bump and qualificationDevelopment CI
Tag vX.Y.ZCanonical release markerRelease CI (build, publish, binaries)
masterIntegrated historyMaster CI (light, non-gating)

Normal development (untagged → master)

  1. Work on a feature branch or develop
  2. Wait for green Development CI
  3. Fast-forward merge to master (untagged, code_clean)

Release steps (release/X.Y.Z → tag → master)

  1. Land features; ff-merge code_clean commits to master

  2. Create release branch from master:

    git checkout master && git pull origin master
    git checkout -b release/X.Y.Z
  3. Run python scripts/bump_release.py on the release branch

  4. Push release/X.Y.Z

  5. Wait for green Development CI on the release branch

  6. Tag and push: git push origin vX.Y.Z

  7. Wait for green Release CI on the tag

  8. Fast-forward master from the release branch

If Release CI fails: fix on release/X.Y.Z, rerun Development CI, move tag if needed, retry.

CI on tags (Release CI)

JobPurpose
release:verifyTag matches VERSION and a2c_core.__version__
package:buildBuild six final-release artifacts at X.Y.Z; twine check
package:a2c-cli-binaryPyInstaller a2c linux x64 (permanent artifact)
package:a2c-cli-binary-linux-arm64PyInstaller a2c linux arm64
package:a2c-tui-binaryPyInstaller a2c-tui linux x64
package:a2c-tui-binary-linux-arm64PyInstaller a2c-tui linux arm64
package:smokeInstall wheels from dist/ at X.Y.Z
publish:gitlabGitLab package registry upload (X.Y.Z)
publish:testpypiQuery TestPyPI, publish unused X.Y.ZrcU, automatic
package:smoke-testpypiInstall X.Y.ZrcU from TestPyPI
publish:pypiAssert X.Y.Z absent on PyPI, upload final release, automatic
package:smoke-pypiInstall X.Y.Z from PyPI — released gate

Fast-forward master only after package:smoke-pypi succeeds.

Master CI (light)

JobPurpose
master:integration-recordNon-gating audit on master pushes

Local dry-run

python scripts/bump_release.py --dry-run
python scripts/build_packages.py