@@ -3,8 +3,8 @@ name: Reusable release workflow
3
3
on :
4
4
workflow_call :
5
5
inputs :
6
- image :
7
- description : ' Image name '
6
+ repository :
7
+ description : ' Image repository '
8
8
type : string
9
9
required : false
10
10
default : gitguardian/wolfi/${{ github.workflow }}
39
39
required : false
40
40
default : ' true'
41
41
42
- permissions :
43
- contents : read
44
- packages : write
45
- attestations : write
46
- id-token : write
47
- security-events : write
48
- actions : read
49
-
50
42
jobs :
51
43
publish :
44
+ permissions :
45
+ actions : read
46
+ attestations : write
47
+ contents : read
48
+ id-token : write
49
+ packages : write
50
+ security-events : write
51
+
52
52
runs-on : ubuntu-latest
53
53
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 }}
55
57
steps :
56
58
-
uses :
imjasonh/[email protected]
57
59
- uses : sigstore/cosign-installer@v3
@@ -62,11 +64,12 @@ jobs:
62
64
id : vars
63
65
shell : bash
64
66
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"
69
70
fi
71
+ echo "registry=${REGISTRY}" >> $GITHUB_OUTPUT
72
+ echo "image=${REGISTRY}/${{ inputs.repository }}:${{ inputs.tag }}" >> $GITHUB_OUTPUT
70
73
71
74
- if : steps.vars.outputs.registry == 'ghcr.io'
72
75
name : Login to GitHub Registry
@@ -85,25 +88,25 @@ jobs:
85
88
86
89
- name : Publish image
87
90
id : apko
88
- uses : distroless/actions/apko-publish@main
91
+ uses : distroless/actions/apko-publish@v1.0.0
89
92
with :
90
93
config : ${{ inputs.config-dir }}/${{ inputs.target }}.yaml
91
- tag : ${{ steps.vars.outputs.registry }}/${{ inputs. image }}:${{ inputs.tag }}
94
+ tag : ${{ steps.vars.outputs.image }}
92
95
package-append : ${{ inputs.packages }}
93
96
archs : ${{ inputs.archs }}
94
97
sbom-path : ${{ github.workspace }}/sbom
95
98
96
99
- id : digest
97
100
shell : bash
98
101
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
100
103
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
102
105
else
103
106
echo "digest-amd64=''" >> $GITHUB_OUTPUT
104
107
fi
105
108
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
107
110
else
108
111
echo "digest-arm64=''" >> $GITHUB_OUTPUT
109
112
fi
@@ -116,15 +119,7 @@ jobs:
116
119
cosign sign \
117
120
--recursive \
118
121
--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 }}
128
123
129
124
- name : Attest index SBOM
130
125
shell : bash
@@ -135,7 +130,7 @@ jobs:
135
130
--type=spdxjson \
136
131
--predicate=${{ github.workspace }}/sbom/sbom-index.spdx.json \
137
132
--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 }}
139
134
140
135
- if : steps.digest.outputs.digest-amd64 != ''
141
136
name : Attest amd64 SBOM
@@ -147,7 +142,7 @@ jobs:
147
142
--type=spdxjson \
148
143
--predicate=${{ github.workspace }}/sbom/sbom-x86_64.spdx.json \
149
144
--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 }}
151
146
152
147
- if : steps.digest.outputs.digest-arm64 != ''
153
148
name : Attest arm64 SBOM
@@ -159,20 +154,54 @@ jobs:
159
154
--type=spdxjson \
160
155
--predicate=${{ github.workspace }}/sbom/sbom-aarch64.spdx.json \
161
156
--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
163
193
164
- - if : inputs.scan == 'true'
165
- name : Scan image
194
+ - name : Scan image
166
195
id : scan
167
196
uses : anchore/scan-action@v6
168
197
with :
169
- image : ${{ steps.vars .outputs.registry }}/${{ inputs. image }}:${{ inputs.tag }}
198
+ image : ${{ needs.publish .outputs.image }}
170
199
cache-db : true
171
200
fail-build : ' false'
172
201
severity-cutoff : ' high'
173
202
# grype-version: v0.87.0
174
203
175
- - if : inputs.scan == 'true'
204
+ - name : Upload SARIF
176
205
uses : github/codeql-action/upload-sarif@v3
177
206
with :
178
207
sarif_file : ${{ steps.scan.outputs.sarif }}
0 commit comments