Skip to content

Commit c2f5db1

Browse files
committed
test: artifact hashes
1 parent 62267e2 commit c2f5db1

File tree

2 files changed

+77
-30
lines changed

2 files changed

+77
-30
lines changed

.github/workflows/_build.yaml

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -27,35 +27,48 @@ on:
2727
type: boolean
2828
required: true
2929
description: Enable or disable running pip_audit to check installed packages for vulnerabilities
30-
outputs:
31-
artifacts-sha256:
32-
value: ${{ jobs.build.outputs.artifacts-sha256 }}
33-
description: The hash of the artifacts
3430
permissions:
3531
contents: read
3632
env:
37-
ARTIFACT_OS: ubuntu-latest # The default OS for release.
38-
ARTIFACT_PYTHON: '3.13' # The default Python version for release.
33+
RELEASE_OS_X86_64: ubuntu-24.04 # Default OS for x86_64-compatible release artifacts.
34+
RELEASE_OS_ARM64: ubuntu-24.04-arm # Default OS for ARM64-compatible release artifacts.
35+
RELEASE_PYTHON_VERSION: '3.13' # Default Python version used for release artifacts.
3936

4037
jobs:
4138
build:
4239
# Uncomment the following to disable checks and tests for Draft pull requests.
4340
# if: github.event.pull_request.draft == false
44-
outputs:
45-
artifacts-sha256: ${{ steps.compute-hash.outputs.artifacts-sha256 }}
4641
name: Build Python ${{ matrix.python }} on ${{ matrix.os }}
4742
runs-on: ${{ matrix.os }}
4843
strategy:
4944
fail-fast: false
5045
matrix:
5146
# It is recommended to pin a Runner version specifically:
5247
# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners
53-
# os: [ubuntu-24.04, ubuntu-24.04-arm, macos-latest, windows-latest]
54-
os: [ubuntu-24.04, ubuntu-24.04-arm]
48+
os: [ubuntu-24.04, ubuntu-24.04-arm, macos-latest, windows-latest]
5549
python: ['3.10', '3.11', '3.12', '3.13']
5650

51+
outputs:
52+
arch-env: ${{ steps.set-arch-env.outputs.arch_env }}
53+
5754
steps:
5855

56+
# Create a GitHub Actions environment variable that maps a matrix.os value to a more descriptive environment
57+
# value (e.g., ubuntu-x86-64 or ubuntu-arm64).
58+
- name: Determine architecture label
59+
id: set-arch-env
60+
run: |
61+
if [[ "${{ matrix.os }}" == "ubuntu-24.04" ]]; then
62+
echo "arch_env=ubuntu-x86-64" >> "$GITHUB_OUTPUT"
63+
elif [[ "${{ matrix.os }}" == "ubuntu-24.04-arm" ]]; then
64+
echo "arch_env=ubuntu-arm64" >> "$GITHUB_OUTPUT"
65+
else
66+
echo "arch_env=unknown" >> "$GITHUB_OUTPUT"
67+
fi
68+
69+
- name: Test the env variable
70+
run: echo "Architecture-specific value ${{ steps.set-arch-env.outputs.arch_env }}"
71+
5972
- name: Harden Runner
6073
uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1
6174
with:
@@ -99,24 +112,33 @@ jobs:
99112
HYPOTHESIS_PROFILE: github
100113

101114
# Generate the requirements.txt that contains the hash digests of the dependencies and
102-
# generate the SBOM using CyclonDX SBOM generator.
115+
# generate the SBOM using CyclonDX SBOM generator for the release Python version and
116+
# supported release OS targets.
103117
- name: Generate requirements.txt and SBOM
104-
if: matrix.python == env.ARTIFACT_PYTHON
118+
if: >
119+
matrix.python == env.RELEASE_PYTHON_VERSION &&
120+
(matrix.os == env.RELEASE_OS_X86_64 || matrix.os == env.RELEASE_OS_ARM64)
105121
run: make requirements sbom
106122

