Skip to content

Commit e5e70a2

Browse files
authored
Merge pull request #202 from smallstep/jdoss/Packages
Enable RPM and Deb package uploads to packages.smallstep.com
2 parents 8d1276d + 5e32522 commit e5e70a2

File tree

6 files changed

+219
-14
lines changed

6 files changed

+219
-14
lines changed

.github/workflows/release.yml

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ jobs:
3636
OUT=$?
3737
if [ $OUT -eq 0 ]; then IS_PRERELEASE=true; else IS_PRERELEASE=false; fi
3838
echo "IS_PRERELEASE=${IS_PRERELEASE}" >> "${GITHUB_OUTPUT}"
39+
echo "IS_PRERELEASE=${IS_PRERELEASE}" >> "${GITHUB_ENV}"
40+
3941
- name: Extract Tag Names
4042
id: extract-tag
4143
run: |
@@ -46,6 +48,7 @@ jobs:
4648
echo "DOCKER_TAGS_CLOUD=${{ env.DOCKER_IMAGE }}:${VERSION}-${CLOUD_TAG}" >> "${GITHUB_ENV}"
4749
echo "DOCKER_TAGS_DEBIAN=${{ env.DOCKER_IMAGE }}:${VERSION}-${DEBIAN_TAG}" >> "${GITHUB_ENV}"
4850
echo "DOCKER_TAGS_WOLFI=${{ env.DOCKER_IMAGE }}:${VERSION}-${WOLFI_TAG}" >> "${GITHUB_ENV}"
51+
4952
- name: Add Latest Tag
5053
if: steps.is_prerelease.outputs.IS_PRERELEASE == 'false'
5154
run: |
@@ -54,6 +57,7 @@ jobs:
5457
echo "DOCKER_TAGS_CLOUD=${{ env.DOCKER_IMAGE }}:${CLOUD_TAG}" >> "${GITHUB_ENV}"
5558
echo "DOCKER_TAGS_DEBIAN=${{ env.DOCKER_IMAGE }}:${DEBIAN_TAG}" >> "${GITHUB_ENV}"
5659
echo "DOCKER_TAGS_WOLFI=${{ env.DOCKER_IMAGE }}:${WOLFI_TAG}" >> "${GITHUB_ENV}"
60+
5761
- name: Create Release
5862
id: create_release
5963
uses: softprops/action-gh-release@c95fe1489396fe8a9eb87c0abf8aa5b2ef267fda # v2.2.1
@@ -69,17 +73,86 @@ jobs:
6973
name: Upload Assets to Github w/ goreleaser
7074
runs-on: ubuntu-latest
7175
needs: create_release
76+
permissions:
77+
id-token: write
78+
contents: write
79+
packages: write
80+
env:
81+
GPG_PRIVATE_KEY_FILE: "0x889B19391F774443-Certify.key"
7282
steps:
7383
- name: Checkout
7484
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
7585
with:
7686
fetch-depth: 0
87+
7788
- name: setup release environment
7889
run: |-
90+
# shellcheck disable=SC2129
7991
echo 'GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}' > .release-env
80-
- name: release publish
92+
{ echo 'GORELEASER_KEY=${{ secrets.GORELEASER_KEY }}'; \
93+
echo 'AWS_ACCESS_KEY_ID=${{ secrets.AWS_ACCESS_KEY_ID }}'; \
94+
echo 'AWS_S3_BUCKET=${{ secrets.AWS_S3_BUCKET }}'; \
95+
echo 'AWS_S3_REGION=${{ secrets.AWS_S3_REGION }}'; \
96+
echo 'AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}'; \
97+
echo 'GPG_PRIVATE_KEY_FILE=${{ env.GPG_PRIVATE_KEY_FILE }}'; \
98+
echo 'NFPM_PASSPHRASE=${{ secrets.GPG_PRIVATE_KEY_PASSWORD }}'; } >> .release-env
99+
100+
- name: Write GPG private key to file
101+
run: |
102+
echo "${GPG_PRIVATE_KEY}" > "${GPG_PRIVATE_KEY_FILE}"
103+
shell: bash
104+
env:
105+
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
106+
107+
- name: Build binaries
81108
run: make release
82109

