Skip to content

Release v1.2.0: optional static-asset upload, cosign-installer 4.1.3 - #11

Merged
DeviaVir merged 4 commits into
v1from
release-v1.2.0
Nov 14, 2026
Merged

DeviaVir merged 4 commits into
v1from
release-v1.2.0

Conversation

@DeviaVir

Copy link
Copy Markdown
Contributor

Release #9 and #8 to v1. After the merge, this will be tagged v1.2.0.

New (#9): optional inputs static-assets-path and static-assets-destination. When both are set, the publish job uploads that directory from the built image to GCS before it pushes the image:

  • It reads from the verified OCI layout and never runs caller content.
  • Uploads are create-only (ifGenerationMatch=0). An existing object must match the content hash and serving metadata, or the job fails.
  • Text assets are stored gzip-encoded, and every object gets public, max-age=31536000, immutable.
  • Static assets require a single-platform build.
  • The publish job timeout is 35 minutes only when the inputs are set.

Content-hashed web assets (for example Next.js assetPrefix) then stay available for every build during rolling deploys.

Dependency (#8): sigstore/cosign-installer 4.1.2 → 4.1.3. The pin 756fe2d… is the v4.1.3 tag commit. The workflow still pins cosign-release: v3.1.3, so the cosign binary that signs images does not change.

Existing callers are not affected: with both inputs empty, the static-asset step is skipped and the job timeout stays 20 minutes. Apart from the installer pin in #8, the diff between v1 and main is only #9.

Review: #9 had three independent read-only security review rounds (see #9). The harness has 83 tests on Python 3.12 and 3.13; actionlint is clean, and zizmor --offline has no findings.

Who this ships to: consumers that trust refs/heads/v1 pick this up on the merge. The first consumer of the new inputs verifies it on its staging publish.

Branch: release-v1.2.0 is v1 with main merged in. The tree is identical to main (git diff main release-v1.2.0 is empty). A direct main → v1 PR (#10) conflicted, only because of the squash-merged history on v1.

DeviaVir and others added 4 commits October 30, 2026 13:16
publish.yml: security fixes for explicit tags, artifact hand-off and OCI checks
* publish.yml: optional static-asset upload before the image push

New optional inputs static-assets-path and static-assets-destination.
When set, the publish job reads that directory from the validated local
OCI layout (layers applied in order, OCI whiteouts honored, links and
special files rejected, size and count limits) without executing caller
content, and uploads it to the GCS destination with the publisher's
access token before the image is pushed.

Uploads are create-only (ifGenerationMatch=0). An existing object must
match byte for byte and in serving metadata, otherwise the job fails.
Text assets are stored gzip-encoded; all objects get
"public, max-age=31536000, immutable".

Use case: content-hashed web assets (for example Next.js .next/static
with assetPrefix) stay available for every build, so rolling deploys
cannot serve HTML that references chunks missing from the other pods.
Both inputs empty: no behaviour change.

* publish.yml: harden static-asset upload after security review

- Gate the step on the raw inputs and fail closed when the prepare
  outputs are missing (GitHub drops outputs that contain a secret value,
  which would otherwise skip the upload and push the image anyway).
- Name the colliding object in the error; README: separate bucket or
  prefix per trust level, and how to recover from a collision.
- Own AssetError for the step's messages; every other error is reported
  generically, so build-controlled text never reaches the log.
- Reject PAX sparse maps before tarfile parses them.
- On a gzip md5 mismatch with matching content hash, compare the
  decompressed stored object (bounded) instead of failing, so a runner
  zlib change cannot block unchanged assets.
- Cancel queued uploads after the first failure.
- Publish job timeout 35 minutes; document amd64-only asset upload.

* publish.yml: bound all tar extension headers; single-platform static assets

Second review round:
- Include Solaris extended headers (type X) in the 1 MiB extension-header
  limit and cap the total of global PAX headers per layer at 1 MiB.
- Fail closed at startup if the private tarfile hooks the limits rely
  on no longer exist.
- Reject static assets with more than one platform: separate builds can
  produce different asset names and only one platform would be uploaded.
- README: one-line Cache-Control.

* publish.yml: final review items for static-asset upload

- Publish job timeout 35 minutes only when static assets are used;
  other callers keep 20.
- An existing object with Content-Disposition or Content-Language is a
  collision.
- static-assets-path rejects all control characters.
- README: whole-image parsing limits apply to every layer.

---------

Co-authored-by: chase (AI) <[email protected]>
Bumps the actions group with 1 update: [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer).


Updates `sigstore/cosign-installer` from 4.1.2 to 4.1.3
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](sigstore/cosign-installer@6f9f177...756fe2d)

---
updated-dependencies:
- dependency-name: sigstore/cosign-installer
  dependency-version: 4.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Brings #9 (optional static-asset upload before the image push) and #8
(sigstore/cosign-installer 4.1.3) to v1. The merge conflict came only
from v1's squash-merged history; the tree equals main.
@DeviaVir
DeviaVir merged commit 94e85a7 into v1 Nov 14, 2026
1 check passed
@DeviaVir
DeviaVir deleted the release-v1.2.0 branch November 14, 2026 10:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants