@@ -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 }}
0 commit comments