110+
- name: Authenticate to Google Cloud
111+
if: ${{ needs.create_release.outputs.is_prerelease == 'false' }}
112+
id: gcloud-auth
113+
uses: google-github-actions/auth@v2
114+
with:
115+
token_format: access_token
116+
workload_identity_provider: ${{ secrets.GOOGLE_CLOUD_WORKLOAD_IDENTITY_PROVIDER }}
117+
service_account: ${{ secrets.GOOGLE_CLOUD_GITHUB_SERVICE_ACCOUNT }}
118+
119+
- name: Set up Google Cloud SDK
120+
if: ${{ needs.create_release.outputs.is_prerelease == 'false' }}
121+
uses: google-github-actions/setup-gcloud@v2
122+
with:
123+
project_id: ${{ secrets.GOOGLE_CLOUD_PACKAGES_PROJECT_ID }}
124+
125+
- name: Get Release Date
126+
id: release_date
127+
run: |
128+
# shellcheck disable=SC2129
129+
RELEASE_DATE=$(date -u +"%y-%m-%d")
130+
echo "RELEASE_DATE=${RELEASE_DATE}" >> "${GITHUB_ENV}"
131+
echo 'IS_PRERELEASE=${{ needs.create_release.outputs.is_prerelease }}' >> "${GITHUB_ENV}"
132+
133+
- name: Run GoReleaser Pro
134+
uses: goreleaser/[email protected]
135+
with:
136+
distribution: goreleaser-pro
137+
version: v2.8.1
138+
args: publish
139+
env:
140+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
141+
AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
142+
AWS_S3_REGION: ${{ secrets.AWS_S3_REGION }}
143+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
144+
GITHUB_TOKEN: ${{ secrets.GORELEASER_PAT }}
145+
GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }}
146+
NFPM_PASSPHRASE: ${{ secrets.GPG_PRIVATE_KEY_PASSWORD }}
147+
RELEASE_DATE: ${{ env.RELEASE_DATE }}
148+
IS_PRERELEASE: ${{ needs.create_release.outputs.is_prerelease }}
149+
150+
- name: Shred and remove GPG private key
151+
run: |
152+
shred -zun 3 "${GPG_PRIVATE_KEY_FILE}"
153+
shred -zun 3 .release-env
154+
shell: bash
155+
83156
build_upload_docker:
84157
name: Build & Upload Docker Image
85158
needs: create_release

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,7 @@ dist/
2525

2626
# Dependency directories (remove the comment below to include it)
2727
# vendor/
28+
29+
# Packages files
30+
0x889B19391F774443-Certify.key
31+
gha-creds-*.json

.goreleaser.yml

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,19 @@
44
# - https://github.com/goreleaser/goreleaser-cross
55
# - https://github.com/goreleaser/goreleaser-cross-example
66
project_name: step-kms-plugin
7+
version: 2
8+
9+
variables:
10+
packageName: step-kms-plugin
11+
packageRelease: 1 # Manually update release: in the nfpm section to match this value if you change this
12+
13+
after:
14+
hooks:
15+
# This script depends on IS_PRERELEASE env being set. This is set by CI in the Is Pre-release step.
16+
- cmd: bash scripts/package-repo-import.sh {{ .Var.packageName }} {{ .Version }}
17+
output: true
18+
env:
19+
- IS_PRERELEASE={{ .Env.IS_PRERELEASE }}
720

