Skip to content

Commit bae2686

Browse files
committed
ci: fixes multi-platform Docker image builds
Closes #97.
1 parent 498fbc5 commit bae2686

File tree

1 file changed

+85
-8
lines changed

1 file changed

+85
-8
lines changed

.github/workflows/release.yml

Lines changed: 85 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,36 +38,113 @@ jobs:
3838
- uses: actions/checkout@v4
3939
- name: Update Rust
4040
run: rustup update stable && rustup default stable
41+
- name: Docker meta
42+
id: meta
43+
uses: docker/metadata-action@v5
44+
with:
45+
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket
4146
- name: Log in to the Container registry
4247
uses: docker/login-action@v3
4348
with:
4449
registry: ${{ env.REGISTRY }}
4550
username: ${{ github.actor }}
4651
password: ${{ secrets.GITHUB_TOKEN }}
47-
- uses: docker/setup-buildx-action@v3
48-
- uses: docker/build-push-action@v6
52+
- name: Set up Docker Buildx
53+
uses: docker/setup-buildx-action@v3
54+
- name: Build and push by digest
55+
id: build
56+
uses: docker/build-push-action@v6
4957
with:
50-
push: true
51-
tags: ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket:${{ github.ref_name }}
5258
platforms: linux/amd64
59+
labels: ${{ steps.meta.outputs.labels }}
60+
tags: ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket
61+
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
62+
- name: Export digest
63+
run: |
64+
mkdir -p ${{ runner.temp }}/digests
65+
digest="${{ steps.build.outputs.digest }}"
66+
touch "${{ runner.temp }}/digests/${digest#sha256:}"
67+
- name: Upload digest
68+
uses: actions/upload-artifact@v4
69+
with:
70+
name: digests-x86
71+
path: ${{ runner.temp }}/digests/*
72+
if-no-files-found: error
73+
retention-days: 1
5374
docker-arm:
5475
runs-on: ubuntu-24.04-arm
5576
steps:
5677
- uses: actions/checkout@v4
5778
- name: Update Rust
5879
run: rustup update stable && rustup default stable
80+
- name: Docker meta
81+
id: meta
82+
uses: docker/metadata-action@v5
83+
with:
84+
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket
5985
- name: Log in to the Container registry
6086
uses: docker/login-action@v3
6187
with:
6288
registry: ${{ env.REGISTRY }}
6389
username: ${{ github.actor }}
6490
password: ${{ secrets.GITHUB_TOKEN }}
65-
- uses: docker/setup-buildx-action@v3
66-
- uses: docker/build-push-action@v6
91+
- name: Set up Docker Buildx
92+
uses: docker/setup-buildx-action@v3
93+
- name: Build and push by digest
94+
id: build
95+
uses: docker/build-push-action@v6
6796
with:
68-
push: true
69-
tags: ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket:${{ github.ref_name }}
7097
platforms: linux/arm64
98+
labels: ${{ steps.meta.outputs.labels }}
99+
tags: ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket
100+
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
101+
- name: Export digest
102+
run: |
103+
mkdir -p ${{ runner.temp }}/digests
104+
digest="${{ steps.build.outputs.digest }}"
105+
touch "${{ runner.temp }}/digests/${digest#sha256:}"
106+
- name: Upload digest
107+
uses: actions/upload-artifact@v4
108+
with:
109+
name: digests-arm
110+
path: ${{ runner.temp }}/digests/*
111+
if-no-files-found: error
112+
retention-days: 1
113+
docker-merge-manifests:
114+
runs-on: ubuntu-latest
115+
needs: [docker-x86, docker-arm]
116+
steps:
117+
- name: Download digests
118+
uses: actions/download-artifact@v4
119+
with:
120+
path: ${{ runner.temp }}/digests
121+
pattern: digests-*
122+
merge-multiple: true
123+
- name: Log in to the Container registry
124+
uses: docker/login-action@v3
125+
with:
126+
registry: ${{ env.REGISTRY }}
127+
username: ${{ github.actor }}
128+
password: ${{ secrets.GITHUB_TOKEN }}
129+
- name: Set up Docker Buildx
130+
uses: docker/setup-buildx-action@v3
131+
- name: Docker meta
132+
id: meta
133+
uses: docker/metadata-action@v5
134+
with:
135+
images: ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket
136+
tags: type=semver,pattern=v{{version}}
137+
labels: |
138+
org.opencontainers.image.source=https://github.com/${{ github.repository }}
139+
org.opencontainers.image.version=v{{version}}
140+
- name: Create manifest list and push
141+
working-directory: ${{ runner.temp }}/digests
142+
run: |
143+
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
144+
$(printf '${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket@sha256:%s ' *)
145+
- name: Inspect image
146+
run: |
147+
docker buildx imagetools inspect ${{ env.REGISTRY }}/${{ github.repository_owner }}/sprocket:${{ steps.meta.outputs.version }}
71148
build_artifacts_win:
72149
runs-on: windows-latest
73150
strategy:

0 commit comments

Comments
 (0)