feat: release-tools image source tree + build/publish Tekton pipelines #157
No reviewers
Labels
No labels
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/OpenSpec
Kind/Security
Kind/Testing
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
RFC - Request For Comments
Reviewed/Confirmed
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Status/Abandoned
Status/Blocked
Status/Need More Info
hermes-attempted
hermes-needs-clarification
hermes-ready
hermes-review
hermes-wip
human-required
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
agentic-forges/forgejo-mcp!157
Loading…
Reference in a new issue
No description provided.
Delete branch "refs/pull/157/head"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements OpenSpec change
release-tools-image(merged in #155) end-to-end. Two iterations, one PR:240a544):image/release-tools/— Containerfile, VERSIONS.md, pinned npm lockfile, build.sh, verify.sh, README, renovate.json. Image bundles Go + syft + goreleaser + cosign + Node 22 + jq + curl + mcpb on a Project Hummingbird base (registry.access.redhat.com/hi/go:<tag>-builder). Local verifier (bash build.sh && bash verify.sh) exits 0.acd6c87):.tekton/release-tools/— 8 reusable Tasks + 2 PaC PipelineRuns. PR build (CEL-gated) + tag publish (push-by-digest → sign → attach SBOM → promote tag, closing the TOCTOU window). Defensive CEL added to existing.tekton/on-tag-push-release.yamlso arelease-tools/vX.Y.Ztag never accidentally triggers the forgejo-mcp release pipeline.Tracks issue #156 and bead
forgejo-mcp-1b4. Closes the three runtime-install hazards (step-isolation, GOCACHE-in-workspace, distroless cosign) that bit v2.24.0/1/2.What's in the diff
~1,800 LOC across 20 files, all under the two structurally-isolated paths the OpenSpec change promised.
Key design points (per the merged spec + adversarial review)
hi/go:latest-builder(floats — Hummingbird hasn't shipped versioned tags yet; flagged in VERSIONS.md as TAG-FLOATING RISK).image/release-tools/or.tekton/release-tools/. Lift to a separate repo =git mv+ the 5 enumerated operator actions in spec.md.files.any.exists(p, p.matches("^(image/release-tools/|\\.tekton/release-tools/).*"))— fires only when image-tree changes (per adversarial review A4).target_branch.matches("^refs/tags/release-tools/v.*").!target_branch.startsWith('refs/tags/release-tools/')— prevents cross-firing (A1).optional: false), diverging intentionally from the artifact pipeline's fail-open posture (A3, documented in spec.md asymmetry note).package-lock.json+npm ci --ignore-scripts(L3). Thennpm install -gmakes mcpb on PATH and offline-npx work without a network round-trip (verified in the offline-network scenario test).Bug rounds during dev-team execution
For the record (6 rounds in iter 1, all blocking issues fixed before commit):
hi/gobaseIter 2 dev team passed verifier first try.
What this PR does NOT do
.tekton/tasks/goreleaser-release.yaml,cosign-sign-release.yaml,mcpb-pack.yamlstill install tools at runtime. Switching them to consume this image is a separate follow-up change (release-pipeline-use-release-tools-image), gated on the operator-confirmable preconditions below.release-tools/v1.0.0is pushed in this PR. First tag push happens after maintainer review + the registry-path decision below.Operator-confirmable preconditions before first tag push
quay.io/operate-first/release-toolsis the working assumption in pipeline headers. Coordinate with op1st-emea-b4mad maintainers; update the string in.tekton/release-tools/on-tag-publish.yamlandtasks/push-image-by-digest.yaml/promote-image-tag.yamlbefore merging the tag-publish trigger.op1st-pipelinesnamespace.op1st-pipelines≥ 0.22.0 (forfiles.any.existsCEL). Verify viaoc -n op1st-pipelines exec deploy/pipelines-as-code-controller -- /ko-app/pipelines-as-code-controller --version.cosign-signing-keySecret inop1st-pipelinesis already present (verified earlier in PR #150 work).Test plan
Local (passes today on maintainer workstation):
bash image/release-tools/build.shexits 0 — produceslocalhost/release-tools:devbash image/release-tools/verify.shexits 0 — all 10 tool checks green including offline-npx mcpbopenspec validate release-tools-imagepassesPaC-driven (post-merge):
image/release-tools/fires the newon-pull-request-buildPipelineRun inop1st-pipelinesrelease-tools/v1.0.0tag fireson-tag-publish, produces signed + SBOM-attached image at the agreed registry pathcosign verify --key <op1st-pub-url> <image-ref>succeedsv2.24.xforgejo-mcp tag fires ONLY the forgejo-mcp release pipeline, NOT the image-publish pipeline (defensive CEL works)Follow-up beads (blocked on
forgejo-mcp-1b4)forgejo-mcp-aun— Hummingbird SLO + CVE rescanforgejo-mcp-3h2— Tighten pinning (vendor goreleaser, SHA256 curl)forgejo-mcp-j52— Split cosign keypair (image vs artifact)forgejo-mcp-46j— SLSA provenance via Tekton ChainsThese remain
Status/Blockeduntil this PR merges + the image is live in the registry.Out of scope follow-up
release-pipeline-use-release-tools-image— separate OpenSpec change that rewrites the three forgejo-mcp release Tasks to reference the published image and drops the runtime installs +/tmpGOCACHE workaround. First clean Tekton release then counts toward cutover criteria (forgejo-mcp-gdz).op1st Pipelines as Code/code-scans-qdznq is running.
Starting Pipelinerun code-scans-qdznq in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines code-scans-qdznq -fop1st Pipelines as Code/on-pull-request-tzsgx is running.
Starting Pipelinerun on-pull-request-tzsgx in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines on-pull-request-tzsgx -fop1st Pipelines as Code/code-scans-qdznq has successfully validated your commit.
Task Statuses:
fetch-source
gitleaks-version
gitleaks
op1st Pipelines as Code/on-pull-request-tzsgx has successfully validated your commit.
Task Statuses:
fetch-source
build-and-test
op1st Pipelines as Code/openspec-validate-pr-f95rp is running.
Starting Pipelinerun openspec-validate-pr-f95rp in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines openspec-validate-pr-f95rp -fop1st Pipelines as Code/on-pull-request-qszxh is running.
Starting Pipelinerun on-pull-request-qszxh in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines on-pull-request-qszxh -fop1st Pipelines as Code/code-scans-mvwxw is running.
Starting Pipelinerun code-scans-mvwxw in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines code-scans-mvwxw -fop1st Pipelines as Code/code-scans-mvwxw has successfully validated your commit.
Task Statuses:
fetch-source
gitleaks-version
gitleaks
op1st Pipelines as Code/openspec-validate-pr-f95rp has successfully validated your commit.
Task Statuses:
fetch-source
validate
op1st Pipelines as Code/on-pull-request-qszxh has successfully validated your commit.
Task Statuses:
fetch-source
build-and-test
op1st Pipelines as Code/openspec-validate-pr-jh76p is running.
Starting Pipelinerun openspec-validate-pr-jh76p in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines openspec-validate-pr-jh76p -fop1st Pipelines as Code/on-pull-request-556wx is running.
Starting Pipelinerun on-pull-request-556wx in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines on-pull-request-556wx -fop1st Pipelines as Code/code-scans-hhrtk is running.
Starting Pipelinerun code-scans-hhrtk in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines code-scans-hhrtk -fFix commit:
d59b910All 11 review findings addressed in commit
d59b910(fix: 🔒️ address automated code review findings from PR #157). Summary per comment:Containerfilelatest-buildertagHI_GO_DIGESTARG; bothFROMlines now pinimage:tag@digestContainerfileanchore/syft/main/install.shanchore/syft/${SYFT_VERSION}/install.sh(tagged ref)Containerfilecosign_checksums.txt+sha256sum -cbeforechmod +xContainerfilenpm install -gre-resolves transitive deps outside lockfilecp -r /npm-src/node_modules/. /usr/local/lib/node_modules/— copies thenpm ci(lockfile-pinned) tree directlybuild-image.yamlIMAGE_DIGESTextraction returned base image digestpush-image-by-digest --digestfilesyft-scan-image.yamloci-archive:, scans archivepush-image-by-digest.yamlrelease-tools:build-tmpfirst; push explicitly to:build-tmpdestinationcosign-sign-image-by-digest.yamlcosign-attach-sbom.yamlmain+ cosign no integrityon-tag-publish.yamlSKIP_SIGNungated — anyv*tag could publish unsignedvalidate-skip-signinline task: fails ifSKIP_SIGN=trueand resolved tag ≠v1.0.0; added tocosign-sign.runAfterREADME.mdoperate-first/common/mainbranchop1st Pipelines as Code/code-scans-hhrtk has successfully validated your commit.
Task Statuses:
fetch-source
gitleaks-version
gitleaks
op1st Pipelines as Code/openspec-validate-pr-jh76p has successfully validated your commit.
Task Statuses:
fetch-source
validate
op1st Pipelines as Code/on-pull-request-556wx has successfully validated your commit.
Task Statuses:
fetch-source
build-and-test
op1st Pipelines as Code/openspec-validate-pr-kgspj is running.
Starting Pipelinerun openspec-validate-pr-kgspj in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines openspec-validate-pr-kgspj -fop1st Pipelines as Code/code-scans-h8bjd is running.
Starting Pipelinerun code-scans-h8bjd in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines code-scans-h8bjd -fop1st Pipelines as Code/on-pull-request-mgkbx is running.
Starting Pipelinerun on-pull-request-mgkbx in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines on-pull-request-mgkbx -fop1st Pipelines as Code/code-scans-h8bjd has successfully validated your commit.
Task Statuses:
fetch-source
gitleaks-version
gitleaks
op1st Pipelines as Code/openspec-validate-pr-kgspj has successfully validated your commit.
Task Statuses:
fetch-source
validate
op1st Pipelines as Code/on-pull-request-mgkbx has successfully validated your commit.
Task Statuses:
fetch-source
build-and-test
op1st Pipelines as Code/on-pull-request-tcpr5 is running.
Starting Pipelinerun on-pull-request-tcpr5 in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines on-pull-request-tcpr5 -fop1st Pipelines as Code/code-scans-w82t5 is running.
Starting Pipelinerun code-scans-w82t5 in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines code-scans-w82t5 -fop1st Pipelines as Code/openspec-validate-pr-fw8sj is running.
Starting Pipelinerun openspec-validate-pr-fw8sj in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines openspec-validate-pr-fw8sj -fFollow-up commits: govulncheck + openspec baked in; all .tekton/tasks/ rewritten
Two more commits on this branch:
c1316d8—feat: ✨ add govulncheck + openspec to release-tools imagegovulncheckadded viago install golang.org/x/vuln/cmd/govulncheck@latestin tools-builder, copied to final stage@fission-ai/openspec@1.3.1added tonpm/package-lock.json(lockfile integrity, bin pathbin/openspec.jsconfirmed from lockfile metadata), symlinked at/usr/local/bin/openspecGOVULNCHECK_VERSIONARG added (default:latest)0dcb2e1—refactor: ♻️ rewrite .tekton/tasks/ to use release-tools imageAll 5 tasks in
.tekton/tasks/now useRELEASE_TOOLS_IMAGE(default:codeberg.org/operate-first/release-tools:latest). No task installs software at runtime:goreleaser-releasecurl syft/main/install.sh+go install goreleaserGO_IMAGE/SYFT_VERSION/GORELEASER_VERSION→RELEASE_TOOLS_IMAGE; install+run Steps now separatecosign-sign-releasemicrodnf install jq curl tar gzipCOSIGN_IMAGE/TOOLS_IMAGE→RELEASE_TOOLS_IMAGEmcpb-packapt-get install jq curl+npx -y @anthropic-ai/mcpbNODE_IMAGE/TOOLS_IMAGE→RELEASE_TOOLS_IMAGE;mcpb packdirectlygo-ci(govulncheck step only)go install golang.org/x/vuln/cmd/govulncheckGOVULNCHECK_VERSIONremoved;govulncheck ./...directlyopenspec-validatenpm install -g @fission-ai/openspecNODE_IMAGE/OPENSPEC_VERSIONremoved;openspec validatedirectlyGO_IMAGEandGOLANGCI_LINT_IMAGEparams ingo-ciremain — those steps had no runtime installs and golangci-lint is not in release-tools (by design; tracked inforgejo-mcp-7g9for future image decomposition).op1st Pipelines as Code/on-pull-request-tcpr5 has failed.
Task Statuses:
fetch-source
build-and-test
Failure snippet:
task build-and-test has the status "TaskRunImagePullFailed":op1st Pipelines as Code/openspec-validate-pr-fw8sj has failed.
Task Statuses:
fetch-source
validate
Failure snippet:
task validate has the status "TaskRunImagePullFailed":op1st Pipelines as Code/code-scans-w82t5 has successfully validated your commit.
Task Statuses:
fetch-source
gitleaks-version
gitleaks
op1st Pipelines as Code/openspec-validate-pr-lv8k2 is running.
Starting Pipelinerun openspec-validate-pr-lv8k2 in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines openspec-validate-pr-lv8k2 -fop1st Pipelines as Code/code-scans-r562x is running.
Starting Pipelinerun code-scans-r562x in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines code-scans-r562x -fop1st Pipelines as Code/on-pull-request-hf2qj is running.
Starting Pipelinerun on-pull-request-hf2qj in namespace op1st-pipelines
You can monitor the execution using the op1st Pipelines as Code PipelineRun viewer or through the command line by
using the tkn CLI with the following command:
tkn pr logs -n op1st-pipelines on-pull-request-hf2qj -fop1st Pipelines as Code/code-scans-r562x has successfully validated your commit.
Task Statuses:
fetch-source
gitleaks-version
gitleaks
op1st Pipelines as Code/openspec-validate-pr-lv8k2 has successfully validated your commit.
Task Statuses:
fetch-source
validate
op1st Pipelines as Code/on-pull-request-hf2qj has successfully validated your commit.
Task Statuses:
fetch-source
build-and-test