Continuous integration and develop publishing¶
This page covers ci.yml, runner-compatibility.yml, develop.yml, the fork pull request policy, and gate troubleshooting. Release and publish workflows are in Releases; security scans are in Security scanning.
ci.yml¶
Purpose:
- run the repository test suite for all branches and pull requests
Triggers:
- push to any branch (tags do not start it)
- pull request targeting any branch
Behavior:
- fails early on fork pull requests that do not carry the
approved-for-cilabel - uses
./.github/actions/suite-teststo set up Python, Go, and Lua (installed through APT), sync the Python workspace, and run the suite; theenable_cache: trueinput controls only theuvdependency cache — the action always runs with the Go cache off - runs tests with
make test - builds the documentation with
make build-docs. The build is strict, so a broken link, a broken anchor, or a page missing from the navigation fails the job;make build-docschecks the navigation first and then runs the Zensical build. It reuses theuvenvironment thatsuite-testsset up - summarizes the test and documentation-build commands and the final job status
Permissions:
- top-level
contents: read
runner-compatibility.yml¶
Purpose:
- check the repository test suite on the pinned Ubuntu image and the next Ubuntu image
Triggers:
- weekly schedule (
30 3 * * 1) - manual dispatch
Behavior:
- runs the shared repository test action on
ubuntu-24.04andubuntu-26.04 - keeps both matrix jobs independent: one image failing does not cancel the
other (
fail-fast: false) - uses no secrets and has read-only contents permission
- writes a summary for each matrix job
develop.yml¶
Purpose:
- publish
develop-tagged images and the<VERSION>-developHelm chart after theCIworkflow passes for the same commit on thedevelopbranch. TheSecurityworkflow is advisory and does not block publishing
Triggers:
workflow_run: theCIworkflow completes for thedevelopbranch
Each completed CI run starts the workflow. The check-gate job supplies the condition that CI passed for the commit.
Behavior:
- does not run the tests again;
ci.ymlandsecurity.ymlalready run on each push todevelop - the
check-gatejob runs only if the triggering run passed, was started by apushtodevelop, and came from this repository (not from a fork branch nameddevelop) check-gateruns onubuntu-24.04withactions: readandcontents: read. It checks out the tested commit (workflow_run.head_sha, no persisted credentials) and loads./.github/actions/check-develop-gatefrom that checkout. It reads no secretscheck-gatereads, through the GitHub API, the latestpushrun ofci.ymlfor the commit ondevelopin this repository. The run must becompletedwith the conclusionsuccess. A newer failed or unfinished run takes precedence over an older successful runcheck-gatealso makes sure that the commit is still the head ofdevelop. A late result for an older commit thus does not overwrite a newerdevelopimage- if a check fails,
check-gatewrites the reason as a notice and the publish job is skipped. The completion of the other workflow starts a new check. If the API request fails,check-gatefails - a
concurrencygroup for each commit stops two runs from publishing the same commit at the same time - the
build-push-devjob runs only whencheck-gatereportsready build-push-devuses thedevelop-publishconcurrency group, so only one publish runs at a time. A build takes minutes, and a newer commit can passcheck-gatein that time. The newer run waits until the active publish completes. While a publish runs, GitHub keeps only the newest waiting run and cancels older waiting runs- right after its first step checks out the tested commit (
workflow_run.head_sha),build-push-devruns the same check again. If the commit is no longer the head ofdevelop, all other steps are skipped. The newest commit is thus always published last - uses the Ubuntu runner
arc-dind-pet-vsphere-prodinpet-privileged-runners - uses
./.github/actions/prepare-publishingto install GNU Make when needed, resolve credentials, and log in to Docker and Helm - uses the provided ECMWF container registry (ECCR) credentials when both values are set; otherwise, retrieves credentials from Vault and keeps each provided value in preference to its Vault value
- validates and masks the resolved credentials, then passes action outputs to Docker and Helm without exporting credentials to the job environment
- publishes images and the Helm chart with
make publish-develop - summarizes the CI gate result, head recheck, publishing target, and final job status
GitHub reads workflow_run workflows only from the default branch. Changes to develop.yml have an effect only after they are merged into main.
Permissions:
- top-level
contents: read check-gate:actions: readandcontents: readbuild-push-dev:actions: readfor the gate recheck,contents: readfor checkout, andid-token: writefor Vault authentication
Credential inputs:
ECCR_USERNAMEECCR_PASSWORD
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. Both resolved values must be set before registry login.
Gate troubleshooting¶
The shared gate action writes Starting the CI gate. before
it loads the gate module. It then logs each API check: the branch head,
and the CI push runs. The Release workflow uses
the same action for main.
A notice that starts with Publishing is blocked is not an action failure.
It means that the required CI run has not passed for the branch head
commit, or the commit is no longer the branch head. The gate returns
ready: false, and publishing is skipped.
A module-load or API error fails the action and sets no ready output.
The error identifies the operation and includes the HTTP status when
available. For an HTTP 403 response from the workflow-runs API, check that
the calling job has actions: read. Both Develop gate calls need this
permission.
If the log has only the action inputs and no startup message, inspect the
job annotations and runner logs. The gate code might not have started.
Do not change the publishing conditions to bypass the failure. Merge
changes to the default branch (main) before testing a new workflow_run
run; a rerun of an old run does not verify the new workflow revision.
Fork pull request policy¶
The repository does not use pull_request_target.
Instead, workflows that execute PR code enforce a label-based gate for fork pull requests:
- if a PR comes from a fork and does not have the
approved-for-cilabel, the workflow fails early security.ymlstarts a new run when the label is applied, because it listens for thelabeledeventci.ymluses the default pull-request event types, so re-run that workflow after you apply the label
This policy currently applies to:
ci.yml- all jobs in
security.yml