@@ -6,8 +6,11 @@ name: Release
6
6
on :
7
7
push :
8
8
tags :
9
- - " v2.*"
10
- workflow_dispatch :
9
+ - " v[0-9]+.[0-9]+.[0-9]+"
10
+ - " v[0-9]+.[0-9]+.[0-9]+-*"
11
+
12
+ env :
13
+ IMAGE_NAME : ${{ github.repository_owner }}/fabric-nodeenv
11
14
12
15
jobs :
13
16
test :
@@ -33,60 +36,101 @@ jobs:
33
36
env:
34
37
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
35
38
36
- publishdocker :
37
- runs-on : ubuntu-latest
39
+ docker-build-push :
40
+ name : Push Docker image
38
41
needs : test
42
+ runs-on : ${{ matrix.arch.runner }}
39
43
permissions :
40
44
contents : read
41
45
packages : write
46
+ strategy :
47
+ fail-fast : false
48
+ matrix :
49
+ arch :
50
+ - platform : linux-amd64
51
+ runner : ubuntu-24.04
52
+ - platform : linux-arm64
53
+ runner : ubuntu-24.04-arm
42
54
steps :
43
- - name : Set up QEMU
44
- uses : docker/setup-qemu-action@v3
45
- - name : Set up Docker Buildx
46
- uses : docker/setup-buildx-action@v3
55
+ - uses : actions/checkout@v4
56
+ - name : Get commit timestamp
57
+ run : echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}"
58
+ - name : Login to GitHub Container Registry
59
+ uses : docker/login-action@v3
47
60
with :
48
- buildkitd-flags : --debug
49
- buildkitd-config-inline : |
50
- [worker.oci]
51
- max-parallelism = 1
52
- - name : Checkout
53
- uses : actions/checkout@v4
61
+ registry : ghcr.io
62
+ username : ${{ github.actor }}
63
+ password : ${{ secrets.GITHUB_TOKEN }}
54
64
- name : Login to Docker Hub
55
- # If testing on a fork, login error may occur and can be ignored
56
- continue-on-error : true
65
+ if : ${{ github.repository_owner == 'hyperledger' }}
57
66
uses : docker/login-action@v3
58
67
with :
68
+ registry : docker.io
59
69
username : ${{ secrets.DOCKERHUB_USERNAME }}
60
70
password : ${{ secrets.DOCKERHUB_TOKEN }}
61
- - name : Login to GitHub Container Registry
71
+ - name : Set up Docker Buildx
72
+ uses : docker/setup-buildx-action@v3
73
+ - name : Build image
74
+ id : build
75
+ uses : docker/build-push-action@v6
76
+ with :
77
+ file : docker/fabric-nodeenv/Dockerfile
78
+ context : docker/fabric-nodeenv
79
+ outputs : type=registry,name=${{ env.OUTPUT_NAME }},push-by-digest=true,name-canonical=true
80
+ env :
81
+ SOURCE_DATE_EPOCH : ${{ env.SOURCE_DATE_EPOCH }}
82
+ OUTPUT_NAME : ${{ github.repository_owner == 'hyperledger' && format('ghcr.io/{0},docker.io/{0}', env.IMAGE_NAME) || format('ghcr.io/{0}', env.IMAGE_NAME) }}
83
+ - name : Export digest
84
+ run : |
85
+ mkdir -p ${{ runner.temp }}/digests
86
+ digest="${{ steps.build.outputs.digest }}"
87
+ touch "${{ runner.temp }}/digests/${digest#sha256:}"
88
+ - name : Upload digest
89
+ uses : actions/upload-artifact@v4
90
+ with :
91
+ name : digest-${{ matrix.arch.platform }}
92
+ path : ${{ runner.temp }}/digests/*
93
+ if-no-files-found : error
94
+
95
+ docker-meta :
96
+ needs : docker-build-push
97
+ name : Publish Docker metadata
98
+ runs-on : ubuntu-latest
99
+ permissions :
100
+ contents : read
101
+ packages : write
102
+ strategy :
103
+ fail-fast : false
104
+ matrix :
105
+ registry : ${{ fromJSON(github.repository_owner == 'hyperledger' && '["docker.io", "ghcr.io"]' || '["ghcr.io"]') }}
106
+ steps :
107
+ - name : Download digests
108
+ uses : actions/download-artifact@v4
109
+ with :
110
+ path : ${{ runner.temp }}/digests
111
+ pattern : digest-*
112
+ merge-multiple : true
113
+ - name : Login to ${{ matrix.registry }}
62
114
uses : docker/login-action@v3
63
115
with :
64
- registry : ghcr.io
65
- username : ${{ github.repository_owner }}
66
- password : ${{ secrets.GITHUB_TOKEN }}
67
- - name : Docker meta
116
+ registry : ${{ matrix.registry }}
117
+ username : ${{ matrix.registry == 'docker.io' && secrets.DOCKERHUB_USERNAME || github.actor }}
118
+ password : ${{ matrix.registry == 'docker.io' && secrets.DOCKERHUB_TOKEN || secrets.GITHUB_TOKEN }}
119
+ - name : Docker metadata
68
120
id : meta
69
121
uses : docker/metadata-action@v5
70
122
with :
71
- # If testing on a fork, Docker Hub publish might fail so place it last
72
- images : |
73
- ghcr.io/${{ github.repository_owner }}/fabric-nodeenv
74
- docker.io/${{ github.repository_owner }}/fabric-nodeenv
123
+ images : ${{ matrix.registry }}/${{ env.IMAGE_NAME }}
75
124
tags : |
76
125
type=semver,pattern={{version}}
77
126
type=semver,pattern={{major}}.{{minor}}
78
127
type=semver,pattern={{major}}.{{minor}}.{{patch}}
79
- - name : Get Git commit timestamps
80
- run : echo "TIMESTAMP=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV
81
- - name : Build and push image
82
- id : push
83
- uses : docker/build-push-action@v6
84
- with :
85
- platforms : linux/amd64,linux/arm64
86
- file : docker/fabric-nodeenv/Dockerfile
87
- context : docker/fabric-nodeenv
88
- tags : ${{ steps.meta.outputs.tags }}
89
- push : ${{ github.event_name != 'pull_request' }}
90
- labels : ${{ steps.meta.outputs.labels }}
91
- env :
92
- SOURCE_DATE_EPOCH : ${{ env.TIMESTAMP }}
128
+ - name : Set up Docker Buildx
129
+ uses : docker/setup-buildx-action@v3
130
+ - name : Create and push manifest list
131
+ working-directory : ${{ runner.temp }}/digests
132
+ run : |
133
+ docker buildx imagetools create $(jq -cr '.tags | map("--tag " + .) | join(" ")' <<< "${DOCKER_METADATA_OUTPUT_JSON}") \
134
+ $(printf '${{ matrix.registry }}/${{ env.IMAGE_NAME }}@sha256:%s ' *)
135
+ - name : Inspect image
136
+ run : docker buildx imagetools inspect '${{ matrix.registry }}/${{ env.IMAGE_NAME }}:${{ steps.meta.outputs.version }}'
0 commit comments