Skip to content

Commit 18cfeea

Browse files
committed
Prepare release artifacts from tags
Build and verify unsigned registry assets in a read-only tag workflow so release owners can inspect a deterministic handoff before signing or publication is enabled.
1 parent 4d802d1 commit 18cfeea

3 files changed

Lines changed: 124 additions & 16 deletions

File tree

.github/workflows/release.yml

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
name: Release preparation
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
permissions:
9+
contents: read
10+
11+
concurrency:
12+
group: release-${{ github.ref }}
13+
cancel-in-progress: false
14+
15+
jobs:
16+
prepare:
17+
name: Prepare release artifacts
18+
runs-on: ubuntu-latest
19+
timeout-minutes: 20
20+
21+
steps:
22+
- name: Checkout
23+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
24+
with:
25+
fetch-depth: 0
26+
persist-credentials: false
27+
28+
- name: Check release preconditions
29+
env:
30+
GH_TOKEN: ${{ github.token }}
31+
run: |
32+
test -s LICENSE || {
33+
echo "LICENSE must exist before a public provider release." >&2
34+
exit 1
35+
}
36+
37+
visibility="$(gh api "repos/${GITHUB_REPOSITORY}" --jq .visibility)"
38+
if [ "$visibility" != "public" ]; then
39+
echo "The provider repository must be public before a registry release." >&2
40+
exit 1
41+
fi
42+
43+
if ! git merge-base --is-ancestor "$GITHUB_SHA" origin/main; then
44+
echo "Release tags must point to commits reachable from origin/main." >&2
45+
exit 1
46+
fi
47+
48+
- name: Set up Go
49+
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6.5.0
50+
with:
51+
go-version-file: go.mod
52+
cache: true
53+
54+
- name: Build release artifacts
55+
uses: goreleaser/goreleaser-action@5daf1e915a5f0af01ddbcd89a43b8061ff4f1a89 # v7.2.2
56+
with:
57+
distribution: goreleaser
58+
version: v2.17.0
59+
args: release --clean --skip=publish
60+
61+
- name: Verify release artifacts
62+
env:
63+
RELEASE_TAG: ${{ github.ref_name }}
64+
run: |
65+
version="${RELEASE_TAG#v}"
66+
cp terraform-registry-manifest.json "dist/terraform-provider-kernel_${version}_manifest.json"
67+
68+
checksum="dist/terraform-provider-kernel_${version}_SHA256SUMS"
69+
test -s "$checksum"
70+
(cd dist && sha256sum --check "$(basename "$checksum")")
71+
72+
expected_assets="$(
73+
printf '%s\n' \
74+
"terraform-provider-kernel_${version}_darwin_amd64.zip" \
75+
"terraform-provider-kernel_${version}_darwin_arm64.zip" \
76+
"terraform-provider-kernel_${version}_freebsd_386.zip" \
77+
"terraform-provider-kernel_${version}_freebsd_amd64.zip" \
78+
"terraform-provider-kernel_${version}_freebsd_arm.zip" \
79+
"terraform-provider-kernel_${version}_freebsd_arm64.zip" \
80+
"terraform-provider-kernel_${version}_linux_386.zip" \
81+
"terraform-provider-kernel_${version}_linux_amd64.zip" \
82+
"terraform-provider-kernel_${version}_linux_arm.zip" \
83+
"terraform-provider-kernel_${version}_linux_arm64.zip" \
84+
"terraform-provider-kernel_${version}_manifest.json" \
85+
"terraform-provider-kernel_${version}_windows_386.zip" \
86+
"terraform-provider-kernel_${version}_windows_amd64.zip" \
87+
"terraform-provider-kernel_${version}_windows_arm64.zip"
88+
)"
89+
actual_assets="$(awk 'NF == 2 { print $2 }' "$checksum" | sort)"
90+
diff -u <(printf '%s\n' "$expected_assets") <(printf '%s\n' "$actual_assets")
91+
92+
for archive in dist/*.zip; do
93+
files="$(unzip -Z1 "$archive")"
94+
case "$(basename "$archive")" in
95+
*_windows_*) expected_binary="terraform-provider-kernel_v${version}.exe" ;;
96+
*) expected_binary="terraform-provider-kernel_v${version}" ;;
97+
esac
98+
if [ "$files" != "$expected_binary" ]; then
99+
echo "$archive contains unexpected file: $files" >&2
100+
exit 1
101+
fi
102+
done
103+
104+
- name: Upload release artifacts
105+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
106+
with:
107+
name: release-${{ github.ref_name }}-${{ github.run_id }}
108+
path: |
109+
dist/*.zip
110+
dist/*_manifest.json
111+
dist/*_SHA256SUMS
112+
if-no-files-found: error
113+
retention-days: 7
114+
compression-level: 0
115+
overwrite: true

.goreleaser.yml

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,6 @@ checksum:
4343
- glob: terraform-registry-manifest.json
4444
name_template: "{{ .ProjectName }}_{{ .Version }}_manifest.json"
4545

46-
signs:
47-
- artifacts: checksum
48-
args:
49-
- --batch
50-
- --local-user
51-
- "{{ .Env.GPG_FINGERPRINT }}"
52-
- --output
53-
- ${signature}
54-
- --detach-sign
55-
- ${artifact}
56-
5746
release:
5847
extra_files:
5948
- glob: terraform-registry-manifest.json

docs/release.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Use this checklist before publishing a Kernel Terraform provider version.
1313
- Run `go test -short -timeout=2m ./...`.
1414
- Run `go vet ./...`.
1515
- Run `goreleaser check`.
16-
- Run `goreleaser release --snapshot --clean --skip=sign` and inspect the
16+
- Run `goreleaser release --snapshot --clean` and inspect the
1717
registry-shaped archives and checksum file in `dist/`. Confirm every archive
1818
contains only its provider binary and the checksum file includes the renamed
1919
manifest. A snapshot proves artifact construction only; it is not a signed or
@@ -54,11 +54,16 @@ Do not replace or mutate assets for a published version. If an asset, checksum,
5454
## GoReleaser Notes
5555

5656
- `.goreleaser.yml` is the source of truth for registry artifact names, target
57-
platforms, checksums, manifest inclusion, and checksum signing.
57+
platforms, checksums, and manifest inclusion.
5858
- Normal CI runs `goreleaser check`; it does not cross-compile every target or
5959
publish artifacts.
60-
- Prefer a tag-triggered GitHub Actions release workflow once the signing key owner is decided.
61-
- Store the ASCII-armored private signing key as `GPG_PRIVATE_KEY` and its passphrase as `PASSPHRASE`.
60+
- `.github/workflows/release.yml` runs for `v*` tags with read-only repository
61+
access. It requires a non-empty `LICENSE`, public repository visibility, and a
62+
tag commit reachable from `main`, then builds and validates the unsigned
63+
registry assets. The workflow artifact is retained for seven days for release
64+
inspection.
65+
- Signing and publication remain separate manual release gates until release
66+
ownership and a protected publication workflow are configured.
6267

6368
## Registry Setup
6469

@@ -91,4 +96,3 @@ References:
9196

9297
- HashiCorp Terraform provider publishing: https://developer.hashicorp.com/terraform/registry/providers/publishing
9398
- HashiCorp provider registry protocol: https://developer.hashicorp.com/terraform/internals/provider-registry-protocol
94-
- GoReleaser checksum signing: https://goreleaser.com/customization/sign/

0 commit comments

Comments
 (0)