Skip to content

cd-wheel

cd-wheel #176

Workflow file for this run

name: cd-wheel
permissions:
contents: read
on: # yamllint disable-line rule:truthy
workflow_call:
inputs:
repository:
description: 'mpi4py repository'
default: mpi4py/mpi4py
required: false
type: string
ref:
description: 'mpi4py ref'
default: ''
required: false
type: string
os-arch:
description: 'Target OS-Architecture'
default: ''
required: false
type: string
python-tag:
description: "CPython/PyPy tag ({cp,pp}3{7..13})"
default: ''
required: false
type: string
skip-tag:
description: "Skip build tags"
default: ''
required: false
type: string
workflow_dispatch:
inputs:
repository:
description: 'mpi4py repository'
default: mpi4py/mpi4py
required: true
type: string
ref:
description: 'mpi4py ref'
default: ''
required: false
type: string
os-arch:
description: "Target OS-Architecture"
default: Linux-x86_64
required: true
type: choice
options:
- Linux
- Linux-x86_64
- Linux-aarch64
- Linux-ppc64le
- macOS
- macOS-x86_64
- macOS-arm64
- Windows
- Windows-AMD64
python-tag:
description: "CPython/PyPy tag ({cp,pp}3{7..13})"
default: ''
required: false
type: string
skip-tag:
description: "Skip build tags"
default: ''
required: false
type: string
jobs:
setup:
runs-on: 'ubuntu-latest'
outputs:
matrix-build: ${{ steps.setup.outputs.matrix-build }}
matrix-merge: ${{ steps.setup.outputs.matrix-merge }}
os-arch-list: ${{ steps.setup.outputs.os-arch-list }}
steps:
- uses: actions/checkout@v4
- id: setup
run: |
# build matrix
python -u .cibw/setup-build.py \
--os ${{ inputs.os-arch }} \
--py ${{ inputs.python-tag }} \
>> "$GITHUB_OUTPUT"
build:
if: ${{ needs.setup.outputs.matrix-build != '[]' }}
needs: setup
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.setup.outputs.matrix-build) }}
steps:
- id: checkout
uses: actions/checkout@v4
- id: checkout-project
uses: actions/checkout@v4
with:
repository: ${{ inputs.repository || 'mpi4py/mpi4py' }}
ref: ${{ inputs.ref }}
path: mpi4py.git
- id: setup-python
uses: actions/setup-python@v5
with:
python-version: 3
- id: setup-cython
run: python -m pip install -r ./conf/requirements-build-cython.txt
working-directory: mpi4py.git
- id: setup-project
run: python ./conf/cythonize.py
working-directory: mpi4py.git
- id: source-date-epoch
run: |
SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
echo SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH >> $GITHUB_ENV
echo $(git log -1 --pretty=%ci) [timestamp=$SOURCE_DATE_EPOCH]
shell: bash
working-directory: mpi4py.git
- id: setup-qemu
if: ${{ runner.os == 'Linux' }}
uses: docker/setup-qemu-action@v3
with:
platforms: all
- id: setup-uv
if: ${{ runner.os != 'Linux' }}
run: ${{ runner.os == 'macOS' && 'brew' || 'choco' }} install uv
- id: build
uses: pypa/[email protected]
timeout-minutes: 45
with:
package-dir: mpi4py.git
output-dir: wheelhouse
env:
MPI4PY_LOCAL_VERSION: "${{ matrix.mpi-abi }}"
CIBW_PROJECT_REQUIRES_PYTHON: ">=3.6"
CIBW_BUILD_FRONTEND: "build[uv]"
CIBW_BUILD: "${{ matrix.py || '*' }}-*"
CIBW_SKIP: "${{ inputs.skip-tag }} *musllinux*"
CIBW_ARCHS: "${{ matrix.arch }}"
CIBW_BEFORE_ALL: >-
bash {project}/.cibw/install-mpi.sh
"${{ matrix.mpi-abi }}" "${{ matrix.arch }}"
CIBW_BEFORE_BUILD: >-
bash {project}/.cibw/patch-tools.sh
CIBW_TEST_COMMAND: >-
bash {project}/.cibw/run-tests.sh
CIBW_TEST_SKIP: "*-macosx_arm64"
CIBW_ENVIRONMENT_PASS_LINUX: >-
MPI4PY_LOCAL_VERSION
MPI4PY_DIST_SUFFIX
SOURCE_DATE_EPOCH
CIBW_ENVIRONMENT_LINUX: >-
CFLAGS="-g0 -O"
CIBW_ENVIRONMENT_MACOS: >-
CFLAGS="-g0 -O"
LDFLAGS="-Wl,-headerpad_max_install_names"
LDFLAGS="$LDFLAGS -Wl,-rpath,/usr/local/lib"
LDFLAGS="$LDFLAGS -Wl,-rpath,/opt/homebrew/lib"
LDFLAGS="$LDFLAGS -Wl,-rpath,/opt/local/lib"
CIBW_ENVIRONMENT_WINDOWS: >-
I_MPI_ROOT="$USERPROFILE\\mpi\\Library"
MSMPI_ROOT="$USERPROFILE\\mpi\\Library"
MSMPI_BIN="$MSMPI_ROOT\\bin"
MSMPI_INC="$MSMPI_ROOT\\include"
MSMPI_LIB64="$MSMPI_ROOT\\lib"
CIBW_BEFORE_BUILD_WINDOWS:
- id: upload
uses: actions/upload-artifact@v4
with:
name: build-${{matrix.os}}-${{matrix.arch}}-${{strategy.job-index}}
path: wheelhouse/*.whl
retention-days: 1
- id: check
run: .cibw/check-wheels.sh wheelhouse
shell: bash
merge:
if: ${{ needs.setup.outputs.matrix-merge != '[]' }}
needs: [setup, build]
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.setup.outputs.matrix-merge) }}
steps:
- id: checkout
uses: actions/checkout@v4
- id: checkout-project
uses: actions/checkout@v4
with:
repository: ${{ inputs.repository || 'mpi4py/mpi4py' }}
ref: ${{ inputs.ref }}
path: mpi4py.git
- id: source-date-epoch
run: |
SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)
echo SOURCE_DATE_EPOCH=$SOURCE_DATE_EPOCH >> $GITHUB_ENV
echo $(git log -1 --pretty=%ci) [timestamp=$SOURCE_DATE_EPOCH]
shell: bash
working-directory: mpi4py.git
- id: setup-python
uses: actions/setup-python@v5
with:
python-version: 3
- id: install
run: python -m pip install -U wheel
- id: download
uses: actions/download-artifact@v4
with:
path: wheelhouse
pattern: build-${{ runner.os }}-${{ matrix.arch }}-*
merge-multiple: true
- id: merge
run: python .cibw/merge-wheels.py wheelhouse dist
- id: upload
uses: actions/upload-artifact@v4
with:
name: wheel-${{ matrix.os }}-${{ matrix.arch }}
path: dist/*.whl
- id: report
run: |
# report
test "$(uname)" = Darwin && sha256sum() { shasum -a 256 $@; } || true
artifact='Artifact: <${{ steps.upload.outputs.artifact-url }}>'
echo $artifact >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
sha256sum -b *.whl >> $GITHUB_STEP_SUMMARY
echo '```' >> $GITHUB_STEP_SUMMARY
shell: bash
working-directory: dist
test-setup:
needs: [setup, merge]
runs-on: 'ubuntu-latest'
outputs:
matrix-test-cf: ${{ steps.setup.outputs.matrix-test-cf }}
matrix-test-gh: ${{ steps.setup.outputs.matrix-test-gh }}
steps:
- uses: actions/checkout@v4
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"Linux-x86_64"') }}
uses: actions/download-artifact@v4
with:
path: wheelhouse
pattern: build-Linux-x86_64-*
merge-multiple: true
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"macOS-arm64"') }}
uses: actions/download-artifact@v4
with:
path: wheelhouse
pattern: build-macOS-arm64-*
merge-multiple: true
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"macOS-x86_64"') }}
uses: actions/download-artifact@v4
with:
path: wheelhouse
pattern: build-macOS-x86_64-*
merge-multiple: true
- if: ${{ contains(needs.setup.outputs.os-arch-list, '"Windows-AMD64"') }}
uses: actions/download-artifact@v4
with:
path: wheelhouse
pattern: build-Windows-AMD64-*
merge-multiple: true
- id: setup
run: python -u .cibw/setup-test.py wheelhouse >> "$GITHUB_OUTPUT"
test-cf:
if: ${{ needs.test-setup.outputs.matrix-test-cf != '[]' }}
needs: test-setup
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.test-setup.outputs.matrix-test-cf) }}
defaults:
run:
shell: bash -el {0}
steps:
- name: Configure hostname
run: echo 127.0.0.1 `hostname` | sudo tee -a /etc/hosts > /dev/null
if: runner.os == 'Linux' || runner.os == 'macOS'
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: dist
pattern: wheel-${{ runner.os }}-*
merge-multiple: true
- uses: mamba-org/setup-micromamba@v2
with:
init-shell: bash
post-cleanup: none
environment-name: test
create-args: >-
${{ matrix.mpi }}=${{ matrix.mpi-version }}
python=${{ matrix.py }}
pip
condarc: |
show_channel_urls: true
channel_priority: strict
channels:
- conda-forge
- nodefaults
- run: python -m pip install mpi4py --no-index --find-links=dist
- uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
with:
shell: bash -el {0}
- if: ${{ matrix.mpi == 'mpich' || matrix.mpi == 'openmpi' }}
uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
env:
MPI4PY_MPIABI: mpi31-${{ matrix.mpi }}
with:
shell: bash -el {0}
test-gh:
if: ${{ needs.test-setup.outputs.matrix-test-gh != '[]' }}
needs: test-setup
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
matrix:
include: ${{ fromJSON(needs.test-setup.outputs.matrix-test-gh) }}
steps:
- name: Configure hostname
run: echo 127.0.0.1 `hostname` | sudo tee -a /etc/hosts > /dev/null
if: runner.os == 'Linux' || runner.os == 'macOS'
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
path: dist
pattern: wheel-${{ runner.os }}-*
merge-multiple: true
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.py }}
- if: ${{ matrix.mpi == 'impi' }}
id: user
shell: bash
run: |
userdir=$(python -m site --user-base)
if [[ $(uname) =~ NT ]]; then
userdir=$(cygpath -u "$userdir")
mpiexec="$userdir/Library/bin/mpiexec.exe"
else
mpiexec="$userdir/bin/mpiexec"
fi
echo "mpiexec=$mpiexec" >> "$GITHUB_OUTPUT"
set -x
python -m pip install --user --upgrade pip
python -m pip install --user impi-rt
python -m pip install --user mpi4py --no-index --find-links=dist
env:
PYTHONUSERBASE: ${{ runner.temp }}/user
- if: ${{ matrix.mpi == 'impi' }}
uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
with:
mpiexec: ${{ steps.user.outputs.mpiexec }}
env:
PYTHONUSERBASE: ${{ runner.temp }}/user
- if: ${{ matrix.mpi == 'impi' }}
id: venv
shell: bash
run: |
venvdir="${{ runner.temp }}/venv"
python -m venv "$venvdir"
if [[ $(uname) =~ NT ]]; then
venvdir=$(cygpath -u "$venvdir")
python="$venvdir/Scripts/python.exe"
mpiexec="$venvdir/Library/bin/mpiexec.exe"
else
python="$venvdir/bin/python"
mpiexec="$venvdir/bin/mpiexec"
fi
echo "python=$python" >> "$GITHUB_OUTPUT"
echo "mpiexec=$mpiexec" >> "$GITHUB_OUTPUT"
set -x
$python -m pip install --upgrade pip
$python -m pip install impi-rt
$python -m pip install mpi4py --no-index --find-links=dist
- if: ${{ matrix.mpi == 'impi' }}
uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
with:
python: ${{ steps.venv.outputs.python }}
mpiexec: ${{ steps.venv.outputs.mpiexec }}
- run: python -m pip install --upgrade pip
- run: python -m pip install mpi4py --no-index --find-links=dist
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }}
id: impi_old
shell: bash
run: |
package=intelmpi.redist.win-x64 version=2021.7.1.15761
nuget install $package -Version $version
mpiroot="$PWD/$package.$version/runtimes/win-x64/native"
mpiexec="$mpiroot/bin/mpiexec.exe"
echo "mpiroot=$(cygpath -u "$mpiroot")" >> "$GITHUB_OUTPUT"
echo "mpiexec=$(cygpath -u "$mpiexec")" >> "$GITHUB_OUTPUT"
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }}
uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
with:
mpiexec: ${{ steps.impi_old.outputs.mpiexec }}
env:
I_MPI_ROOT: ${{ steps.impi_old.outputs.mpiroot }}
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }}
id: impi
shell: bash
run: |
package=intelmpi.redist.win-x64 version=2021.13.1.766
nuget install $package -Version $version
mpiroot="$PWD/$package.$version/runtimes/win-x64/native"
mpiexec="$mpiroot/bin/mpiexec.exe"
echo "mpiroot=$(cygpath -u "$mpiroot")" >> "$GITHUB_OUTPUT"
echo "mpiexec=$(cygpath -u "$mpiexec")" >> "$GITHUB_OUTPUT"
- if: ${{ matrix.mpi == 'impi' && runner.os == 'Windows' }}
uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
with:
mpiexec: ${{ steps.impi.outputs.mpiexec }}
env:
I_MPI_ROOT: ${{ steps.impi.outputs.mpiroot }}
- uses: mpi4py/setup-mpi@v1
with:
mpi: ${{ matrix.mpi }}
- if: ${{ matrix.mpi == 'mpich' && runner.os == 'Linux' }}
run: sudo ln -sr /usr/lib/$(arch)-linux-gnu/libmpi{ch,}.so.12
- uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
- if: ${{ matrix.mpi == 'mpich' || matrix.mpi == 'openmpi' }}
uses: ./.github/actions/mpi4py-test-basic
timeout-minutes: 2
env:
MPI4PY_MPIABI: mpi31-${{ matrix.mpi }}