8383 runs-on : self-hosted-linux-amd64-noble-private-endpoint-small
8484 name : Release
8585 needs : [validate-push-release-request]
86+ concurrency :
87+ group : release-${{ inputs.oci-image-name }}
88+ cancel-in-progress : false
8689 outputs :
87- gh-releases-matrix : ${{ steps.release-image.outputs.gh-releases-matrix }}
90+ gh-releases-matrix : ${{ steps.release-image.outputs.gh-releases-matrix || '{"include":[]}' }}
91+ has-github-releases : ${{ steps.release-image.outputs.has-github-releases }}
8892 is-public-release : ${{ steps.release-type.outputs.is-public-release }}
8993 is-pro-release : ${{ steps.release-type.outputs.is-pro-release }}
9094 env :
@@ -127,8 +131,19 @@ jobs:
127131 echo "is-pro-release=$is_pro_release" >> "$GITHUB_OUTPUT"
128132 is_public_release=$(cat is_public_release.txt)
129133 echo "is-public-release=$is_public_release" >> "$GITHUB_OUTPUT"
134+ if [[ "$is_pro_release" == "true" && -z "${INPUTS_IMAGE_TRIGGER_CACHE_KEY}" ]]; then
135+ log_error "Releasing an existing Pro revision is not supported. Use upload[*].release during the build instead."
136+ exit 1
137+ fi
138+ # Error out if passphrase is not set for Pro release
139+ if [[ "$is_pro_release" == "true" && -z "${ROCKS_PRO_ARTIFACT_PASSPHRASE}" ]]; then
140+ log_error "ROCKS_PRO_ARTIFACT_PASSPHRASE is required for a Pro release."
141+ exit 1
142+ fi
130143 env :
144+ INPUTS_IMAGE_TRIGGER_CACHE_KEY : ${{ inputs.image-trigger-cache-key }}
131145 INPUTS_OCI_IMAGE_NAME : ${{ inputs.oci-image-name }}
146+ ROCKS_PRO_ARTIFACT_PASSPHRASE : ${{ secrets.ROCKS_PRO_ARTIFACT_PASSPHRASE }}
132147
133148 # Download the image if `pro-release` is present and non-empty in the image trigger.
134149 # pattern should match <image_name>_<version>-<base>_*, e.g., mock-rock_1.2-22.04_*
@@ -139,7 +154,7 @@ jobs:
139154 env :
140155 INPUTS_OCI_IMAGE_NAME : ${{ inputs.oci-image-name }}
141156 with :
142- pattern : +([A-Za-z0-9-])_+([A-Za-z0-9.-])-[0-9][0-9].[0-9][0-9]_+([0-9])
157+ pattern : ${{ inputs.oci-image-name }}_*
143158 merge-multiple : true
144159
145160 # Decrypt the Pro image artifact being downloaded.
@@ -148,22 +163,28 @@ jobs:
148163 - name : Decrypt Pro image artifact
149164 id : decrypt-pro-image-artifact
150165 if : ${{ steps.release-type.outputs.is-pro-release == 'true' }}
166+ env :
167+ ARTIFACT_PASSPHRASE : ${{ secrets.ROCKS_PRO_ARTIFACT_PASSPHRASE }}
168+ ARTIFACT_PATH : ${{ steps.download-image-artifact.outputs.download-path }}
151169 run : |
152170 set -e
153171 if [[ "$RUNNER_DEBUG" == "1" ]]; then
154172 set -x
155173 fi
156174 source src/shared/logs.sh
157- artifact_path="${{ steps.download-image-artifact.outputs.download-path }}"
158- for artifact in $artifact_path/*.gpg; do
159- if [ -f "$artifact" ]; then
160- log_info "Decrypting artifact: $artifact"
161- ./.github/actions/crypt-artifact/crypt-artifact.sh decrypt \
162- -i "$artifact" \
163- -p "${{ secrets.ROCKS_PRO_ARTIFACT_PASSPHRASE }}"
164- else
165- log_info "No .gpg artifacts found to decrypt."
166- fi
175+
176+ shopt -s nullglob
177+ artifacts=("${ARTIFACT_PATH}"/*.gpg)
178+ if [[ ${#artifacts[@]} -eq 0 ]]; then
179+ log_error "No encrypted Pro artifacts were downloaded."
180+ exit 1
181+ fi
182+
183+ for artifact in "${artifacts[@]}"; do
184+ log_info "Decrypting artifact: $artifact"
185+ ./.github/actions/crypt-artifact/crypt-artifact.sh decrypt \
186+ -i "$artifact" \
187+ -p "$ARTIFACT_PASSPHRASE"
167188 done
168189
169190 - uses : actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405
@@ -191,6 +212,44 @@ jobs:
191212 IMAGE_NAME : ${{ inputs.oci-image-name }}
192213 SWIFT_CONTAINER_NAME : ${{ vars.SWIFT_CONTAINER_NAME }}
193214 run : ./src/image/get_canonical_tags_from_swift.sh
215+
216+ - name : Validate release requests
217+ env :
218+ ACR_CREDS_USR : ${{ env.IS_PROD == 'true' && secrets.ACR_CREDS_USR || secrets.ACR_CREDS_USR_DEV }}
219+ ACR_CREDS_PSW : ${{ env.IS_PROD == 'true' && secrets.ACR_CREDS_PSW || secrets.ACR_CREDS_PSW_DEV }}
220+ ACR_REGISTRY : ${{ env.IS_PROD == 'true' && 'ubuntu.azurecr.io' || secrets.ACR_REGISTRY_DEV }}
221+ INPUTS_OCI_IMAGE_NAME : ${{ inputs.oci-image-name }}
222+ IS_PRO_RELEASE : ${{ steps.release-type.outputs.is-pro-release }}
223+ IS_PUBLIC_RELEASE : ${{ steps.release-type.outputs.is-public-release }}
224+ PYTHONUNBUFFERED : 1
225+ REVISION_TAGS_FILE : ${{ steps.get-all-canonical-tags.outputs.canonical-tags-file }}
226+ run : |
227+ set -e
228+ source src/shared/logs.sh
229+
230+ if [[ "$IS_PRO_RELEASE" == "true" ]]; then
231+ if [[ -z "${ACR_CREDS_USR:-}" || -z "${ACR_CREDS_PSW:-}" || -z "${ACR_REGISTRY:-}" ]]; then
232+ log_error "ACR registry and credentials are required for a Pro release."
233+ exit 1
234+ fi
235+ python3 -m src.image.release \
236+ --image-trigger "oci/${INPUTS_OCI_IMAGE_NAME}/image.yaml" \
237+ --image-name "$INPUTS_OCI_IMAGE_NAME" \
238+ --all-releases "oci/${INPUTS_OCI_IMAGE_NAME}/_pro_releases.json" \
239+ --all-revision-tags "$REVISION_TAGS_FILE" \
240+ --pro \
241+ --validate-only
242+ fi
243+
244+ if [[ "$IS_PUBLIC_RELEASE" == "true" ]]; then
245+ python3 -m src.image.release \
246+ --image-trigger "oci/${INPUTS_OCI_IMAGE_NAME}/image.yaml" \
247+ --image-name "$INPUTS_OCI_IMAGE_NAME" \
248+ --all-releases "oci/${INPUTS_OCI_IMAGE_NAME}/_releases.json" \
249+ --all-revision-tags "$REVISION_TAGS_FILE" \
250+ --ghcr-repo "${{ github.repository_owner }}/oci-factory" \
251+ --validate-only
252+ fi
194253
195254 # Pull the latest changes to prevent conflicts merging _releases.json
196255 - run : pushd ${{ env.RELEASE_REPO_DIR }} && git pull --quiet && popd
@@ -225,7 +284,6 @@ jobs:
225284 fi
226285 source src/shared/logs.sh
227286 log_info "Running in production? $([[ "$IS_PROD" == "true" ]] && echo YES || echo NO)"
228-
229287 python3 -m src.image.release \
230288 --image-trigger oci/${INPUTS_OCI_IMAGE_NAME}/image.yaml \
231289 --image-name ${INPUTS_OCI_IMAGE_NAME} \
@@ -251,11 +309,15 @@ jobs:
251309 fi
252310 source src/shared/logs.sh
253311 log_info "Running in production? $([[ "$IS_PROD" == "true" ]] && echo YES || echo NO)"
254-
312+ if [[ -z "${ACR_CREDS_USR:-}" || -z "${ACR_CREDS_PSW:-}" || -z "${ACR_REGISTRY:-}" ]]; then
313+ log_error "ACR registry and credentials are required for a Pro release."
314+ exit 1
315+ fi
316+
255317 python3 -m src.image.release \
256318 --image-trigger oci/${INPUTS_OCI_IMAGE_NAME}/image.yaml \
257319 --image-name ${INPUTS_OCI_IMAGE_NAME} \
258- --all-releases oci/${INPUTS_OCI_IMAGE_NAME}/_releases .json \
320+ --all-releases oci/${INPUTS_OCI_IMAGE_NAME}/_pro_releases .json \
259321 --all-revision-tags "${STEPS_GET_ALL_CANONICAL_TAGS_OUTPUTS_CANONICAL_TAGS_FILE}" \
260322 --pro
261323
@@ -329,6 +391,7 @@ jobs:
329391 runs-on : ubuntu-22.04
330392 name : Github-Release
331393 needs : [do-releases]
394+ if : ${{ needs.do-releases.outputs.has-github-releases == 'true' }}
332395 permissions :
333396 contents : write
334397 strategy :
@@ -343,7 +406,7 @@ jobs:
343406
344407 - uses : actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
345408 with :
346- pattern : ' * .sbom_preview.spdx.zip'
409+ pattern : ' ${{ matrix.canonical-tag }} .sbom_preview.spdx.zip'
347410 path : sbom
348411
349412 - name : Unzip SBOM artifacts
0 commit comments