-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Test wheel builds during PR CI on demand
Refactor the wheels-build and deployment workflow into one re-usable "build wheels" workflow and two orchestration workflows. The orchestration workflows are the existing "tag push" event, which also deploys the wheels to PyPI, and a new "PR" trigger that runs the all-wheels build if the PR is labelled with `ci: test wheels`. PGO can be turned on or off based on the workflow inputs. The deployment job is slightly reorganised so that all the "core" platforms build and deploy before the less common platforms even begin the build. The core platforms are all tier 1 platforms, the 32-bit platforms, and the sdist. These core platforms were already tied together, but the other platforms ran concurrently with them. This could lead to other projects' CI failing when Qiskit was part way through a deployment. The "other" wheels are all tied together in this PR mostly as a convenience to avoid repetition. They could easily be untied from each other (as the parent commit does).
- Loading branch information
1 parent
2e67cec
commit 78f9157
Showing
4 changed files
with
313 additions
and
194 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,247 @@ | ||
name: Build release artifacts | ||
on: | ||
workflow_call: | ||
inputs: | ||
default-action: | ||
description: >- | ||
The default action for each artifact. | ||
Choose from 'build' (default) or 'skip'. | ||
type: string | ||
default: "build" | ||
required: false | ||
|
||
sdist: | ||
description: >- | ||
The action to take for the sdist. | ||
Choose from 'default', 'build' or 'skip'. | ||
type: string | ||
default: "default" | ||
required: false | ||
|
||
wheels-tier-1: | ||
description: >- | ||
The action to take for Tier 1 wheels. | ||
Choose from 'default', 'build' or 'skip'. | ||
This builds multiple artifacts, which all match 'wheels-tier-1-*'. | ||
type: string | ||
default: "default" | ||
required: false | ||
|
||
wheels-32bit: | ||
description: >- | ||
The action to take for Tier 1 wheels. | ||
Choose from 'default', 'build' or 'skip'. | ||
This builds multiple artifacts, which all match 'wheels-32bit-*'. | ||
type: string | ||
default: "default" | ||
required: false | ||
|
||
wheels-linux-s390x: | ||
description: >- | ||
The action to take for Linux s390x wheels. | ||
Choose from 'default', 'build' or 'skip'. | ||
type: string | ||
default: "default" | ||
required: false | ||
|
||
wheels-linux-ppc64le: | ||
description: >- | ||
The action to take for Linux ppc64le wheels. | ||
Choose from 'default', 'build' or 'skip'. | ||
type: string | ||
default: "default" | ||
required: false | ||
|
||
wheels-linux-aarch64: | ||
description: >- | ||
The action to take for Linux AArch64 wheels. | ||
Choose from 'default', 'build' or 'skip'. | ||
type: string | ||
default: "default" | ||
required: false | ||
|
||
artifact-prefix: | ||
description: "A prefix to give all artifacts uploaded with 'actions/upload-artifact'." | ||
type: string | ||
default: "" | ||
required: false | ||
|
||
python-version: | ||
description: "The Python version to use to host the build runner." | ||
type: string | ||
default: "3.10" | ||
required: false | ||
|
||
pgo: | ||
description: "Whether to enable profile-guided optimizations for supported platforms." | ||
type: boolean | ||
default: true | ||
required: false | ||
|
||
|
||
jobs: | ||
wheels-tier-1: | ||
name: "Wheels / Tier 1" | ||
if: (inputs.wheels-tier-1 == 'default' && inputs.default-action || inputs.wheels-tier-1) == 'build' | ||
runs-on: ${{ matrix.os }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
os: | ||
- ubuntu-latest | ||
# Used for the x86_64 builds. | ||
- macos-12 | ||
# Used for the ARM builds. | ||
- macos-14 | ||
- windows-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: actions/setup-python@v5 | ||
with: | ||
python-version: ${{ inputs.python-version }} | ||
architecture: ${{ matrix.os == 'macos-14' && 'arm64' || 'x64' }} | ||
- uses: dtolnay/rust-toolchain@stable | ||
with: | ||
components: llvm-tools-preview | ||
- name: Configure PGO | ||
shell: bash | ||
if: inputs.pgo | ||
# The `$GITHUB_ENV` magic file uses some sort of custom parsing, so the variables shouldn't | ||
# be quoted like they would be if bash were interpreting them. You still need to use quotes | ||
# to avoid word splitting where appropriate in compound environment variables. | ||
# | ||
# Beware that the heredoc is configured to expand bash variables, but cibuildwheel has | ||
# special handling for certain variables (`$PATH`, in particular), so you may need to escape | ||
# some dollar signs to pass those through to cibuildwheel as variables, or use single quotes | ||
# to prevent shell expansion. | ||
run: | | ||
set -e | ||
mkdir -p "$PGO_WORK_DIR" | ||
cat >>"$GITHUB_ENV" <<EOF | ||
CIBW_BEFORE_BUILD=bash ./tools/build_pgo.sh $PGO_WORK_DIR $PGO_OUT_PATH | ||
CIBW_ENVIRONMENT=RUSTUP_TOOLCHAIN=stable RUSTFLAGS='-Cprofile-use=$PGO_OUT_PATH -Cllvm-args=-pgo-warn-missing-function' | ||
CIBW_ENVIRONMENT_LINUX=RUSTUP_TOOLCHAIN=stable RUSTFLAGS='-Cprofile-use=$PGO_OUT_PATH -Cllvm-args=-pgo-warn-missing-function' PATH="\$PATH:\$HOME/.cargo/bin" CARGO_NET_GIT_FETCH_WITH_CLI="true" | ||
EOF | ||
env: | ||
PGO_WORK_DIR: ${{ github.workspace }}/pgo-data | ||
PGO_OUT_PATH: ${{ github.workspace }}/merged.profdata | ||
- uses: pypa/[email protected] | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
path: ./wheelhouse/*.whl | ||
name: ${{ inputs.artifact-prefix }}wheels-tier-1-${{ matrix.os }} | ||
|
||
wheels-32bit: | ||
name: "Wheels / 32bit" | ||
if: (inputs.wheels-32bit == 'default' && inputs.default-action || inputs.wheels-32bit) == 'build' | ||
runs-on: ${{ matrix.os }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
os: | ||
- ubuntu-latest | ||
- windows-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: actions/setup-python@v5 | ||
with: | ||
python-version: ${{ inputs.python-version }} | ||
- uses: dtolnay/rust-toolchain@stable | ||
with: | ||
components: llvm-tools-preview | ||
- name: Build wheels | ||
uses: pypa/[email protected] | ||
env: | ||
CIBW_SKIP: 'pp* cp36-* cp37-* cp38-* *musllinux* *amd64 *x86_64' | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
path: ./wheelhouse/*.whl | ||
name: ${{ inputs.artifact-prefix }}wheels-32bit-${{ matrix.os }} | ||
|
||
wheels-linux-s390x: | ||
name: "Wheels / Linux s390x" | ||
if: (inputs.wheels-linux-s390x == 'default' && inputs.default-action || inputs.wheels-linux-s390x) == 'build' | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: actions/setup-python@v5 | ||
name: Install Python | ||
with: | ||
python-version: ${{ inputs.python-version }} | ||
- uses: dtolnay/rust-toolchain@stable | ||
- uses: docker/setup-qemu-action@v3 | ||
with: | ||
platforms: all | ||
- uses: pypa/[email protected] | ||
env: | ||
CIBW_ARCHS_LINUX: s390x | ||
CIBW_TEST_SKIP: "cp*" | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
path: ./wheelhouse/*.whl | ||
name: ${{ inputs.artifact-prefix }}wheels-linux-s390x | ||
|
||
wheels-linux-ppc64le: | ||
name: "Wheels / Linux ppc64le" | ||
if: (inputs.wheels-linux-ppc64le == 'default' && inputs.default-action || inputs.wheels-linux-ppc64le) == 'build' | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: actions/setup-python@v5 | ||
name: Install Python | ||
with: | ||
python-version: ${{ inputs.python-version }} | ||
- uses: dtolnay/rust-toolchain@stable | ||
- uses: docker/setup-qemu-action@v3 | ||
with: | ||
platforms: all | ||
- uses: pypa/[email protected] | ||
env: | ||
CIBW_ARCHS_LINUX: ppc64le | ||
CIBW_TEST_SKIP: "cp*" | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
path: ./wheelhouse/*.whl | ||
name: ${{ inputs.artifact-prefix }}wheels-linux-ppc64le | ||
|
||
wheels-linux-aarch64: | ||
name: "Wheels / Linux AArch64" | ||
if: (inputs.wheels-linux-aarch64 == 'default' && inputs.default-action || inputs.wheels-linux-aarch64) == 'build' | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: actions/setup-python@v5 | ||
with: | ||
python-version: ${{ inputs.python-version }} | ||
- uses: dtolnay/rust-toolchain@stable | ||
- uses: docker/setup-qemu-action@v3 | ||
with: | ||
platforms: all | ||
- uses: pypa/[email protected] | ||
env: | ||
CIBW_ARCHS_LINUX: aarch64 | ||
CIBW_TEST_COMMAND: cp -r {project}/test . && QISKIT_PARALLEL=FALSE stestr --test-path test/python run --abbreviate -n test.python.compiler.test_transpiler | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
path: ./wheelhouse/*.whl | ||
name: ${{ inputs.artifact-prefix }}wheels-linux-aarch64 | ||
|
||
sdist: | ||
name: "sdist" | ||
if: (inputs.sdist == 'default' && inputs.default-action || inputs.sdist) == 'build' | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v4 | ||
- uses: actions/setup-python@v5 | ||
with: | ||
python-version: ${{ inputs.python-version }} | ||
- name: Build sdist | ||
run: | | ||
set -e | ||
python -m pip install -U build | ||
python -m build --sdist . | ||
- uses: actions/upload-artifact@v4 | ||
with: | ||
path: ./dist/*.tar.gz | ||
name: ${{ inputs.artifact-prefix }}sdist |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
name: Build wheels | ||
|
||
on: | ||
pull_request: | ||
types: | ||
- opened | ||
- synchronize | ||
- reopened | ||
# Above are the defaults for the PR trigger, below are our insertions. | ||
# Trigger on 'labeled' so we catch the initial manual labelling event. | ||
- labeled | ||
|
||
concurrency: | ||
group: ${{ github.repository }}-${{ github.ref_name }}-${{ github.workflow }} | ||
cancel-in-progress: true | ||
|
||
jobs: | ||
test-wheels: | ||
name: Build | ||
if: '${{ contains(github.event.pull_request.labels.*.name, ''ci: test wheels'') }}' | ||
uses: './.github/workflows/wheels-build.yml' | ||
with: | ||
default-action: "build" |
Oops, something went wrong.