107123
# Remove the old requirements.txt file (which includes _all_ packages) and generate a
108-
# new one for the package and its actual and required dependencies only.
124+
# new one for the package and its actual and required dependencies only. Run this step
125+
# for the release Python version and supported release OS targets only.
109126
- name: Prune packages and generate required requirements.txt
110-
if: matrix.python == env.ARTIFACT_PYTHON
127+
if: >
128+
matrix.python == env.RELEASE_PYTHON_VERSION &&
129+
(matrix.os == env.RELEASE_OS_X86_64 || matrix.os == env.RELEASE_OS_ARM64)
111130
run: |
112131
rm requirements.txt
113132
make prune requirements
114133
115134
# Find the paths to the artifact files that will be included in the release, compute
116135
# the SHA digest for all the release files and encode them using Base64, and export it
117-
# from this job.
136+
# from this job. Run this step for the release Python version and supported release
137+
# OS targets only.
118138
- name: Compute package hash
119-
if: matrix.python == env.ARTIFACT_PYTHON
139+
if: >
140+
matrix.python == env.RELEASE_PYTHON_VERSION &&
141+
(matrix.os == env.RELEASE_OS_X86_64 || matrix.os == env.RELEASE_OS_ARM64)
120142
id: compute-hash
121143
shell: bash
122144
run: |
@@ -131,15 +153,28 @@ jobs:
131153
sha256sum --version
132154
DIGEST=$(sha256sum "$TARBALL_PATH" "$WHEEL_PATH" "$REQUIREMENTS_PATH" "$SBOM_PATH" "$HTML_DOCS_PATH" "$MARKDOWN_DOCS_PATH" "$BUILD_EPOCH_PATH" | base64 -w0)
133155
echo "Digest of artifacts is $DIGEST."
134-
echo "artifacts-sha256=$DIGEST" >> "$GITHUB_OUTPUT"
156+
echo "$DIGEST" > artifacts-sha256-file-${{ steps.set-arch-env.outputs.arch_env }}
135157
136-
# For now only generate artifacts for the specified OS and Python version in env variables.
137158
# Currently reusable workflows do not support setting strategy property from the caller workflow.
159+
# Run this step for the release Python version and supported release OS targets only.
138160
- name: Upload the package artifact for debugging and release
139-
if: matrix.python == env.ARTIFACT_PYTHON
161+
if: >
162+
matrix.python == env.RELEASE_PYTHON_VERSION &&
163+
(matrix.os == env.RELEASE_OS_X86_64 || matrix.os == env.RELEASE_OS_ARM64)
140164
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
141165
with:
142-
name: artifact-${{ matrix.os }}-python-${{ matrix.python }}
143-
path: dist
166+
name: artifacts-${{ steps.set-arch-env.outputs.arch_env }}
167+
path: ./dist*/
144168
if-no-files-found: error
145169
retention-days: 7
170+
171+
# Run this step for the release Python version and supported release OS targets only.
172+
- name: Upload artifacts-sha256
173+
if: >
174+
matrix.python == env.RELEASE_PYTHON_VERSION &&
175+
(matrix.os == env.RELEASE_OS_X86_64 || matrix.os == env.RELEASE_OS_ARM64)
176+
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
177+
with:
178+
name: artifacts-sha256-file-${{ steps.set-arch-env.outputs.arch_env }}
179+
path: artifacts-sha256-file-${{ steps.set-arch-env.outputs.arch_env }}
180+
retention-days: 7

.github/workflows/pr-change-set.yaml

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,30 @@ jobs:
3838
- name: Download artifact
3939
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
4040
with:
41-
path: dist
42-
merge-multiple: true
41+
path: downloads
4342

4443
# Verify hashes by first computing hashes for the artifacts and then comparing them
4544
# against the hashes computed by the build job.
4645
- name: Verify the artifact hash
47-
env:
48-
ARTIFACT_HASH: ${{ needs.build.outputs.artifacts-sha256 }}
4946
run: |
5047
set -euo pipefail
51-
echo "Hash of package should be $ARTIFACT_HASH."
52-
echo "Decoding the artifact hash:"
53-
ls dist
54-
echo "$ARTIFACT_HASH" | base64 --decode
55-
echo "$ARTIFACT_HASH" | base64 --decode | sha256sum --strict --check --status || exit 1
48+
cd downloads
49+
for ARCH in "ubuntu-x86-64" "ubuntu-arm64"; do
50+
HASH_DIR="artifacts-sha256-file-${ARCH}"
51+
ARTIFACT_DIR="artifacts-${ARCH}"
52+
HASH_FILE="${HASH_DIR}/artifacts-sha256-file-${ARCH}"
53+
54+
echo "Verifying artifacts for ${ARCH}"
55+
echo "Decoding expected SHA256 digest:"
56+
DECODED_HASH=$(base64 --decode "${HASH_FILE}")
57+
echo "$DECODED_HASH"
58+
59+
cd "${ARTIFACT_DIR}"
60+
echo "$DECODED_HASH" | sha256sum --strict --check --status || {
61+
echo "Hash verification failed for ${ARCH}!"
62+
exit 1
63+
}
64+
cd - > /dev/null
65+
66+
echo "Hash verified successfully for ${ARCH}"
67+
done

0 commit comments

Comments
 (0)