821
builds:
922
- id: linux-amd64
@@ -113,11 +126,17 @@ archives:
113126
- completions/*
114127

115128
nfpms:
116-
- builds:
129+
- id: packages
130+
builds:
117131
- linux-amd64
118132
- linux-arm64
119-
package_name: step-kms-plugin
120-
file_name_template: "{{ .PackageName }}_{{ .Version }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}"
133+
package_name: "{{ .Var.packageName }}"
134+
release: "1"
135+
file_name_template: >-
136+
{{- trimsuffix .ConventionalFileName .ConventionalExtension -}}
137+
{{- if and (eq .Arm "6") (eq .ConventionalExtension ".deb") }}6{{ end -}}
138+
{{- if not (eq .Amd64 "v1")}}{{ .Amd64 }}{{ end -}}
139+
{{- .ConventionalExtension -}}
121140
vendor: Smallstep Labs
122141
homepage: https://github.com/smallstep/step-kms-plugin
123142
maintainer: Smallstep <[email protected]>
@@ -139,6 +158,13 @@ nfpms:
139158
- src: completions/zsh_completion
140159
dst: /usr/share/zsh/site-functions/_step-kms-plugin
141160
packager: rpm
161+
rpm:
162+
signature:
163+
key_file: "{{ .Env.GPG_PRIVATE_KEY_FILE }}"
164+
deb:
165+
signature:
166+
key_file: "{{ .Env.GPG_PRIVATE_KEY_FILE }}"
167+
type: origin
142168
overrides:
143169
deb:
144170
dependencies:
@@ -160,6 +186,14 @@ sboms:
160186
checksum:
161187
name_template: "checksums.txt"
162188

189+
publishers:
190+
- name: Google Cloud Artifact Registry
191+
ids:
192+
- packages
193+
cmd: ./scripts/package-upload.sh {{ abs .ArtifactPath }} {{ .Var.packageName }} {{ .Version }} {{ .Var.packageRelease }}
194+
env:
195+
- IS_PRERELEASE={{ .Env.IS_PRERELEASE }}
196+
163197
snapshot:
164198
version_template: "{{ .Tag }}"
165199

Makefile

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ GOOS_OVERRIDE ?=
1010
OUTPUT_ROOT=output/
1111
RELEASE=./.releases
1212

13+
DOCKER_HOST ?= /var/run/docker.sock
14+
DOCKER_SOCK := $(if $(filter unix://%,$(DOCKER_HOST)),$(patsubst unix://%,%,$(DOCKER_HOST)),$(DOCKER_HOST))
15+
1316
#########################################
1417
# Default
1518
#########################################
@@ -115,20 +118,25 @@ govulncheck:
115118

116119
release-dev:
117120
$Q @docker run -it --rm --privileged -e CGO_ENABLED=1 \
121+
-e GORELEASER_KEY=$(GORELEASER_KEY) \
122+
-e IS_PRERELEASE=true \
118123
--entrypoint /bin/bash \
119-
-v /var/run/docker.sock:/var/run/docker.sock \
120-
-v `pwd`:/go/src/$(PKG) \
124+
-v $(DOCKER_SOCK):/var/run/docker.sock:Z \
125+
-v `pwd`:/go/src/$(PKG):Z \
121126
-w /go/src/$(PKG) \
122-
ghcr.io/goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION}
127+
ghcr.io/goreleaser/goreleaser-cross-pro:${GOLANG_CROSS_VERSION}
123128

124129
release-dry-run:
125130
$Q @docker run --rm --privileged -e CGO_ENABLED=1 \
131+
-e GORELEASER_KEY=$(GORELEASER_KEY) \
132+
-e GPG_PRIVATE_KEY_FILE=/dev/null \
133+
-e IS_PRERELEASE=true \
126134
--entrypoint /go/src/$(PKG)/docker/build/entrypoint.sh \
127-
-v /var/run/docker.sock:/var/run/docker.sock \
128-
-v `pwd`:/go/src/$(PKG) \
135+
-v $(DOCKER_SOCK):/var/run/docker.sock:Z \
136+
-v `pwd`:/go/src/$(PKG):Z \
129137
-w /go/src/$(PKG) \
130-
ghcr.io/goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \
131-
--clean --skip=validate --skip=publish
138+
ghcr.io/goreleaser/goreleaser-cross-pro:${GOLANG_CROSS_VERSION} \
139+
release --clean --skip=validate --skip=sign --prepare
132140

133141
release:
134142
@if [ ! -f ".release-env" ]; then \
@@ -137,11 +145,12 @@ release:
137145
fi
138146
$Q @docker run --rm --privileged -e CGO_ENABLED=1 --env-file .release-env \
139147
--entrypoint /go/src/$(PKG)/docker/build/entrypoint.sh \
140-
-v /var/run/docker.sock:/var/run/docker.sock \
148+
-v ./$(GPG_PRIVATE_KEY_FILE):/$(GPG_PRIVATE_KEY_FILE) \
149+
-v $(DOCKER_SOCK):/var/run/docker.sock \
141150
-v `pwd`:/go/src/$(PKG) \
142151
-w /go/src/$(PKG) \
143-
ghcr.io/goreleaser/goreleaser-cross:${GOLANG_CROSS_VERSION} \
144-
release --clean
152+
ghcr.io/goreleaser/goreleaser-cross-pro:${GOLANG_CROSS_VERSION} \
153+
release --clean --prepare
145154

146155
.PHONY: release-dev release-dry-run release
147156

scripts/package-repo-import.sh

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
: ${GCLOUD_LOCATION:=us-central1}
6+
: ${GCLOUD_RPM_REPO:=rpms}
7+
: ${GCLOUD_DEB_REPO:=debs}
8+
9+
PACKAGE="${1}"
10+
VERSION="${2}"
11+
RELEASE="1"
12+
EPOCH="0"
13+
GORELEASER_PHASE=${GORELEASER_PHASE:-release}
14+
15+
echo "Package: ${PACKAGE}"
16+
echo "Version: ${VERSION}"
17+
18+
check_package() {
19+
local EXITCODE=0
20+
local REPO="${1}"
21+
local VER="${2}"
22+
if [ ! -f /tmp/version-deleted.stamp ]; then
23+
gcloud artifacts versions list \
24+
--repository "${REPO}" \
25+
--location "${GCLOUD_LOCATION}" \
26+
--package "${PACKAGE}" \
27+
--filter "VERSION:${VER}" \
28+
--format json 2> /dev/null \
29+
| jq -re '.[].name?' >/dev/null 2>&1 \
30+
|| EXITCODE=$?
31+
if [[ "${EXITCODE}" -eq 0 ]]; then
32+
echo "Package version already exists. Removing it..."
33+
gcloud artifacts versions delete \
34+
--quiet "${VER}" \
35+
--package "${PACKAGE}" \
36+
--repository "${REPO}" \
37+
--location "${GCLOUD_LOCATION}"
38+
touch /tmp/version-deleted.stamp
39+
fi
40+
fi
41+
}
42+
43+
if [[ ${IS_PRERELEASE} == "true" ]]; then
44+
echo "Skipping artifact import; IS_PRERELEASE is 'true'"
45+
exit 0;
46+
fi
47+
48+
check_package "${GCLOUD_RPM_REPO}" "${EPOCH}:${VERSION}-${RELEASE}"
49+
gcloud artifacts yum import "${GCLOUD_RPM_REPO}" \
50+
--location "${GCLOUD_LOCATION}" \
51+
--gcs-source "gs://artifacts-outgoing/${PACKAGE}/rpm/${VERSION}/*"
52+
53+
check_package ${GCLOUD_DEB_REPO} "${VERSION}-${RELEASE}"}
54+
gcloud artifacts apt import "${GCLOUD_DEB_REPO}" \
55+
--location "${GCLOUD_LOCATION}" \
56+
--gcs-source "gs://artifacts-outgoing/${PACKAGE}/deb/${VERSION}/*"

scripts/package-upload.sh

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
set -x
5+
6+
FILE="${1}"
7+
PACKAGE="${2}"
8+
VERSION="${3}"
9+
10+
11+
echo "Package File: ${FILE}"
12+
echo "Package: ${PACKAGE}"
13+
echo "Version: ${VERSION}"
14+
echo "Prerelease: ${IS_PRERELEASE}"
15+
16+
if [[ ${IS_PRERELEASE} == "true" ]]; then
17+
echo "Skipping artifact upload; IS_PRERELEASE is 'true'"
18+
exit 0;
19+
fi
20+
21+
if [ "${FILE: -4}" == ".deb" ]; then
22+
if [[ "${FILE}" =~ "armhf6" ]]; then
23+
echo "Skipping ${FILE} due to GCP Artifact Registry armhf conflict!"
24+
else
25+
gcloud storage cp ${FILE} gs://artifacts-outgoing/${PACKAGE}/deb/${VERSION}/
26+
fi
27+
else
28+
gcloud storage cp ${FILE} gs://artifacts-outgoing/${PACKAGE}/rpm/${VERSION}/
29+
fi

0 commit comments

Comments
 (0)