Conversation
Pin the Dockerfile base image to denoland/deno:2.7.5 instead of :latest for reproducible builds. Replace gh release view in the docker job with an explicit job output from the release job, eliminating the possibility of picking up a different release tag. Addresses review feedback from #882. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
Blocking Issues
None.
Suggestions
None — this is a clean, focused improvement.
Review notes:
-
Pinned Docker base image (
denoland/deno:2.7.5): Correct approach for reproducible builds. The team should remember to bump this periodically as new Deno versions are adopted. -
Version passthrough via job outputs: The
releasejob already computes the version atsteps.versionand thedockerjob declaresneeds: release, soneeds.release.outputs.versionis guaranteed to be available. This eliminates the race condition wheregh release viewcould return a different release. -
Security: The version is passed through the
RELEASE_VERSIONenv var rather than direct${{ }}interpolation in therun:block, which is the correct pattern for avoiding script injection.
LGTM — ship it.
There was a problem hiding this comment.
CI Security Review
Critical / High
None.
Medium
None introduced by this PR. Pre-existing: third-party actions (softprops/action-gh-release@v2, peter-evans/repository-dispatch@v3, docker/*@v3/v6, denoland/setup-deno@v2) use tag pins instead of SHA pins. This is outside the scope of this PR.
Low
None.
Verdict
PASS — Both changes are security-positive. The Dockerfile pins denoland/deno to a specific version (eliminating latest tag drift), and the workflow replaces a dynamic gh release view lookup with a deterministic job output, removing a potential race condition and reducing the blast radius of the GH_TOKEN in the docker job.
Summary
denoland/deno:2.7.5instead of:latestfor reproducible, deterministic buildsreleasejob to thedockerjob instead of queryinggh release view, which could theoretically return a different releaseImpact
These changes make the release pipeline more deterministic:
Reproducible Docker builds — Pinning the Deno base image means the same Dockerfile produces the same image regardless of when it's built. Previously,
:latestmeant builds could silently pick up a new Deno version with breaking changes or security issues.Correct version propagation — The docker job now receives the exact version from the release job that created it via
needs.release.outputs.version. Previously,gh release viewreturned the repo's latest release, which could be wrong if a manual release was created between jobs.Why this is correct
releasejob already computes the version in theversionstep — we simply expose it as a job outputdockerjob already declaresneeds: release, so the output is guaranteed to be availableAddresses review feedback from #882.
Test plan
🤖 Generated with Claude Code