Skip to content

Commit 36940bd

Browse files
authored
ci: build multi-platform images natively using Github ARM runners (#633)
* ci: build multi-platform images natively using Github ARM runners Signed-off-by: Bob Du <i@bobdu.cc> * ci: build multi-platform images natively using Github ARM runners Signed-off-by: Bob Du <i@bobdu.cc> * fix: add build args in ci Signed-off-by: Bob Du <i@bobdu.cc> --------- Signed-off-by: Bob Du <i@bobdu.cc>
1 parent 35e6e20 commit 36940bd

File tree

4 files changed

+162
-97
lines changed

4 files changed

+162
-97
lines changed

.github/workflows/build_docker.yml

Lines changed: 81 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,37 +27,98 @@ jobs:
2727
readme-filepath: README.en.md
2828
enable-url-completion: true
2929

30-
build_docker:
31-
name: Build docker
32-
runs-on: ubuntu-latest
30+
build:
31+
name: Build multi-platform images
32+
strategy:
33+
fail-fast: false
34+
matrix:
35+
include:
36+
- platform: linux/amd64
37+
os: ubuntu-latest
38+
- platform: linux/arm64
39+
os: ubuntu-24.04-arm
40+
runs-on: ${{ matrix.os }}
3341
steps:
34-
- name: Checkout
35-
uses: actions/checkout@v4
42+
- name: Prepare
43+
run: |
44+
platform=${{ matrix.platform }}
45+
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
3646
37-
# Print out all environment variables
38-
- run: |
39-
env
47+
- name: Docker meta
48+
id: meta
49+
uses: docker/metadata-action@v5
50+
with:
51+
images: ${{ vars.DOCKERHUB_NAMESPACE }}/chatgpt-web
4052

41-
- name: Set up QEMU
42-
uses: docker/setup-qemu-action@v3
43-
- name: Set up Docker Buildx
44-
uses: docker/setup-buildx-action@v3
4553
- name: Login to Docker Hub
4654
uses: docker/login-action@v3
4755
with:
4856
username: ${{ secrets.DOCKERHUB_USERNAME }}
4957
password: ${{ secrets.DOCKERHUB_TOKEN }}
50-
- name: Build and push
51-
id: docker_build
52-
uses: docker/build-push-action@v5
58+
59+
- name: Set up Docker Buildx
60+
uses: docker/setup-buildx-action@v3
61+
62+
- name: Build and push by digest
63+
id: build
64+
uses: docker/build-push-action@v6
5365
with:
5466
context: .
55-
push: true
67+
platforms: ${{ matrix.platform }}
5668
labels: ${{ steps.meta.outputs.labels }}
57-
platforms: linux/amd64,linux/arm64
58-
tags: |
59-
${{ vars.DOCKERHUB_NAMESPACE }}/chatgpt-web:${{ github.ref_name }}
60-
${{ vars.DOCKERHUB_NAMESPACE }}/chatgpt-web:latest
6169
build-args: |
6270
GIT_COMMIT_HASH=${{ github.sha }}
6371
RELEASE_VERSION=${{ github.ref_name }}
72+
outputs: type=image,name=${{ vars.DOCKERHUB_NAMESPACE }}/chatgpt-web,push-by-digest=true,name-canonical=true,push=true
73+
74+
- name: Export digest
75+
run: |
76+
mkdir -p ${{ runner.temp }}/digests
77+
digest="${{ steps.build.outputs.digest }}"
78+
touch "${{ runner.temp }}/digests/${digest#sha256:}"
79+
80+
- name: Upload digest
81+
uses: actions/upload-artifact@v4
82+
with:
83+
name: digests-${{ env.PLATFORM_PAIR }}
84+
path: ${{ runner.temp }}/digests/*
85+
if-no-files-found: error
86+
retention-days: 1
87+
88+
merge:
89+
name: Merge multi-platform images
90+
runs-on: ubuntu-latest
91+
needs:
92+
- build
93+
steps:
94+
- name: Download digests
95+
uses: actions/download-artifact@v4
96+
with:
97+
path: ${{ runner.temp }}/digests
98+
pattern: digests-*
99+
merge-multiple: true
100+
101+
- name: Login to Docker Hub
102+
uses: docker/login-action@v3
103+
with:
104+
username: ${{ secrets.DOCKERHUB_USERNAME }}
105+
password: ${{ secrets.DOCKERHUB_TOKEN }}
106+
107+
- name: Set up Docker Buildx
108+
uses: docker/setup-buildx-action@v3
109+
110+
- name: Docker meta
111+
id: meta
112+
uses: docker/metadata-action@v5
113+
with:
114+
images: ${{ vars.DOCKERHUB_NAMESPACE }}/chatgpt-web
115+
116+
- name: Create manifest list and push
117+
working-directory: ${{ runner.temp }}/digests
118+
run: |
119+
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
120+
$(printf '${{ vars.DOCKERHUB_NAMESPACE }}/chatgpt-web@sha256:%s ' *)
121+
122+
- name: Inspect image
123+
run: |
124+
docker buildx imagetools inspect ${{ vars.DOCKERHUB_NAMESPACE }}/chatgpt-web:${{ steps.meta.outputs.version }}

Dockerfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ FROM node:22-alpine AS frontend
44
ARG GIT_COMMIT_HASH=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
55
ARG RELEASE_VERSION=v0.0.0
66

7-
ENV VITE_GIT_COMMIT_HASH $GIT_COMMIT_HASH
8-
ENV VITE_RELEASE_VERSION $RELEASE_VERSION
7+
ENV VITE_GIT_COMMIT_HASH=$GIT_COMMIT_HASH
8+
ENV VITE_RELEASE_VERSION=$RELEASE_VERSION
99

1010
RUN npm install pnpm@8 -g
1111

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
"typescript": "~5.8.3",
5858
"unplugin-auto-import": "^19.3.0",
5959
"unplugin-vue-components": "^28.7.0",
60-
"vite": "6.3.4",
60+
"vite": "^6.3.5",
6161
"vue": "^3.5.16",
6262
"vue-chartjs": "^5.3.2",
6363
"vue-i18n": "^11.1.6",

0 commit comments

Comments
 (0)