Releases and publishing¶
Release creation (release.yml) and artifact publication (publish.yml). The develop channel is in Continuous integration. Registry and credential rules are on the CI/CD overview.
release.yml¶
Purpose:
- start a release manually from
main: create the Git tag and the GitHub release for the version inVERSION, then publish the images and the Helm chart
Triggers:
workflow_dispatch
Behavior of the prepare job:
- fails early when the selected ref is not
main - has no write access and no secrets, because it runs dependency code
- checks out the commit, then uses
./.github/actions/check-develop-gatewithbranch: mainand stops if CI did not pass for the head commit ofmain - uses
./.github/actions/suite-testswith caching disabled (enable_cache: false) to runmake test, and then runsmake check-lockstep-version - reads the version from
VERSIONand verifies that the tag does not exist locally or on the remote - extracts the release notes with
make release-notes(theCHANGELOG.mdsection## Version <VERSION>). The job fails if the section is missing or empty - gives the version and the release notes to the next jobs as job outputs
- does not use the
uvcache or the Go cache - summarizes the CI gate, version checks, tag checks, and release-note preparation
Behavior of the tag-and-release job:
- runs after
prepareand runs no dependency code - checks out the commit with the
DEPLOY_KEYSSH key and pushes the tag<VERSION>over SSH (without--force). The organisation ruleset does not letGITHUB_TOKENcreate tags, and the deploy key is a bypass actor - the checkout step has a
zizmor: ignore[artipacked]comment. The next step needs the key, the job uploads no artifacts, and the checkout action removes the key at the end of the job - creates the GitHub release (title
Version <VERSION>) on the existing tag withgh release create --verify-tag --notes-file, through the GitHub API - if the release step fails after the tag push, the tag stays. Delete the tag, or create the release manually, before you run the workflow again
- the workflow-level
concurrencygroup allows only one release run at a time - summarizes the tag and GitHub release result without including release notes or secrets
Behavior of the publish job:
- runs after the
prepareandtag-and-releasejobs and callspublish.ymlwith the new tag
Permissions:
- top-level none
preparejob:contents: readandactions: readtag-and-releasejob:contents: writepublishjob:contents: readandid-token: write
Secrets and tokens:
GITHUB_TOKENis used bygh release create. The first checkout does not keep a tokenDEPLOY_KEYis a deploy key with write access that can bypass the tag ruleset. Only thetag-and-releasejob uses itECCR_USERNAMEandECCR_PASSWORDgo topublish.ymlDOCS_BASE_URLandDOCS_TOKENgo topublish.ymlfor the documentation upload
publish.yml¶
Purpose:
- publish release-tagged images and the Helm chart for a release tag
Triggers:
workflow_call, fromrelease.ymlworkflow_dispatch, to publish an existing tag again
Both triggers have the required input tag. The workflow does not start on the release event. A release that GITHUB_TOKEN creates does not start other workflows, and a release created in another way would publish a second time.
Behavior:
- checks out the tag, without a persisted token
- fails if the
VERSIONfile in the tag is not the same as the tag - uses the same runner (
arc-dind-pet-vsphere-prodinpet-privileged-runners) and publishing action asdevelop.yml - runs
make release, which validates lockstep versioning and publishes the images and the Helm chart using the rootVERSION - a
concurrencygroup for each tag stops two publishes of the same tag at the same time - the
publish-docsjob runs afterpublishon the same runner type. It checks out the tag, sets upuv(no cache), installs a fixedsitesctlbuild (SITESCTL_VERSION) from the ECMWF repository and verifies its SHA-256 (SITESCTL_SHA256), and runsmake publish-docswithDOCS_SOURCE_REFset to the tag - all releases upload to one documentation site. The
publish-docsconcurrency group (without cancellation) allows one upload at a time. If you publish an older tag again, its pages replace the newer pages with the same name - the
publishjob checks first thatDOCS_BASE_URLandDOCS_TOKENare set, so a missing setting fails before the images are built. A failed upload fails the workflow - both jobs summarize their release tag, publishing target, and final job status
Permissions:
- top-level
contents: read publishjob:contents: readandid-token: write(Vault authentication)publish-docsjob:contents: read
Credential inputs:
ECCR_USERNAMEECCR_PASSWORDDOCS_BASE_URL: the Sites platform URL. Set it as a repository secret or variable. The secret takes precedenceDOCS_TOKEN: a repository secret with a token that has write access to the destination site. Thepublishjob receives it only for the pre-publication presence check; the upload step inpublish-docsis the only consumer
The credential action accepts repository secrets. It does not read repository variables. If either value is missing, it uses Vault with GitHub OpenID Connect (OIDC) authentication.