Skip to content

Commit d57f6cc

Browse files
committed
feat(docker): sign built images with cosign
Signed-off-by: Emilien Escalle <emilien.escalle@escemi.com>
1 parent 2c8c2da commit d57f6cc

File tree

16 files changed

+348
-183
lines changed

16 files changed

+348
-183
lines changed

.github/workflows/__main-ci.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ permissions:
2020
pull-requests: write
2121
security-events: write
2222
statuses: write
23-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
2423
id-token: write
2524

2625
concurrency:

.github/workflows/__pull-request-ci.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ permissions:
1414
pull-requests: write
1515
security-events: write
1616
statuses: write
17-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
1817
id-token: write
1918

2019
concurrency:

.github/workflows/__shared-ci.yml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ permissions:
1212
pull-requests: read
1313
security-events: write
1414
statuses: write
15-
# yamllint disable-line rule:line-length
16-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
1715
id-token: write
1816

1917
jobs:
@@ -42,10 +40,6 @@ jobs:
4240
needs: linter
4341
uses: ./.github/workflows/__test-action-get-image-name.yml
4442

45-
test-action-helm-generate-docs:
46-
needs: linter
47-
uses: ./.github/workflows/__test-action-helm-generate-docs.yml
48-
4943
test-action-helm-parse-chart-uri:
5044
needs: linter
5145
uses: ./.github/workflows/__test-action-helm-parse-chart-uri.yml

.github/workflows/__test-action-docker-prune-pull-requests-image-tags.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ permissions:
1010
issues: read
1111
packages: write
1212
pull-requests: read
13-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
1413
id-token: write
1514

1615
env:

.github/workflows/__test-action-helm-generate-docs.yml

Lines changed: 0 additions & 23 deletions
This file was deleted.

.github/workflows/__test-action-helm-release-chart.yml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ jobs:
1313
tests:
1414
name: Test for "helm/release-chart" action with simple chart
1515
runs-on: ubuntu-latest
16-
permissions:
17-
contents: read
18-
packages: write
1916
strategy:
2017
fail-fast: false
2118
matrix:

.github/workflows/__test-action-helm-test-chart.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ permissions:
1010
issues: read
1111
packages: write
1212
pull-requests: read
13-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
1413
id-token: write
1514

1615
jobs:

.github/workflows/__test-workflow-docker-build-images.yml

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ permissions:
1010
issues: read
1111
packages: write
1212
pull-requests: read
13-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
1413
id-token: write
1514

1615
# jscpd:ignore-start
1716
jobs:
1817
arrange:
18+
name: Arrange
1919
runs-on: ubuntu-latest
2020
steps:
2121
- run: |
@@ -24,7 +24,8 @@ jobs:
2424
exit 1
2525
fi
2626
27-
act-build-arch:
27+
act-build-images:
28+
name: Act - Build multi-arch and mono-arch images
2829
needs: arrange
2930
uses: ./.github/workflows/docker-build-images.yml
3031
secrets:
@@ -55,17 +56,18 @@ jobs:
5556
}
5657
]
5758
58-
assert-build-arch:
59-
needs: act-build-arch
59+
assert-build-arch-mono-arch:
60+
name: Assert - multi-arch and mono-arch builds
61+
needs: act-build-images
6062
runs-on: "ubuntu-latest"
6163
steps:
62-
- name: Check built images ouput
64+
- name: Assert - built images output
6365
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
6466
with:
6567
script: |
6668
const assert = require("assert");
6769
68-
const builtImagesOutput = `${{ needs.act-build-arch.outputs.built-images }}`;
70+
const builtImagesOutput = `${{ needs.act-build-images.outputs.built-images }}`;
6971
assert(builtImagesOutput.length, `"built-images" output is empty`);
7072
7173
// Check if is valid Json
@@ -132,13 +134,13 @@ jobs:
132134
username: ${{ github.repository_owner }}
133135
password: ${{ github.token }}
134136

