Skip to content

Commit fc37497

Browse files
committed
chore(ci): add SLSA provenance
1 parent 544e2f8 commit fc37497

File tree

1 file changed

+65
-36
lines changed

1 file changed

+65
-36
lines changed

.github/workflows/release.yaml

Lines changed: 65 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ name: Reusable release workflow
33
on:
44
workflow_call:
55
inputs:
6-
image:
7-
description: 'Image name'
6+
repository:
7+
description: 'Image repository'
88
type: string
99
required: false
1010
default: gitguardian/wolfi/${{ github.workflow }}
@@ -39,19 +39,21 @@ on:
3939
required: false
4040
default: 'true'
4141

42-
permissions:
43-
contents: read
44-
packages: write
45-
attestations: write
46-
id-token: write
47-
security-events: write
48-
actions: read
49-
5042
jobs:
5143
publish:
44+
permissions:
45+
actions: read
46+
attestations: write
47+
contents: read
48+
id-token: write
49+
packages: write
50+
security-events: write
51+
5252
runs-on: ubuntu-latest
5353
outputs:
54-
digest: ${{ steps.apko.outputs.digest }}
54+
digest: ${{ steps.digest.outputs.digest }}
55+
registry: ${{ steps.vars.outputs.registry }}
56+
image: ${{ steps.vars.outputs.image }}
5557
steps:
5658
- uses: imjasonh/[email protected]
5759
- uses: sigstore/cosign-installer@v3
@@ -62,11 +64,12 @@ jobs:
6264
id: vars
6365
shell: bash
6466
run: |
65-
if [[ "${{ github.ref_name }}" == "main" ]]; then
66-
echo "registry=ghcr.io" >> $GITHUB_OUTPUT
67-
else
68-
echo "registry=ttl.sh" >> $GITHUB_OUTPUT
67+
export REGISTRY="ghcr.io"
68+
if [[ "${{ github.ref_name }}" != "main" ]]; then
69+
export REGISTRY="ttl.sh"
6970
fi
71+
echo "registry=${REGISTRY}" >> $GITHUB_OUTPUT
72+
echo "image=${REGISTRY}/${{ inputs.repository }}:${{ inputs.tag }}" >> $GITHUB_OUTPUT
7073
7174
- if: steps.vars.outputs.registry == 'ghcr.io'
7275
name: Login to GitHub Registry
@@ -85,25 +88,25 @@ jobs:
8588
8689
- name: Publish image
8790
id: apko
88-
uses: distroless/actions/apko-publish@main
91+
uses: distroless/actions/apko-publish@v1.0.0
8992
with:
9093
config: ${{ inputs.config-dir }}/${{ inputs.target }}.yaml
91-
tag: ${{ steps.vars.outputs.registry }}/${{ inputs.image }}:${{ inputs.tag }}
94+
tag: ${{ steps.vars.outputs.image }}
9295
package-append: ${{ inputs.packages }}
9396
archs: ${{ inputs.archs }}
9497
sbom-path: ${{ github.workspace }}/sbom
9598

