Skip to content

Commit 9ed4c4e

Browse files
authored
feat: Sign Linux packages and distribute GPG public key with release (#2852)
* feat: Distribute GPG public key with release * Temp file * Regenerate public key, move to .keep, use release_deps instead of ./signature directly * Sign nfpms during release workflow
1 parent ac5764e commit 9ed4c4e

8 files changed

Lines changed: 140 additions & 1 deletion

File tree

.github/workflows/release-test.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ jobs:
152152
with:
153153
path: ~/.cache/goreleaser
154154

155+
- name: Write signing key for nFPM
156+
shell: bash
157+
run: |
158+
cat > ci-signing-key.asc <<'EOF'
159+
${{ secrets.GPG_PRIVATE_SIGNING_KEY }}
160+
EOF
161+
155162
- name: Run GoReleaser
156163
uses: goreleaser/goreleaser-action@v6
157164
with:
@@ -162,11 +169,15 @@ jobs:
162169
GORELEASER_CURRENT_TAG: ${{ env.VERSION }}
163170
GITHUB_TOKEN: ${{ secrets.ORG_GORELEASER_GITHUB_TOKEN }}
164171
GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}
172+
SIGNING_KEY_FILE: ci-signing-key.asc
165173

166174
- name: Create artifact archive
167175
run: |
168176
mkdir artifacts
177+
mkdir artifacts/gpg
169178
cp ./scripts/install/*.sh ./artifacts
179+
cp ./release_deps/gpg/bdot-public-gpg-key.asc ./artifacts/gpg/bdot-public-gpg-key.asc
180+
cp -r ./release_deps/gpg/revocations ./artifacts/gpg/revocations
170181
cp ./observiq-otel-collector.msi/observiq-otel-collector.msi ./artifacts
171182
cp ./dist/*tar.gz ./artifacts
172183
cp ./windows-archive/windows_amd64/*.zip ./artifacts

.github/workflows/release.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ jobs:
164164
shell: bash
165165
env:
166166
COSIGN_PASSWORD: ${{ secrets.ORG_COSIGN_PWD }}
167+
- name: Write signing key for nFPM
168+
shell: bash
169+
run: |
170+
cat > ci-signing-key.asc <<'EOF'
171+
${{ secrets.GPG_PRIVATE_SIGNING_KEY }}
172+
EOF
167173
- name: Run GoReleaser
168174
uses: goreleaser/goreleaser-action@v6
169175
with:
@@ -174,11 +180,15 @@ jobs:
174180
GITHUB_TOKEN: ${{ secrets.ORG_GORELEASER_GITHUB_TOKEN }}
175181
GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}
176182
COSIGN_PWD: ${{ secrets.ORG_COSIGN_PWD }}
183+
SIGNING_KEY_FILE: ci-signing-key.asc
177184
# Create artifact bundle and upload to release
178185
- name: Create artifact archive
179186
run: |
180187
mkdir artifacts
188+
mkdir artifacts/gpg
181189
cp ./scripts/install/*.sh ./artifacts
190+
cp ./release_deps/gpg/bdot-public-gpg-key.asc ./artifacts/gpg/bdot-public-gpg-key.asc
191+
cp -r ./release_deps/gpg/revocations ./artifacts/gpg/revocations
182192
cp ./observiq-otel-collector.msi/observiq-otel-collector.msi ./artifacts
183193
cp ./dist/*tar.gz ./artifacts
184194
cp ./windows-archive/windows_amd64/*.zip ./artifacts
@@ -195,6 +205,8 @@ jobs:
195205
run: |
196206
gsutil cp ./scripts/install/install_unix.sh gs://bdot-release/latest/install_unix.sh
197207
gsutil cp ./scripts/install/install_macos.sh gs://bdot-release/latest/install_macos.sh
208+
gsutil cp ./release_deps/gpg/bdot-public-gpg-key.asc gs://bdot-release/latest/gpg/bdot-public-gpg-key.asc
209+
gsutil cp -r ./release_deps/gpg/revocations gs://bdot-release/latest/gpg/revocations/
198210
- name: Upload artifact bundle to release
199211
uses: AButler/upload-release-assets@v2.0
200212
with:

.goreleaser.gpg.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ archives:
7979
- src: release_deps/windows_service.json
8080
dst: install
8181
strip_parent: true
82+
- src: release_deps/gpg/*
83+
dst: gpg
84+
strip_parent: true
8285
format_overrides:
8386
- goos: windows
8487
format: zip

.goreleaser.yml

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ project_name: observiq-otel-collector
44

55
before:
66
hooks:
7-
- make release-prep CURR_VERSION={{ .Version }}
7+
- make release-prep-gpg CURR_VERSION={{ .Version }}
88

99
# https://goreleaser.com/customization/build/
1010
builds:
@@ -88,6 +88,9 @@ archives:
8888
- src: release_deps/com.observiq.collector.plist
8989
dst: "install"
9090
strip_parent: true
91+
- src: release_deps/gpg/*
92+
dst: gpg
93+
strip_parent: true
9194

9295
nfpms:
9396
- id: collector
@@ -105,6 +108,12 @@ nfpms:
105108
- rpm
106109
- deb
107110
bindir: /usr/share/observiq-otel-collector/stage/observiq-otel-collector
111+
deb:
112+
signature:
113+
key_file: "{{ .Env.SIGNING_KEY_FILE }}"
114+
rpm:
115+
signature:
116+
key_file: "{{ .Env.SIGNING_KEY_FILE }}"
108117
contents:
109118
# This file was previously managed by the package
110119
# therefore it must be marked as a ghost file to
@@ -741,6 +750,7 @@ release:
741750
- glob: "./observiq-otel-collector*.msi.sig"
742751
- glob: "./scripts/install/install_unix.sh"
743752
- glob: "./scripts/install/install_macos.sh"
753+
- glob: "./release_deps/gpg-keys.zip"
744754

745755
# https://console.cloud.google.com/storage/browser/bdot-release
746756
blobs:
@@ -752,6 +762,7 @@ blobs:
752762
- glob: "./observiq-otel-collector*.msi.sig"
753763
- glob: "./scripts/install/install_unix.sh"
754764
- glob: "./scripts/install/install_macos.sh"
765+
- glob: "./release_deps/gpg-keys.zip"
755766

756767
# https://goreleaser.com/customization/changelog/
757768
changelog:

Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,19 @@ release-prep:
242242
@echo 'v$(CURR_VERSION)' > release_deps/VERSION.txt
243243
./buildscripts/download-dependencies.sh release_deps
244244
@cp -r ./plugins release_deps/
245+
@cp -r ./signature/gpg release_deps/gpg
246+
@rm release_deps/gpg/revocations.md
247+
@rm release_deps/gpg/revocations/.keep
245248
@cp config/example.yaml release_deps/config.yaml
246249
@cp config/logging.yaml release_deps/logging.yaml
247250
@cp service/com.observiq.collector.plist release_deps/com.observiq.collector.plist
248251
@jq ".files[] | select(.service != null)" windows/wix.json >> release_deps/windows_service.json
249252

253+
.PHONY: release-prep-gpg
254+
release-prep-gpg:
255+
$(MAKE) release-prep
256+
@cd release_deps/gpg && zip -r ../gpg-keys.zip .
257+
250258
# Build and sign, skip release and ignore dirty git tree
251259
.PHONY: release-test
252260
release-test:
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
-----BEGIN PGP PUBLIC KEY BLOCK-----
2+
3+
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
85+
jhWSRJ+cvwVAy1LHz1Dzc/zlA3GG
86+
=x4KN
87+
-----END PGP PUBLIC KEY BLOCK-----

signature/gpg/revocations.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# GPG Key Revocations
2+
3+
Any primary public keys that have been revoked should be placed within the `revocations` folder.
4+
5+
If a primary keypair has been lost or destroyed, its revocation certificate should be placed within the `revocations` folder.
6+
7+
Once one of the above two steps has been taken for the revoked keypair, the release action and install scripts will distribute the revocations to prevent users from installing new software signed using the revoked keypair.

signature/gpg/revocations/.keep

Whitespace-only changes.

0 commit comments

Comments
 (0)