This repository publishes releases with a tag-driven GitHub Actions workflow:
- Workflow:
.github/workflows/release-sign.yml - Trigger: push a SemVer tag like
v10.2.9
ica-<tag>-source.tar.gzica-<tag>-source.zipSHA256SUMS.txt- Keyless signatures and certificates for each artifact (
.sig,.pem) - GitHub artifact attestations (provenance) for each artifact
The signing job uses GitHub OIDC (id-token: write) and Cosign keyless signing:
- No long-lived signing private key is stored in repo secrets.
- Signatures are bound to the workflow identity.
- Verification in CI pins:
- OIDC issuer:
https://token.actions.githubusercontent.com - Identity:
https://github.com/<owner>/<repo>/.github/workflows/release-sign.yml@refs/tags/<tag>
- OIDC issuer:
Reproducibility is enforced in two layers:
- Deterministic archive creation in
scripts/release/build-artifacts.sh- Uses
git archivefrom the tagged commit - Uses
gzip -nfor deterministic gzip output - Sets
SOURCE_DATE_EPOCH,TZ=UTC, andLC_ALL=C
- Uses
- CI rebuild verification
- Workflow rebuilds artifacts in a separate job
- Compares
SHA256SUMS.txtbetween original and rebuilt outputs - Signing/release only proceeds if hashes match
- Immutable workflow dependencies
- Third-party GitHub Actions are pinned to commit SHAs, not floating tags
release-sign.yml requires:
contents: write(publish release assets)id-token: write(OIDC keyless signing)attestations: write(artifact provenance attestations)
- Merge release PR to
main(per team process). - Create and push tag:
git tag -a vX.Y.Z -m "Release vX.Y.Z"
git push origin vX.Y.Z- Wait for
release-signworkflow to complete. - Optionally verify assets locally using checksums and Cosign certificates.