mirror of
https://github.com/yaml/pyyaml.git
synced 2025-10-19 11:03:18 +00:00

* Update CI and Build Targets * Add Python 3.14 pre-release support * Add Windows/arm64 builds * Update to current GHA runner versions * Native aarch64 Linux runners * Fix musllinux 1.2 builds * musl libyaml build fixes * add 3.14t wheels w/ freethreading directive, misc CI/build cleanup * include package version in merged dist artifact filename
671 lines
24 KiB
YAML
671 lines
24 KiB
YAML
---
|
|
name: PyYAML CI
|
|
|
|
on:
|
|
push:
|
|
pull_request:
|
|
types: [opened, synchronize, reopened]
|
|
workflow_dispatch:
|
|
inputs:
|
|
libyaml_repo:
|
|
description: Repo URL for libyaml
|
|
type: string
|
|
default: https://github.com/yaml/libyaml
|
|
libyaml_ref:
|
|
description: Tag/branch ref for libyaml
|
|
type: string
|
|
default: 0.2.5
|
|
skip_artifact_upload:
|
|
description: Skip most artifact uploads?
|
|
type: boolean
|
|
default: true
|
|
skip_ci_redundant_jobs:
|
|
description: Skip redundant jobs for CI?
|
|
type: boolean
|
|
default: true
|
|
skip_slow_jobs:
|
|
description: Skip slow (emulated) jobs for CI?
|
|
type: boolean
|
|
default: true
|
|
|
|
env:
|
|
LIBYAML_REPO: ${{ inputs.libyaml_repo || 'https://github.com/yaml/libyaml' }} # FIXME: can we ref the input.default value?
|
|
LIBYAML_REF: ${{ inputs.libyaml_ref || '0.2.5' }} # FIXME: can we ref the input.default value?
|
|
skip_ci_redundant_jobs: ${{ inputs.skip_ci_redundant_jobs || github.event_name == 'pull_request' || github.event_name == 'push' }}
|
|
skip_slow_jobs: ${{ inputs.skip_slow_jobs || github.event_name == 'pull_request' || github.event_name == 'push' }}
|
|
skip_artifact_upload: ${{ (github.event_name == 'workflow_dispatch' && inputs.skip_artifact_upload) || github.event_name != 'workflow_dispatch' }}
|
|
|
|
jobs:
|
|
python_sdist:
|
|
name: pyyaml sdist
|
|
runs-on: ubuntu-24.04
|
|
outputs:
|
|
artifact_name: ${{ steps.build_sdist.outputs.artifact_name }}
|
|
package_version: ${{ steps.build_sdist.outputs.package_version }}
|
|
steps:
|
|
- name: Checkout PyYAML
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install a python
|
|
uses: actions/setup-python@v5
|
|
with:
|
|
python-version: 3.x
|
|
|
|
- name: Build sdist
|
|
id: build_sdist
|
|
env:
|
|
PYYAML_FORCE_CYTHON: 1
|
|
PYYAML_FORCE_LIBYAML: 0
|
|
run: |
|
|
python -V
|
|
python -m pip install build
|
|
|
|
python -m build -s .
|
|
|
|
echo "artifact_name=$(ls ./dist)" >> "$GITHUB_OUTPUT"
|
|
echo "package_version=$(ls ./dist | sed -En 's/pyyaml-(.+)\.tar\.gz/\1/p')" >> "$GITHUB_OUTPUT"
|
|
|
|
- name: Upload sdist artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ steps.build_sdist.outputs.artifact_name }}
|
|
path: dist/${{ steps.build_sdist.outputs.artifact_name }}
|
|
if-no-files-found: error
|
|
# always upload the sdist artifact- all the wheel build jobs require it
|
|
|
|
make_linux_libyaml_matrix:
|
|
runs-on: ubuntu-24.04
|
|
outputs:
|
|
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: make a matrix
|
|
id: make_matrix
|
|
uses: ./.github/actions/dynamatrix
|
|
with:
|
|
matrix_yaml: |
|
|
include:
|
|
- { platform: manylinux1, arch: x86_64 }
|
|
- { platform: manylinux2014, arch: x86_64 }
|
|
- { platform: manylinux2014, arch: aarch64 }
|
|
- { platform: manylinux2014, arch: s390x, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64 }
|
|
- { platform: musllinux_1_2, arch: aarch64 }
|
|
|
|
linux_libyaml:
|
|
needs: [make_linux_libyaml_matrix]
|
|
name: libyaml ${{ matrix.platform }} ${{ matrix.arch }}
|
|
runs-on: ${{ (matrix.arch == 'aarch64') && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix: ${{ fromJSON(needs.make_linux_libyaml_matrix.outputs.matrix_json) }}
|
|
env:
|
|
DOCKER_IMAGE: quay.io/pypa/${{ matrix.platform }}_${{ matrix.arch }}
|
|
steps:
|
|
- name: Check cached libyaml state
|
|
id: cached_libyaml
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: libyaml
|
|
key: libyaml_${{ matrix.platform }}_${{ matrix.arch }}_${{ env.LIBYAML_REF }}
|
|
|
|
- name: configure docker foreign arch support
|
|
uses: docker/setup-qemu-action@v3
|
|
if: matrix.arch != 'x86_64' && steps.cached_libyaml.outputs.cache-hit != 'true'
|
|
|
|
- name: Checkout pyyaml
|
|
uses: actions/checkout@v4
|
|
if: steps.cached_libyaml.outputs.cache-hit != 'true'
|
|
|
|
- name: Build libyaml
|
|
run: >
|
|
docker run --rm
|
|
--volume "$(pwd):/io"
|
|
--env LIBYAML_REF
|
|
--env LIBYAML_REPO
|
|
--workdir /io
|
|
"$DOCKER_IMAGE"
|
|
/io/packaging/build/libyaml.sh
|
|
if: steps.cached_libyaml.outputs.cache-hit != 'true'
|
|
|
|
- name: ensure output is world readable (or cache fill fails with Permission Denied)
|
|
run: >
|
|
sudo chmod -R a+r ./libyaml/
|
|
if: steps.cached_libyaml.outputs.cache-hit != 'true'
|
|
|
|
make_linux_pyyaml_matrix:
|
|
runs-on: ubuntu-24.04
|
|
outputs:
|
|
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: make a matrix
|
|
id: make_matrix
|
|
uses: ./.github/actions/dynamatrix
|
|
with:
|
|
matrix_yaml: |
|
|
include:
|
|
- { platform: manylinux1, arch: x86_64, spec: cp38 }
|
|
- { platform: manylinux1, arch: x86_64, spec: cp39, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: x86_64, spec: cp310, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: x86_64, spec: cp311, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: x86_64, spec: cp312, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: x86_64, spec: cp313, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: x86_64, spec: cp314 }
|
|
- { platform: manylinux2014, arch: x86_64, spec: cp314t }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp38, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp39, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp310, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp311, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp312, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp313, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp314 }
|
|
- { platform: manylinux2014, arch: aarch64, spec: cp314t }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp38, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp39, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp310, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp311, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp312, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp313, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp314, omit: ${{ env.skip_slow_jobs }} }
|
|
- { platform: manylinux2014, arch: s390x, spec: cp314t, omit: ${{ env.skip_ci_redundant_jobs || env.skip_slow_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp38, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp39, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp310, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp311, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp312, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp313, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp314 }
|
|
- { platform: musllinux_1_2, arch: x86_64, spec: cp314t }
|
|
- { platform: musllinux_1_2, arch: aarch64, spec: cp39, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: aarch64, spec: cp310, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: aarch64, spec: cp311, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: aarch64, spec: cp312, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: aarch64, spec: cp313, omit: ${{ env.skip_ci_redundant_jobs }} }
|
|
- { platform: musllinux_1_2, arch: aarch64, spec: cp314, omit: ${{ env.skip_slow_jobs }} }
|
|
- { platform: musllinux_1_2, arch: aarch64, spec: cp314t, omit: ${{ env.skip_slow_jobs }} }
|
|
|
|
linux_pyyaml:
|
|
needs: [python_sdist, linux_libyaml, make_linux_pyyaml_matrix]
|
|
name: pyyaml ${{matrix.spec}}-${{matrix.platform}}_${{matrix.arch}}
|
|
runs-on: ${{ (matrix.arch == 'aarch64') && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix: ${{ fromJSON(needs.make_linux_pyyaml_matrix.outputs.matrix_json) }}
|
|
|
|
steps:
|
|
- name: fetch sdist artifact
|
|
id: fetch_sdist
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: ${{ needs.build_sdist.outputs.artifact_name }}
|
|
|
|
- name: Fetch cached libyaml
|
|
id: cached_libyaml
|
|
uses: actions/cache/restore@v4
|
|
with:
|
|
path: libyaml
|
|
key: libyaml_${{matrix.platform}}_${{matrix.arch}}_${{env.LIBYAML_REF}}
|
|
fail-on-cache-miss: true
|
|
|
|
- name: configure docker foreign arch support
|
|
uses: docker/setup-qemu-action@v3
|
|
if: matrix.arch != 'x86_64' && matrix.arch != 'aarch64'
|
|
|
|
- name: Build/Test/Package
|
|
id: build
|
|
env:
|
|
CIBW_ARCHS: all
|
|
# HACK: ick, maybe deconstruct the matrix a bit or query cibuildwheel for its default target *linux spec first?
|
|
CIBW_BUILD: ${{matrix.spec}}-${{ contains(matrix.platform, 'musllinux') && 'musllinux' || 'manylinux' }}_${{matrix.arch}}
|
|
CIBW_BUILD_VERBOSITY: 1
|
|
# containerized Linux builds require explicit CIBW_ENVIRONMENT
|
|
CIBW_ENVIRONMENT: >
|
|
LD_LIBRARY_PATH=../libyaml/src/.libs
|
|
PYYAML_FORCE_CYTHON=1
|
|
PYYAML_FORCE_LIBYAML=1
|
|
CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux_img || '' }}
|
|
CIBW_MANYLINUX_I686_IMAGE: ${{ matrix.manylinux_img || '' }}
|
|
CIBW_MANYLINUX_AARCH64_IMAGE: ${{ matrix.manylinux_img || '' }}
|
|
CIBW_MANYLINUX_S390X_IMAGE: ${{ matrix.manylinux_img || '' }}
|
|
CIBW_MUSLLINUX_X86_64_IMAGE: ${{ matrix.musllinux_img || 'musllinux_1_2' }}
|
|
CIBW_MUSLLINUX_I686_IMAGE: ${{ matrix.musllinux_img || 'musllinux_1_2' }}
|
|
CIBW_MUSLLINUX_AARCH64_IMAGE: ${{ matrix.musllinux_img || 'musllinux_1_2' }}
|
|
CIBW_TEST_COMMAND: cd {project}; pytest
|
|
CIBW_TEST_REQUIRES: pytest
|
|
run: |
|
|
set -eux
|
|
|
|
python3 -V
|
|
python3 -m pip install -U --user ${{ matrix.cibw_version || 'cibuildwheel' }}
|
|
|
|
mkdir pyyaml
|
|
|
|
tar zxf ${{ steps.fetch_sdist.outputs.download-path }}/pyyaml*.tar.gz/pyyaml*.tar.gz --strip-components=1 -C pyyaml
|
|
|
|
cat << 'EOF' > build_config.toml
|
|
[tool.cibuildwheel.config-settings]
|
|
pyyaml_build_config='{"force":1, "library_dirs": ["../libyaml/src/.libs"], "include_dirs": ["../libyaml/include"]}'
|
|
EOF
|
|
|
|
CIBW_BEFORE_BUILD="ls -l {project}" python3 -m cibuildwheel --config-file $(pwd)/build_config.toml --platform auto --output-dir ./dist ./pyyaml
|
|
|
|
echo "artifact_name=$(ls ./dist/)" >> "$GITHUB_OUTPUT"
|
|
# FIXME: ensure exactly one artifact
|
|
|
|
- name: Upload artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ steps.build.outputs.artifact_name }}
|
|
path: dist/*.whl
|
|
if-no-files-found: error
|
|
if: ${{ env.skip_artifact_upload != 'true' }}
|
|
|
|
macos_libyaml:
|
|
name: libyaml macos ${{matrix.arch}}
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- arch: x86_64
|
|
runs-on: macos-15-intel # force x86_64 runner
|
|
- arch: arm64
|
|
deployment_target: '11.0'
|
|
defaults:
|
|
run:
|
|
shell: ${{ matrix.run_wrapper || 'bash --noprofile --norc -eo pipefail {0}' }}
|
|
runs-on: ${{ matrix.runs-on || 'macos-15' }}
|
|
steps:
|
|
- name: Check cached libyaml state
|
|
id: cached_libyaml
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: libyaml
|
|
key: libyaml_macos_${{matrix.arch}}_${{env.LIBYAML_REF}}
|
|
|
|
- name: Checkout PyYAML
|
|
uses: actions/checkout@v4
|
|
if: steps.cached_libyaml.outputs.cache-hit != 'true'
|
|
|
|
- name: Build libyaml
|
|
env:
|
|
MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deployment_target || '10.13' }}
|
|
SDKROOT: ${{ matrix.sdkroot || 'macosx' }}
|
|
run: |
|
|
set -eux
|
|
brew install automake coreutils m4 libtool
|
|
bash ./packaging/build/libyaml.sh
|
|
echo "finished artifact arch is $(lipo -archs libyaml/src/.libs/libyaml.a)"
|
|
if: steps.cached_libyaml.outputs.cache-hit != 'true'
|
|
|
|
make_macos_pyyaml_matrix:
|
|
runs-on: ubuntu-24.04
|
|
outputs:
|
|
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: make a matrix
|
|
id: make_matrix
|
|
uses: ./.github/actions/dynamatrix
|
|
with:
|
|
matrix_yaml: |
|
|
include:
|
|
### x86_64 jobs
|
|
- spec: cp38-macosx_x86_64
|
|
arch: x86_64
|
|
cibw_version: cibuildwheel==2.11.1
|
|
runs_on: [macos-15-intel]
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
- spec: cp39-macosx_x86_64
|
|
arch: x86_64
|
|
runs_on: [macos-15-intel]
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
- spec: cp310-macosx_x86_64
|
|
arch: x86_64
|
|
runs_on: [macos-15-intel]
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
- spec: cp311-macosx_x86_64
|
|
arch: x86_64
|
|
runs_on: [macos-15-intel]
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
- spec: cp312-macosx_x86_64
|
|
arch: x86_64
|
|
runs_on: [macos-15-intel]
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
- spec: cp313-macosx_x86_64
|
|
arch: x86_64
|
|
runs_on: [macos-15-intel]
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
- spec: cp314-macosx_x86_64
|
|
arch: x86_64
|
|
runs_on: [macos-15-intel]
|
|
- spec: cp314t-macosx_x86_64
|
|
arch: x86_64
|
|
runs_on: [macos-15-intel]
|
|
|
|
### arm64 jobs
|
|
- spec: cp39-macosx_arm64
|
|
deployment_target: '11.0'
|
|
arch: arm64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp310-macosx_arm64
|
|
deployment_target: '11.0'
|
|
arch: arm64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp311-macosx_arm64
|
|
deployment_target: '11.0'
|
|
arch: arm64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp312-macosx_arm64
|
|
deployment_target: '11.0'
|
|
arch: arm64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp313-macosx_arm64
|
|
deployment_target: '11.0'
|
|
arch: arm64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp314-macosx_arm64
|
|
deployment_target: '11.0'
|
|
arch: arm64
|
|
|
|
- spec: cp314t-macosx_arm64
|
|
deployment_target: '11.0'
|
|
arch: arm64
|
|
|
|
macos_pyyaml:
|
|
needs: [python_sdist, macos_libyaml, make_macos_pyyaml_matrix]
|
|
name: pyyaml ${{ matrix.spec }}
|
|
runs-on: ${{ matrix.runs_on || 'macos-15' }}
|
|
defaults:
|
|
run:
|
|
shell: ${{ matrix.run_wrapper || 'bash --noprofile --norc -eo pipefail {0}' }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix: ${{ fromJSON(needs.make_macos_pyyaml_matrix.outputs.matrix_json) }}
|
|
steps:
|
|
- name: fetch sdist artifact
|
|
id: fetch_sdist
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: ${{ needs.build_sdist.outputs.artifact_name }}
|
|
|
|
- name: Get cached libyaml state
|
|
id: cached_libyaml
|
|
uses: actions/cache/restore@v4
|
|
with:
|
|
path: libyaml
|
|
key: libyaml_macos_${{ matrix.arch }}_${{env.LIBYAML_REF}}
|
|
fail-on-cache-miss: true
|
|
|
|
- name: Install python
|
|
uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.11' # as of 2024-05, this has to be < 3.12 since the macos-15 runner image's
|
|
# built-in virtualenv/pip are pinned to busted versions that fail on newer Pythons
|
|
|
|
- name: Build/Test/Package
|
|
id: build
|
|
env:
|
|
C_INCLUDE_PATH: ../libyaml/include
|
|
CIBW_BUILD: ${{matrix.spec}}
|
|
CIBW_BUILD_VERBOSITY: 1
|
|
CIBW_TEST_COMMAND: pytest {package}
|
|
CIBW_TEST_REQUIRES: pytest
|
|
LIBRARY_PATH: ../libyaml/src/.libs
|
|
MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deployment_target || '10.13' }}
|
|
PYYAML_FORCE_CYTHON: 1
|
|
PYYAML_FORCE_LIBYAML: 1
|
|
SDKROOT: ${{ matrix.sdkroot || 'macosx' }}
|
|
run: |
|
|
set -eux
|
|
python3 -V
|
|
python3 -m pip install -U --user ${{ matrix.cibw_version || 'cibuildwheel' }}
|
|
mkdir pyyaml
|
|
|
|
tar zxf pyyaml*.tar.gz/pyyaml*.tar.gz --strip-components=1 -C pyyaml
|
|
|
|
cat << 'EOF' > build_config.toml
|
|
[tool.cibuildwheel.config-settings]
|
|
pyyaml_build_config='{"force":1, "library_dirs": ["../libyaml/src/.libs"], "include_dirs": ["../libyaml/include"]}'
|
|
EOF
|
|
|
|
python3 -m cibuildwheel --config-file $(pwd)/build_config.toml --platform auto --output-dir ./dist ./pyyaml
|
|
|
|
echo "artifact_name=$(ls ./dist/)" >> "$GITHUB_OUTPUT"
|
|
# FIXME: ensure exactly one artifact
|
|
|
|
- name: Upload artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ steps.build.outputs.artifact_name }}
|
|
path: dist/*.whl
|
|
if-no-files-found: error
|
|
if: ${{ env.skip_artifact_upload != 'true' }}
|
|
|
|
windows_libyaml:
|
|
name: libyaml windows ${{ matrix.arch }}
|
|
runs-on: ${{ (matrix.arch == 'arm64') && 'windows-11-arm' || 'windows-2022' }}
|
|
strategy:
|
|
matrix:
|
|
include:
|
|
- arch: x64
|
|
- arch: win32
|
|
- arch: arm64
|
|
steps:
|
|
- name: Get cached libyaml state
|
|
id: cached_libyaml
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: libyaml
|
|
key: libyaml_${{ 'windows' }}_${{ matrix.arch }}_${{ env.LIBYAML_REF }}
|
|
|
|
- name: Build libyaml
|
|
shell: bash
|
|
if: steps.cached_libyaml.outputs.cache-hit != 'true'
|
|
run: |
|
|
# git spews all over stderr unless we tell it not to
|
|
export GIT_REDIRECT_STDERR="2>&1"
|
|
|
|
if [[ ! -d ./libyaml ]]; then
|
|
git clone -b ${{ env.LIBYAML_REF }} ${{ env.LIBYAML_REPO }} 2>&1
|
|
fi
|
|
|
|
pushd libyaml
|
|
git clean -fdx
|
|
popd
|
|
|
|
mkdir libyaml/build
|
|
|
|
pushd libyaml/build
|
|
cmake.exe -G "Visual Studio 17 2022" -A ${{ matrix.arch }} -DYAML_STATIC_LIB_NAME=yaml ..
|
|
cmake.exe --build . --config Release
|
|
popd
|
|
|
|
make_windows_pyyaml_matrix:
|
|
runs-on: ubuntu-24.04
|
|
outputs:
|
|
matrix_json: ${{ steps.make_matrix.outputs.matrix_json }}
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- name: make a matrix
|
|
id: make_matrix
|
|
uses: ./.github/actions/dynamatrix
|
|
with:
|
|
matrix_yaml: |
|
|
include:
|
|
### x86_64 jobs
|
|
- spec: cp38-win_amd64
|
|
arch: x64
|
|
|
|
- spec: cp39-win_amd64
|
|
arch: x64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp310-win_amd64
|
|
arch: x64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp311-win_amd64
|
|
arch: x64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp312-win_amd64
|
|
arch: x64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp313-win_amd64
|
|
arch: x64
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp314-win_amd64
|
|
arch: x64
|
|
|
|
- spec: cp314t-win_amd64
|
|
arch: x64
|
|
|
|
### arm64 jobs
|
|
- spec: cp312-win_arm64
|
|
arch: arm64
|
|
runs-on: windows-11-arm
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp313-win_arm64
|
|
arch: arm64
|
|
runs-on: windows-11-arm
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp314-win_arm64
|
|
arch: arm64
|
|
runs-on: windows-11-arm
|
|
|
|
- spec: cp314t-win_arm64
|
|
arch: arm64
|
|
runs-on: windows-11-arm
|
|
|
|
### win32 jobs
|
|
- spec: cp38-win32
|
|
arch: win32
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp39-win32
|
|
arch: win32
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp310-win32
|
|
arch: win32
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp311-win32
|
|
arch: win32
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp312-win32
|
|
arch: win32
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
- spec: cp313-win32
|
|
arch: win32
|
|
omit: ${{ env.skip_ci_redundant_jobs }}
|
|
|
|
# no more win32 after 3.13?
|
|
|
|
windows_pyyaml:
|
|
needs: [python_sdist, windows_libyaml, make_windows_pyyaml_matrix]
|
|
name: pyyaml ${{matrix.spec}}
|
|
runs-on: ${{ matrix.runs-on || 'windows-2022' }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix: ${{ fromJSON(needs.make_windows_pyyaml_matrix.outputs.matrix_json) }}
|
|
steps:
|
|
# autocrlf screws up tests under Windows
|
|
- name: Set git to use LF
|
|
run: |
|
|
git config --global core.autocrlf false
|
|
git config --global core.eol lf
|
|
|
|
- name: fetch sdist artifact
|
|
id: fetch_sdist
|
|
uses: actions/download-artifact@v4
|
|
with:
|
|
name: ${{ needs.build_sdist.outputs.artifact_name }}
|
|
|
|
- name: Get cached libyaml state
|
|
id: cached_libyaml
|
|
uses: actions/cache/restore@v4
|
|
with:
|
|
path: libyaml
|
|
key: libyaml_${{'windows'}}_${{ matrix.arch }}_${{env.LIBYAML_REF}}
|
|
fail-on-cache-miss: true
|
|
|
|
- name: Install python
|
|
uses: actions/setup-python@v5
|
|
with:
|
|
python-version: 3.x
|
|
|
|
- name: Build/Test/Package
|
|
id: build
|
|
shell: bash
|
|
env:
|
|
CIBW_BUILD: ${{matrix.spec}}
|
|
CIBW_BUILD_VERBOSITY: 1
|
|
CIBW_BEFORE_TEST: ls -l {package}
|
|
CIBW_TEST_COMMAND: pytest {package}
|
|
CIBW_TEST_REQUIRES: pytest
|
|
#CIBW_CONFIG_SETTINGS: |
|
|
# pyyaml_build_config='{"include_dirs": ["libyaml/include"], "library_dirs": ["libyaml/build/Release"], "define": [["YAML_DECLARE_STATIC", 1]], "force": 1}'
|
|
run: |
|
|
set -eux
|
|
python -V
|
|
python -m pip install -U --user ${{ matrix.cibw_version || 'cibuildwheel' }}
|
|
mkdir pyyaml
|
|
|
|
tar zxf pyyaml*.tar.gz/pyyaml*.tar.gz --strip-components=1 -C pyyaml
|
|
|
|
cat << 'EOF' > build_config.toml
|
|
[tool.cibuildwheel.config-settings]
|
|
pyyaml_build_config='{"force":1, "include_dirs": ["../libyaml/include"], "library_dirs": ["../libyaml/build/Release"], "define": [["YAML_DECLARE_STATIC", 1]], "force": 1}'
|
|
EOF
|
|
|
|
python3 -m cibuildwheel --config-file $(pwd)/build_config.toml --platform auto --output-dir ./dist ./pyyaml
|
|
|
|
echo "artifact_name=$(ls ./dist/)" >> "$GITHUB_OUTPUT"
|
|
# FIXME: ensure exactly one artifact
|
|
|
|
- name: Upload artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: ${{ steps.build.outputs.artifact_name }}
|
|
path: dist/*.whl
|
|
if-no-files-found: error
|
|
if: ${{ env.skip_artifact_upload != 'true' }}
|
|
|
|
merge_artifacts:
|
|
needs: [python_sdist, macos_pyyaml, linux_pyyaml, windows_pyyaml]
|
|
runs-on: ubuntu-24.04
|
|
steps:
|
|
- name: merge all artifacts
|
|
uses: actions/upload-artifact/merge@v4
|
|
with:
|
|
name: dist-pyyaml-${{ needs.python_sdist.outputs.package_version }}
|
|
delete-merged: true
|
|
if: ${{ env.skip_artifact_upload != 'true' }}
|
|
|
|
check:
|
|
if: always()
|
|
needs:
|
|
- python_sdist
|
|
- linux_pyyaml
|
|
- macos_pyyaml
|
|
- windows_pyyaml
|
|
- merge_artifacts
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Verify all previous jobs succeeded (provides a single check to sample for gating purposes)
|
|
uses: re-actors/alls-green@release/v1
|
|
with:
|
|
jobs: ${{ toJSON(needs) }}
|
|
...
|