diff --git a/.github/workflows/snap-publish.yml b/.github/workflows/snap-publish.yml index b15616fb1..a7ba1a5ad 100644 --- a/.github/workflows/snap-publish.yml +++ b/.github/workflows/snap-publish.yml @@ -17,6 +17,11 @@ on: required: false type: string default: "" + artifact-run-id: + description: Run whose snap-linux-* artifacts are uploaded; defaults to the current run + required: false + type: string + default: "" secrets: SNAPCRAFT_STORE_CREDENTIALS: required: true @@ -119,6 +124,11 @@ jobs: snap_file="${snaps[0]}" snap_name="${snap_file%.snap}" snap_name="${snap_name%%_*}" + # Artifacts can come from another run, so confirm they were built for this tag. + if [[ -n "${INPUTS_RELEASE_TAG}" && "${snap_file}" != "${snap_name}_${INPUTS_RELEASE_TAG#v}_"* ]]; then + echo "${snap_file} was not built for ${INPUTS_RELEASE_TAG}" >&2 + exit 1 + fi component_args=() for comp in "${snap_name}"+*.comp; do component_file="${comp##*/}" diff --git a/.github/workflows/wheel-publish.yml b/.github/workflows/wheel-publish.yml index fa2ad83d0..451c6ed46 100644 --- a/.github/workflows/wheel-publish.yml +++ b/.github/workflows/wheel-publish.yml @@ -42,11 +42,46 @@ on: required: true type: string -permissions: {} +permissions: + contents: read jobs: + # Dispatch inputs are free-form, so confirm they describe a published release. + verify: + name: Verify Release Inputs + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Check tag, commit and wheels + shell: bash + env: + GH_TOKEN: ${{ github.token }} + COMMIT_SHA: ${{ inputs.source-sha }} + RELEASE_VERSION: ${{ inputs.python-version }} + RELEASE_TAG: ${{ inputs.release-tag }} + WHEEL_FILENAMES: ${{ inputs.wheel-filenames }} + run: | + set -euo pipefail + tag_sha=$(gh api "repos/${GITHUB_REPOSITORY}/commits/${RELEASE_TAG}" --jq .sha) + if [[ "${tag_sha}" != "${COMMIT_SHA}" ]]; then + echo "${RELEASE_TAG} points to ${tag_sha}, not ${COMMIT_SHA}" >&2 + exit 1 + fi + assets=$(gh release view "${RELEASE_TAG}" -R "${GITHUB_REPOSITORY}" --json assets --jq '.assets[].name') + for wheel in ${WHEEL_FILENAMES//,/ }; do + if ! grep -qxF "${wheel}" <<<"${assets}"; then + echo "${wheel} is not attached to the ${RELEASE_TAG} release" >&2 + exit 1 + fi + if [[ "${wheel}" != *"-${RELEASE_VERSION}-"* ]]; then + echo "${wheel} is not version ${RELEASE_VERSION}" >&2 + exit 1 + fi + done + trigger: name: Trigger Wheel Publish + needs: verify runs-on: [self-hosted, nv] timeout-minutes: 10 steps: