Skip to content

Commit 368b176

Browse files
committed
feat: add multi-architecture support for Docker builds and scans
1 parent ed04a86 commit 368b176

3 files changed

Lines changed: 45 additions & 25 deletions

File tree

.github/workflows/ci-cd.yaml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,21 @@ jobs:
3232
docker-build-and-image-scan:
3333
if: github.event_name == 'push'
3434
needs: test
35-
uses: milsman2/python-app-template/.github/workflows/docker-build-and-scan.yaml@main
35+
uses: ./.github/workflows/docker-build-and-scan.yaml
3636
with:
3737
DOCKER_PATH_CONTEXT: .
3838
DOCKER_BUILD_DOCKERFILE: ./Dockerfile
39-
DOCKER_TAGS: ${{ vars.DOCKER_USERNAME }}/${{ vars.DOCKER_REPOSITORY }}:${{ github.sha }}
39+
DOCKER_TAGS: ${{ vars.DOCKER_USERNAME }}_${{ vars.DOCKER_REPOSITORY }}_${{ github.sha }}
4040
DOCKER_LOAD_BOOL: false
4141
DOCKER_PUSH_BOOL: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
4242
DOCKER_USERNAME: ${{ vars.DOCKER_USERNAME }}
43+
DOCKER_PLATFORMS: '["linux/amd64","linux/arm64"]'
4344
secrets: inherit
4445

4546
release:
4647
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
4748
needs: [test, docker-build-and-image-scan]
48-
uses: milsman2/python-app-template/.github/workflows/release.yaml@main
49+
uses: ./.github/workflows/release.yaml
4950
permissions:
5051
contents: write
5152
secrets: inherit

.github/workflows/docker-build-and-scan.yaml

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -23,44 +23,62 @@ on:
2323
DOCKER_USERNAME:
2424
required: true
2525
type: string
26+
DOCKER_PLATFORMS:
27+
required: false
28+
type: string
29+
default: 'linux/amd64,linux/arm64'
2630

2731
jobs:
28-
build-and-scan:
32+
build:
33+
runs-on: ubuntu-latest
34+
strategy:
35+
matrix:
36+
platform: ${{ fromJson(inputs.DOCKER_PLATFORMS) }}
2937
env:
3038
DOCKER_PATH_CONTEXT: ${{ inputs.DOCKER_PATH_CONTEXT }}
3139
DOCKER_BUILD_DOCKERFILE: ${{ inputs.DOCKER_BUILD_DOCKERFILE }}
3240
DOCKER_TAGS: ${{ inputs.DOCKER_TAGS }}
33-
DOCKER_LOAD_BOOL: ${{ inputs.DOCKER_LOAD_BOOL }}
34-
DOCKER_PUSH_BOOL: ${{ inputs.DOCKER_PUSH_BOOL }}
3541
DOCKER_USERNAME: ${{ inputs.DOCKER_USERNAME }}
36-
runs-on: ubuntu-latest
3742
steps:
38-
- name: Checkout repository
39-
uses: actions/checkout@v6
40-
- name: Set up QEMU
41-
uses: docker/setup-qemu-action@v4
42-
- name: Set up Docker Buildx
43-
uses: docker/setup-buildx-action@v4
44-
- name: Login to DockerHub
45-
uses: docker/login-action@v4
43+
- uses: actions/checkout@v6
44+
- uses: docker/setup-qemu-action@v4
45+
- uses: docker/setup-buildx-action@v4
46+
- uses: docker/login-action@v4
4647
with:
4748
username: ${{ env.DOCKER_USERNAME }}
4849
password: ${{ secrets.DOCKERHUB_TOKEN }}
49-
- name: Build (and maybe push) Docker image
50+
- name: Build & push per-arch image
5051
uses: docker/build-push-action@v7
5152
with:
52-
context: ${{ env.DOCKER_PATH_CONTEXT }}
53-
file: ${{ env.DOCKER_BUILD_DOCKERFILE}}
54-
load: ${{ env.DOCKER_LOAD_BOOL }}
55-
push: ${{ env.DOCKER_PUSH_BOOL }}
56-
tags: ${{ env.DOCKER_TAGS }}
57-
- name: Run Trivy vulnerability scanner (remote)
58-
if: ${{ github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') }}
53+
context: ${{ env.DOCKER_PATH_CONTEXT }}
54+
file: ${{ env.DOCKER_BUILD_DOCKERFILE }}
55+
platforms: ${{ matrix.platform }}
56+
push: true
57+
tags: docker.io/${{ env.DOCKER_TAGS }}-${{ matrix.platform }}
58+
- name: Run Trivy vulnerability scanner (per-arch)
5959
uses: aquasecurity/trivy-action@0.35.0
6060
with:
61-
image-ref: docker.io/${{ env.DOCKER_TAGS }}
61+
image-ref: docker.io/${{ env.DOCKER_TAGS }}-${{ matrix.platform }}
6262
format: 'table'
6363
exit-code: '1'
6464
ignore-unfixed: true
6565
vuln-type: 'os,library'
6666
severity: 'CRITICAL,HIGH'
67+
68+
manifest:
69+
runs-on: ubuntu-latest
70+
needs: build
71+
env:
72+
DOCKER_TAGS: ${{ inputs.DOCKER_TAGS }}
73+
DOCKER_USERNAME: ${{ inputs.DOCKER_USERNAME }}
74+
steps:
75+
- uses: docker/login-action@v4
76+
with:
77+
username: ${{ env.DOCKER_USERNAME }}
78+
password: ${{ secrets.DOCKERHUB_TOKEN }}
79+
- name: Create and push multi-arch manifest
80+
run: |
81+
docker buildx imagetools create \
82+
-t docker.io/${{ env.DOCKER_TAGS }} \
83+
docker.io/${{ env.DOCKER_TAGS }}-linux_amd64 \
84+
docker.io/${{ env.DOCKER_TAGS }}-linux_arm64

.github/workflows/release.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ jobs:
9494
DOCKER_PATH_CONTEXT: ${{ inputs.DOCKER_PATH_CONTEXT }}
9595
DOCKER_BUILD_DOCKERFILE: ${{ inputs.DOCKER_BUILD_DOCKERFILE }}
9696
DOCKER_LOAD_BOOL: false
97-
DOCKER_TAGS: ${{ inputs.DOCKER_USERNAME }}/${{ inputs.DOCKER_REPOSITORY }}:${{ needs.Semantic-Release.outputs.tag }}
97+
DOCKER_TAGS: ${{ inputs.DOCKER_USERNAME }}_${{ inputs.DOCKER_REPOSITORY }}_${{ needs.Semantic-Release.outputs.tag }}
9898
DOCKER_PUSH_BOOL: true
9999
DOCKER_USERNAME: ${{ inputs.DOCKER_USERNAME }}
100+
DOCKER_PLATFORMS: '["linux/amd64","linux/arm64"]'

0 commit comments

Comments
 (0)