@@ -27,37 +27,98 @@ jobs:
27
27
readme-filepath : README.en.md
28
28
enable-url-completion : true
29
29
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 }}
33
41
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
36
46
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
40
52
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
45
53
- name : Login to Docker Hub
46
54
uses : docker/login-action@v3
47
55
with :
48
56
username : ${{ secrets.DOCKERHUB_USERNAME }}
49
57
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
53
65
with :
54
66
context : .
55
- push : true
67
+ platforms : ${{ matrix.platform }}
56
68
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
61
69
build-args : |
62
70
GIT_COMMIT_HASH=${{ github.sha }}
63
71
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