135-
- name: Check multi-arch docker image and manifest
137+
- name: Assert - multi-arch docker image and manifest
136138
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
137139
with:
138140
script: |
139141
const assert = require("assert");
140142
141-
const image = `${{ fromJson(needs.act-build-arch.outputs.built-images).test-multi-arch.images[0] }}`;
143+
const image = `${{ fromJson(needs.act-build-images.outputs.built-images).test-multi-arch.images[0] }}`;
142144
143145
await exec.exec('docker', ['pull', image]);
144146
@@ -194,13 +196,32 @@ jobs:
194196
assert.equal(annotations[key], value, `Expected annotation not found: ${key}`);
195197
});
196198
197-
- name: Check mono-arch docker image
199+
- uses: sigstore/cosign-installer@398d4b0eeef1380460a10c8013a76f728fb906ac # v3.9.1
200+
201+
- name: Assert - signed multi-arch docker image
202+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
203+
with:
204+
script: |
205+
const images = ${{ toJson(fromJson(needs.act-build-images.outputs.built-images).test-multi-arch.images) }};
206+
207+
for(const image of images) {
208+
await exec.exec(
209+
'cosign',
210+
[
211+
'verify', image,
212+
'--certificate-oidc-issuer', 'https://token.actions.githubusercontent.com',
213+
'--certificate-identity-regexp', 'https://github.com/hoverkraft-tech/ci-github-container',
214+
]
215+
);
216+
}
217+
218+
- name: Assert - mono-arch docker image
198219
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
199220
with:
200221
script: |
201222
const assert = require("assert");
202223
203-
const image = `${{ fromJson(needs.act-build-arch.outputs.built-images).test-mono-arch.images[0] }}`;
224+
const image = `${{ fromJson(needs.act-build-images.outputs.built-images).test-mono-arch.images[0] }}`;
204225
205226
await exec.exec('docker', ['pull', image]);
206227
@@ -239,7 +260,25 @@ jobs:
239260
);
240261
});
241262
263+
- name: Assert - signed mono-arch docker image
264+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
265+
with:
266+
script: |
267+
const images = ${{ toJson(fromJson(needs.act-build-images.outputs.built-images).test-mono-arch.images) }};
268+
269+
for(const image of images) {
270+
await exec.exec(
271+
'cosign',
272+
[
273+
'verify', image,
274+
'--certificate-oidc-issuer', 'https://token.actions.githubusercontent.com',
275+
'--certificate-identity-regexp', 'https://github.com/hoverkraft-tech/ci-github-container',
276+
]
277+
);
278+
}
279+
242280
act-build-args-secrets-and-registry-caching:
281+
name: Act - Build with args, secrets and registry caching
243282
needs: arrange
244283
uses: ./.github/workflows/docker-build-images.yml
245284
secrets:
@@ -275,6 +314,7 @@ jobs:
275314
SECRET_ENV_GITHUB_APP_TOKEN_2
276315
277316
assert-build-args-secrets-and-registry-caching:
317+
name: Assert - Build with args, secrets and registry caching
278318
needs: act-build-args-secrets-and-registry-caching
279319
runs-on: "ubuntu-latest"
280320
steps:

.github/workflows/docker-build-images.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ Needs the following permissions:
1919
- `issues`: `read`
2020
- `packages`: `write`
2121
- `pull-requests`: `read`
22-
- `id-token`: `write` <!-- FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659 -->
22+
- `id-token`: `write`
2323

2424
<!-- end description -->
2525
<!-- start contents -->
@@ -39,7 +39,6 @@ permissions:
3939
issues: read
4040
packages: write
4141
pull-requests: read
42-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
4342
id-token: write
4443

4544
jobs:

.github/workflows/docker-build-images.yml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ permissions:
137137
issues: read
138138
packages: write
139139
pull-requests: read
140-
# FIXME: This is a workaround for having workflow actions. See https://github.com/orgs/community/discussions/38659
141140
id-token: write
142141

143142
jobs:
@@ -500,3 +499,23 @@ jobs:
500499
oci-registry-username: ${{ inputs.oci-registry-username }}
501500
oci-registry-password: ${{ secrets.oci-registry-password }}
502501
built-images: ${{ steps.built-images.outputs.built-images }}
502+
503+
- id: get-images-to-sign
504+
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
505+
with:
506+
script: |
507+
const builtImagesInput = `${{ steps.built-images.outputs.built-images }}`;
508+
let builtImages = null;
509+
try {
510+
builtImages = JSON.parse(builtImagesInput);
511+
} catch (error) {
512+
throw new Error(`"built-images" input is not a valid JSON: ${error}`);
513+
}
514+
515+
// Get images to sign
516+
const imagesToSign = Object.values(builtImages).map(image => image.images).flat();
517+
core.setOutput('images-to-sign', JSON.stringify(imagesToSign));
518+
- uses: ./self-workflow/actions/docker/sign-images
519+
with:
520+
images: ${{ steps.get-images-to-sign.outputs.images-to-sign }}
521+
github-token: ${{ secrets.GITHUB_TOKEN }}

0 commit comments

Comments
 (0)