2020 DOCKER_PUBLIC_REPOSITORY : nethermind/catalyst-node
2121 DOCKER_REGISTRY : nethermind.jfrog.io
2222 DOCKER_REPOSITORY_STAGING : core-oci-local-staging/catalyst-node
23+ MASTER_BRANCH : refs/heads/master
2324
2425jobs :
2526 build :
5051 - name : Set up Docker Buildx
5152 uses : docker/setup-buildx-action@v3
5253
53- - uses : docker/login-action@v3
54+ - name : Login to JFrog Artifactory
55+ uses : docker/login-action@v3
5456 with :
5557 registry : ${{ env.DOCKER_REGISTRY }}
5658 username : ${{ secrets.ARTIFACTORY_CORE_USERNAME }}
@@ -69,19 +71,15 @@ jobs:
6971 - name : Set digest output
7072 id : digest
7173 run : |
72- if [ "${{ matrix.short }}" = "amd64" ]; then
73- echo "amd64=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT
74- fi
75- if [ "${{ matrix.short }}" = "arm64" ]; then
76- echo "arm64=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT
77- fi
74+ echo "${{ matrix.short }}=${{ steps.build.outputs.digest }}" >> $GITHUB_OUTPUT
7875
7976 merge :
8077 name : Merge and push multi-arch manifest
8178 runs-on : ubuntu-latest
8279 needs : build
8380 steps :
84- - uses : docker/login-action@v3
81+ - name : Login to JFrog Artifactory
82+ uses : docker/login-action@v3
8583 with :
8684 registry : ${{ env.DOCKER_REGISTRY }}
8785 username : ${{ secrets.ARTIFACTORY_CORE_USERNAME }}
@@ -90,95 +88,102 @@ jobs:
9088 - name : Set up Docker Buildx
9189 uses : docker/setup-buildx-action@v3
9290
93- - name : Determine event type and set tags
94- id : event
91+ - name : Calculate SHA tag
92+ id : sha
9593 run : |
96- if [[ "${{ github.ref }}" == refs/tags/* ]]; then
97- echo "is_tag=true" >> $GITHUB_OUTPUT
98- echo "is_branch=false" >> $GITHUB_OUTPUT
99- VERSION=${GITHUB_REF#refs/tags/}
100- echo "version=$VERSION" >> $GITHUB_OUTPUT
101- echo "tag_list=type=raw,value=$VERSION" >> $GITHUB_OUTPUT
102- else
103- echo "is_tag=false" >> $GITHUB_OUTPUT
104- echo "is_branch=true" >> $GITHUB_OUTPUT
94+ SHORT_SHA="${{ github.sha }}"
95+ SHORT_SHA=${SHORT_SHA:0:7}
96+ echo "tag=sha-${SHORT_SHA}" >> $GITHUB_OUTPUT
97+ echo "short=${SHORT_SHA}" >> $GITHUB_OUTPUT
98+
99+ - name : Determine tags and event type
100+ id : tags
101+ run : |
102+ REF="${{ github.ref }}"
103+ IS_MASTER=false
104+ IS_TAG=false
105+ VERSION_TAG=""
106+ PROMOTE_TAGS=""
107+
108+ if [[ "$REF" == refs/tags/* ]]; then
109+ IS_TAG=true
110+ VERSION_TAG=${REF#refs/tags/}
111+ PROMOTE_TAGS="$VERSION_TAG ${{ steps.sha.outputs.tag }}"
112+ echo "tag_list=type=raw,value=$VERSION_TAG" >> $GITHUB_OUTPUT
113+ elif [[ "$REF" == ${{ env.MASTER_BRANCH }} ]]; then
114+ IS_MASTER=true
115+ PROMOTE_TAGS="latest ${{ steps.sha.outputs.tag }}"
105116 echo "tag_list=type=raw,value=latest" >> $GITHUB_OUTPUT
117+ else
118+ PROMOTE_TAGS="${{ steps.sha.outputs.tag }}"
119+ echo "tag_list=type=sha,value=${{ github.sha }}" >> $GITHUB_OUTPUT
106120 fi
107121
108- - name : Docker meta
122+ echo "is_master=$IS_MASTER" >> $GITHUB_OUTPUT
123+ echo "is_tag=$IS_TAG" >> $GITHUB_OUTPUT
124+ echo "version_tag=$VERSION_TAG" >> $GITHUB_OUTPUT
125+ echo "promote_tags=$PROMOTE_TAGS" >> $GITHUB_ENV
126+
127+ - name : Generate Docker metadata
109128 id : meta
110129 uses : docker/metadata-action@v5
111130 with :
112131 images : ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_REPOSITORY_STAGING }}
113- tags : ${{ steps.event .outputs.tag_list }}
132+ tags : ${{ steps.tags .outputs.tag_list }}
114133
115- - name : Create manifest list and push
134+ - name : Create and push manifest list
116135 run : |
117- docker buildx imagetools create \
118- $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
119- ${{ needs.build.outputs.digest-amd64 }} \
120- ${{ needs.build.outputs.digest-arm64 }}
136+ # Filter out "latest" tag if not on master branch
137+ if [[ "${{ steps.tags.outputs.is_master }}" != "true" ]]; then
138+ FILTERED_TAGS=$(jq -cr '.tags | map(select(. | endswith(":latest") | not)) | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON")
139+ else
140+ FILTERED_TAGS=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON")
141+ fi
142+
143+ if [ -n "$FILTERED_TAGS" ]; then
144+ docker buildx imagetools create \
145+ $FILTERED_TAGS \
146+ ${{ needs.build.outputs.digest-amd64 }} \
147+ ${{ needs.build.outputs.digest-arm64 }}
148+ fi
121149
122150 - name : Tag with commit SHA
123151 run : |
124- SHORT_SHA="${{ github.sha }}"
125- SHORT_SHA=${SHORT_SHA:0:7}
126- SHA_TAG="sha-${SHORT_SHA}"
127152 docker buildx imagetools create \
128- -t ${DOCKER_REGISTRY} /${DOCKER_REPOSITORY_STAGING} :${SHA_TAG } \
153+ -t ${{ env. DOCKER_REGISTRY }} /${{ env. DOCKER_REPOSITORY_STAGING }} :${{ steps.sha.outputs.tag } } \
129154 ${{ needs.build.outputs.digest-amd64 }} \
130155 ${{ needs.build.outputs.digest-arm64 }}
131156
132157 - name : Setup ORAS
133158 uses : oras-project/setup-oras@v1
134159
135- - name : Check ORAS version
136- run : oras version
137-
138- - name : Determine tags to promote
139- id : promote-tags
140- run : |
141- SHORT_SHA="${{ github.sha }}"
142- SHORT_SHA=${SHORT_SHA:0:7}
143- SHA_TAG="sha-${SHORT_SHA}"
144- if [[ "${{ github.ref }}" == refs/tags/* ]]; then
145- VERSION=${GITHUB_REF#refs/tags/}
146- echo "TAGS=$VERSION $SHA_TAG" >> $GITHUB_ENV
147- else
148- echo "TAGS=latest $SHA_TAG" >> $GITHUB_ENV
149- fi
150-
151- - name : Login to Dockerhub registry with ORAS
160+ - name : Login to Docker Hub
152161 run : |
153162 oras login ${{ env.DOCKER_PUBLIC_REGISTRY }} \
154163 -u ${{ secrets.DOCKER_USERNAME }} \
155164 -p ${{ secrets.DOCKER_PASSWORD }}
156165
157- - name : Promote to Dockerhub Production
166+ - name : Promote to Docker Hub Production
158167 run : |
159168 set -e
160- for tag in $TAGS; do
161- echo "Current tag: $tag"
162- source_image="${DOCKER_REGISTRY}/${DOCKER_REPOSITORY_STAGING}:${tag}"
163- prod_image="${DOCKER_PUBLIC_REGISTRY}/${DOCKER_PUBLIC_REPOSITORY}:${tag}"
169+ for tag in $PROMOTE_TAGS; do
170+ source_image="${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_REPOSITORY_STAGING }}:${tag}"
171+ prod_image="${{ env.DOCKER_PUBLIC_REGISTRY }}/${{ env.DOCKER_PUBLIC_REPOSITORY }}:${tag}"
164172 echo "Promoting ${source_image} to ${prod_image}"
165- if ! oras cp -r "${source_image}" "${prod_image}"; then
166- echo "Error: Failed to promote tag ${tag}" >&2
167- exit 1
168- fi
173+ oras cp -r "${source_image}" "${prod_image}"
169174 done
170175
171176 - name : Summary
172177 run : |
173178 echo "## Catalyst Node Docker build Completed" >> $GITHUB_STEP_SUMMARY
174- echo "### Tags" >> $GITHUB_STEP_SUMMARY
175- for tag in $TAGS; do
176- echo "- $tag" >> $GITHUB_STEP_SUMMARY
179+ echo "" >> $GITHUB_STEP_SUMMARY
180+ echo "### Tags Promoted" >> $GITHUB_STEP_SUMMARY
181+ for tag in $PROMOTE_TAGS; do
182+ echo "- \`${tag}\`" >> $GITHUB_STEP_SUMMARY
177183 done
178- echo "### Notes " >> $GITHUB_STEP_SUMMARY
179- echo "- The images have been pushed to ${DOCKER_REPOSITORY_STAGING} repo " >> $GITHUB_STEP_SUMMARY
180- echo "- **STAGING Repository **: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_REPOSITORY_STAGING }}" >> $GITHUB_STEP_SUMMARY
181- echo "- **PROD Repository **: ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_PUBLIC_REGISTRY }}" >> $GITHUB_STEP_SUMMARY
184+ echo "" >> $GITHUB_STEP_SUMMARY
185+ echo "### Repository Information " >> $GITHUB_STEP_SUMMARY
186+ echo "- **Staging **: \` ${{ env.DOCKER_REGISTRY }}/${{ env.DOCKER_REPOSITORY_STAGING }}\` " >> $GITHUB_STEP_SUMMARY
187+ echo "- **Production **: \` ${{ env.DOCKER_PUBLIC_REGISTRY }}/${{ env.DOCKER_PUBLIC_REPOSITORY }}\` " >> $GITHUB_STEP_SUMMARY
182188 echo "- **Platforms**: linux/amd64, linux/arm64" >> $GITHUB_STEP_SUMMARY
183- echo "- **Commit**: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY
184-
189+ echo "- **Commit**: \`${{ github.sha }}\` (\`${{ steps.sha.outputs.short }}\`)" >> $GITHUB_STEP_SUMMARY
0 commit comments