9699
- id: digest
97100
shell: bash
98101
run: |
99-
echo "digest=$(crane digest ${{ steps.vars.outputs.registry }}/${{ inputs.image }}:${{ inputs.tag }})" >> $GITHUB_OUTPUT
102+
echo "digest=$(crane digest ${{ steps.vars.outputs.image }})" >> $GITHUB_OUTPUT
100103
if [[ "${{ inputs.archs }}" == *"amd64"* ]]; then
101-
echo "digest-amd64=$(crane digest --platform=linux/amd64 ${{ steps.vars.outputs.registry }}/${{ inputs.image }}:${{ inputs.tag }})" >> $GITHUB_OUTPUT
104+
echo "digest-amd64=$(crane digest --platform=linux/amd64 ${{ steps.vars.outputs.image }})" >> $GITHUB_OUTPUT
102105
else
103106
echo "digest-amd64=''" >> $GITHUB_OUTPUT
104107
fi
105108
if [[ "${{ inputs.archs }}" == *"arm64"* ]]; then
106-
echo "digest-arm64=$(crane digest --platform=linux/arm64 ${{ steps.vars.outputs.registry }}/${{ inputs.image }}:${{ inputs.tag }})" >> $GITHUB_OUTPUT
109+
echo "digest-arm64=$(crane digest --platform=linux/arm64 ${{ steps.vars.outputs.image }})" >> $GITHUB_OUTPUT
107110
else
108111
echo "digest-arm64=''" >> $GITHUB_OUTPUT
109112
fi
@@ -116,15 +119,7 @@ jobs:
116119
cosign sign \
117120
--recursive \
118121
--oidc-provider=github-actions \
119-
${{ steps.vars.outputs.registry }}/${{ inputs.image }}@${{ steps.digest.outputs.digest }}
120-
121-
- if: steps.vars.outputs.registry == 'ghcr.io'
122-
name: Attest provenance
123-
uses: actions/attest-build-provenance@v2
124-
with:
125-
subject-name: ${{ steps.vars.outputs.registry }}/${{ inputs.image }}
126-
subject-digest: ${{ steps.digest.outputs.digest }}
127-
push-to-registry: true
122+
${{ steps.vars.outputs.registry }}/${{ inputs.repository }}@${{ steps.digest.outputs.digest }}
128123
129124
- name: Attest index SBOM
130125
shell: bash
@@ -135,7 +130,7 @@ jobs:
135130
--type=spdxjson \
136131
--predicate=${{ github.workspace }}/sbom/sbom-index.spdx.json \
137132
--oidc-provider=github-actions \
138-
${{ steps.vars.outputs.registry }}/${{ inputs.image }}@${{ steps.digest.outputs.digest }}
133+
${{ steps.vars.outputs.registry }}/${{ inputs.repository }}@${{ steps.digest.outputs.digest }}
139134
140135
- if: steps.digest.outputs.digest-amd64 != ''
141136
name: Attest amd64 SBOM
@@ -147,7 +142,7 @@ jobs:
147142
--type=spdxjson \
148143
--predicate=${{ github.workspace }}/sbom/sbom-x86_64.spdx.json \
149144
--oidc-provider=github-actions \
150-
${{ steps.vars.outputs.registry }}/${{ inputs.image }}@${{ steps.digest.outputs.digest-amd64 }}
145+
${{ steps.vars.outputs.registry }}/${{ inputs.repository }}@${{ steps.digest.outputs.digest-amd64 }}
151146
152147
- if: steps.digest.outputs.digest-arm64 != ''
153148
name: Attest arm64 SBOM
@@ -159,20 +154,54 @@ jobs:
159154
--type=spdxjson \
160155
--predicate=${{ github.workspace }}/sbom/sbom-aarch64.spdx.json \
161156
--oidc-provider=github-actions \
162-
${{ steps.vars.outputs.registry }}/${{ inputs.image }}@${{ steps.digest.outputs.digest-arm64 }}
157+
${{ steps.vars.outputs.registry }}/${{ inputs.repository }}@${{ steps.digest.outputs.digest-arm64 }}
158+
159+
- if: steps.vars.outputs.registry == 'ghcr.io'
160+
name: Attest build provenance
161+
uses: actions/attest-build-provenance@v2
162+
with:
163+
subject-name: ${{ steps.vars.outputs.registry }}/${{ inputs.repository }}
164+
subject-digest: ${{ steps.digest.outputs.digest }}
165+
push-to-registry: true
166+
167+
slsa:
168+
permissions:
169+
actions: read
170+
id-token: write
171+
packages: write
172+
needs: publish
173+
uses: slsa-framework/slsa-github-generator/.github/workflows/[email protected]
174+
with:
175+
image: ${{ needs.publish.outputs.image }}
176+
digest: ${{ needs.publish.outputs.digest }}
177+
secrets:
178+
registry-username: ${{ github.actor }}
179+
registry-password: ${{ secrets.GITHUB_TOKEN }}
180+
181+
scan:
182+
if: inputs.scan == 'true'
183+
permissions:
184+
actions: read
185+
contents: read
186+
packages: read
187+
security-events: write
188+
needs: publish
189+
runs-on: ubuntu-latest
190+
steps:
191+
- name: Checkout
192+
uses: actions/checkout@v4
163193

164-
- if: inputs.scan == 'true'
165-
name: Scan image
194+
- name: Scan image
166195
id: scan
167196
uses: anchore/scan-action@v6
168197
with:
169-
image: ${{ steps.vars.outputs.registry }}/${{ inputs.image }}:${{ inputs.tag }}
198+
image: ${{ needs.publish.outputs.image }}
170199
cache-db: true
171200
fail-build: 'false'
172201
severity-cutoff: 'high'
173202
#grype-version: v0.87.0
174203

175-
- if: inputs.scan == 'true'
204+
- name: Upload SARIF
176205
uses: github/codeql-action/upload-sarif@v3
177206
with:
178207
sarif_file: ${{ steps.scan.outputs.sarif }}

0 commit comments

Comments
 (0)