| --- |
| # This is the CI workflow (not the artifact build/release workflow). The workflows |
| # are split because GHA doesn't support a dynamic/conditional matrix. This workflow |
| # has slow jobs and jobs that require private GHA runners (eg, M1 Mac) commented out. |
| # Ensure changes are synced with manual_artifact_build.yaml. |
| name: PyYAML CI |
| |
| on: |
| push: |
| pull_request: |
| types: [opened, synchronize, reopened] |
| workflow_dispatch: |
| |
| env: |
| LIBYAML_REPO: https://github.com/yaml/libyaml |
| LIBYAML_REF: 0.2.5 |
| |
| jobs: |
| python_sdist: |
| name: pyyaml sdist |
| runs-on: ubuntu-latest |
| steps: |
| - name: Checkout PyYAML |
| uses: actions/checkout@v3 |
| |
| - name: Install a python |
| uses: actions/setup-python@v4 |
| with: |
| python-version: 3.x |
| |
| - name: Build sdist |
| env: |
| PYYAML_FORCE_CYTHON: 1 |
| PYYAML_FORCE_LIBYAML: 0 |
| run: | |
| python -V |
| python -m pip install build |
| |
| python -m build . |
| |
| # Ensure exactly one artifact was produced. |
| [[ $(shopt -s nullglob; ls dist/*.tar.gz | wc -w) == 1 ]] || { |
| echo "Unexpected content in dist dir: '$(ls dist/*.tar.gz)'." |
| exit 1 |
| } |
| |
| - name: Test sdist |
| run: | |
| # Install some libyaml headers. |
| # TODO Should we smoke test the sdist against the libyaml we built? |
| sudo apt update |
| sudo apt install libyaml-dev -y |
| |
| # Ensure Cython is not present so we use only what's in the sdist. |
| python -m pip uninstall Cython -y || true |
| |
| # Pass no extra args. |
| # We should auto-install with libyaml since it's present. |
| python -m pip install dist/*.tar.gz -v |
| |
| python packaging/build/smoketest.py |
| |
| - name: Upload sdist artifact |
| uses: actions/upload-artifact@v3 |
| with: |
| name: dist |
| path: dist/*.tar.gz |
| |
| |
| linux_libyaml: |
| name: libyaml ${{matrix.cfg.arch}} ${{matrix.cfg.platform}} |
| runs-on: ubuntu-latest |
| strategy: |
| matrix: |
| cfg: |
| - { platform: manylinux1, arch: x86_64 } |
| - { platform: manylinux2014, arch: x86_64 } |
| # - { platform: manylinux2014, arch: aarch64 } |
| # - { platform: manylinux2014, arch: s390x } |
| - { platform: musllinux_1_1, arch: x86_64 } |
| env: |
| DOCKER_IMAGE: quay.io/pypa/${{matrix.cfg.platform}}_${{matrix.cfg.arch}} |
| steps: |
| - name: Check cached libyaml state |
| id: cached_libyaml |
| uses: actions/cache@v3 |
| with: |
| path: libyaml |
| key: libyaml_${{matrix.cfg.platform}}_${{matrix.cfg.arch}}_${{env.LIBYAML_REF}} |
| |
| - name: configure docker foreign arch support |
| uses: docker/setup-qemu-action@v2 |
| if: matrix.cfg.arch != 'x86_64' && steps.cached_libyaml.outputs.cache-hit != 'true' |
| |
| - name: Checkout pyyaml |
| uses: actions/checkout@v3 |
| 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' |
| |
| |
| linux_pyyaml: |
| needs: linux_libyaml |
| name: pyyaml ${{matrix.arch}} ${{matrix.platform}} ${{matrix.spec}} |
| runs-on: ubuntu-latest |
| strategy: |
| matrix: |
| include: |
| - { platform: manylinux1, arch: x86_64, spec: cp36 } |
| # - { platform: manylinux1, arch: x86_64, spec: cp37 } |
| # - { platform: manylinux1, arch: x86_64, spec: cp38 } |
| # - { platform: manylinux1, arch: x86_64, spec: cp39 } |
| # - { platform: manylinux2014, arch: x86_64, spec: cp310 } |
| # - { platform: manylinux2014, arch: x86_64, spec: cp311 } |
| - { platform: manylinux2014, arch: x86_64, spec: cp312 } |
| # - { platform: manylinux2014, arch: aarch64, spec: cp36 } |
| # - { platform: manylinux2014, arch: aarch64, spec: cp37 } |
| # - { platform: manylinux2014, arch: aarch64, spec: cp38 } |
| # - { platform: manylinux2014, arch: aarch64, spec: cp39 } |
| # - { platform: manylinux2014, arch: aarch64, spec: cp310 } |
| # - { platform: manylinux2014, arch: aarch64, spec: cp311 } |
| # - { platform: manylinux2014, arch: aarch64, spec: cp312 } |
| # - { platform: manylinux2014, arch: s390x, spec: cp36 } |
| # - { platform: manylinux2014, arch: s390x, spec: cp37 } |
| # - { platform: manylinux2014, arch: s390x, spec: cp38 } |
| # - { platform: manylinux2014, arch: s390x, spec: cp39 } |
| # - { platform: manylinux2014, arch: s390x, spec: cp310 } |
| # - { platform: manylinux2014, arch: s390x, spec: cp311 } |
| # - { platform: manylinux2014, arch: s390x, spec: cp312 } |
| # - { platform: musllinux_1_1, arch: x86_64, spec: cp38 } |
| # - { platform: musllinux_1_1, arch: x86_64, spec: cp39 } |
| # - { platform: musllinux_1_1, arch: x86_64, spec: cp310 } |
| # - { platform: musllinux_1_1, arch: x86_64, spec: cp311 } |
| - { platform: musllinux_1_1, arch: x86_64, spec: cp312 } |
| |
| steps: |
| - name: Checkout PyYAML |
| uses: actions/checkout@v3 |
| |
| - name: Fetch cached libyaml |
| id: cached_libyaml |
| uses: actions/cache/restore@v3 |
| 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@v2 |
| if: matrix.arch != 'x86_64' |
| |
| - name: Build/Test/Package |
| 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: > |
| C_INCLUDE_PATH=libyaml/include |
| LIBRARY_PATH=libyaml/src/.libs |
| LD_LIBRARY_PATH=libyaml/src/.libs |
| PYYAML_FORCE_CYTHON=1 |
| PYYAML_FORCE_LIBYAML=1 |
| CIBW_TEST_COMMAND: cd {project}; python tests/lib/test_all.py |
| run: | |
| set -eux |
| python3 -V |
| python3 -m pip install -U --user cibuildwheel |
| python3 -m cibuildwheel --platform auto --output-dir dist . |
| |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v3 |
| with: |
| name: dist |
| path: dist/*.whl |
| if-no-files-found: error |
| |
| macos_libyaml: |
| name: libyaml macos ${{matrix.arch}} |
| strategy: |
| matrix: |
| include: |
| - arch: x86_64 |
| # - arch: arm64 |
| # runs_on: [self-hosted, macOS, arm64] |
| # deployment_target: '11.0' |
| # run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} |
| # sdkroot: macosx11.3 |
| defaults: |
| run: |
| shell: ${{ matrix.run_wrapper || 'bash --noprofile --norc -eo pipefail {0}' }} |
| runs-on: ${{ matrix.runs_on || 'macos-11' }} |
| steps: |
| - name: Check cached libyaml state |
| id: cached_libyaml |
| uses: actions/cache@v3 |
| with: |
| path: libyaml |
| key: libyaml_macos_${{matrix.arch}}_${{env.LIBYAML_REF}} |
| |
| - name: Checkout PyYAML |
| uses: actions/checkout@v3 |
| if: steps.cached_libyaml.outputs.cache-hit != 'true' |
| |
| - name: Build libyaml |
| env: |
| MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deployment_target || '10.9' }} |
| SDKROOT: ${{ matrix.sdkroot || 'macosx' }} |
| run: | |
| set -eux |
| brew install automake coreutils m4 |
| 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' |
| |
| |
| macos_pyyaml: |
| needs: macos_libyaml |
| name: pyyaml ${{ matrix.spec }} |
| runs-on: ${{ matrix.runs_on || 'macos-11' }} |
| defaults: |
| run: |
| shell: ${{ matrix.run_wrapper || 'bash --noprofile --norc -eo pipefail {0}' }} |
| strategy: |
| matrix: |
| include: |
| # - spec: cp36-macosx_x86_64 |
| # cibw_version: cibuildwheel==2.11.1 |
| # - spec: cp37-macosx_x86_64 |
| # cibw_version: cibuildwheel==2.11.1 |
| # - spec: cp38-macosx_x86_64 |
| # cibw_version: cibuildwheel==2.11.1 |
| # - spec: cp39-macosx_x86_64 |
| # - spec: cp310-macosx_x86_64 |
| # - spec: cp311-macosx_x86_64 |
| - spec: cp312-macosx_x86_64 |
| |
| # # build for arm64 under a hacked macOS 12 self-hosted x86_64-on-arm64 runner until arm64 is fully supported |
| # - spec: cp39-macosx_arm64 |
| # deployment_target: '11.0' |
| # runs_on: [self-hosted, macOS, arm64] |
| # arch: arm64 |
| # run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} |
| # sdkroot: macosx11.3 |
| # |
| # - spec: cp310-macosx_arm64 |
| # deployment_target: '11.0' |
| # runs_on: [self-hosted, macOS, arm64] |
| # arch: arm64 |
| # run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} |
| # sdkroot: macosx11.3 |
| # |
| # - spec: cp311-macosx_arm64 |
| # deployment_target: '11.0' |
| # runs_on: [self-hosted, macOS, arm64] |
| # arch: arm64 |
| # run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} |
| # sdkroot: macosx11.3 |
| # |
| # - spec: cp312-macosx_arm64 |
| # deployment_target: '11.0' |
| # runs_on: [self-hosted, macOS, arm64] |
| # arch: arm64 |
| # run_wrapper: arch -arm64 bash --noprofile --norc -eo pipefail {0} |
| # sdkroot: macosx11.3 |
| |
| steps: |
| - name: Checkout PyYAML |
| uses: actions/checkout@v3 |
| |
| - name: Get cached libyaml state |
| id: cached_libyaml |
| uses: actions/cache/restore@v3 |
| with: |
| path: libyaml |
| key: libyaml_macos_${{ matrix.arch || 'x86_64' }}_${{env.LIBYAML_REF}} |
| fail-on-cache-miss: true |
| |
| - name: Build/Test/Package |
| env: |
| C_INCLUDE_PATH: libyaml/include |
| CIBW_BUILD: ${{matrix.spec}} |
| CIBW_BUILD_VERBOSITY: 1 |
| CIBW_TEST_COMMAND: cd {project}; python tests/lib/test_all.py |
| LIBRARY_PATH: libyaml/src/.libs |
| MACOSX_DEPLOYMENT_TARGET: ${{ matrix.deployment_target || '10.9' }} |
| SDKROOT: ${{ matrix.sdkroot || 'macosx' }} |
| run: | |
| python3 -V |
| python3 -m pip install -U --user ${{ matrix.cibw_version || 'cibuildwheel' }} |
| python3 -m cibuildwheel --platform auto --output-dir dist . |
| |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v3 |
| with: |
| name: dist |
| path: dist/*.whl |
| if-no-files-found: error |
| |
| windows_libyaml: |
| name: libyaml ${{matrix.platform}} ${{matrix.arch}} |
| runs-on: ${{matrix.platform}} |
| strategy: |
| matrix: |
| include: |
| - platform: windows-2019 |
| arch: x64 |
| - platform: windows-2019 |
| arch: win32 |
| steps: |
| - name: Get cached libyaml state |
| id: cached_libyaml |
| uses: actions/cache@v3 |
| with: |
| path: libyaml |
| key: libyaml_${{matrix.platform}}_${{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 16 2019" -A ${{ matrix.arch }} -DYAML_STATIC_LIB_NAME=yaml .. |
| cmake.exe --build . --config Release |
| popd |
| |
| |
| windows_pyyaml: |
| needs: windows_libyaml |
| name: pyyaml ${{ matrix.platform }} ${{matrix.python_arch}} ${{matrix.spec}} |
| runs-on: ${{matrix.platform}} |
| strategy: |
| matrix: |
| include: |
| # - platform: windows-2019 |
| # build_arch: x64 |
| # python_arch: x64 |
| # spec: 3.6 |
| # - platform: windows-2019 |
| # build_arch: x64 |
| # python_arch: x64 |
| # spec: 3.7 |
| # - platform: windows-2019 |
| # build_arch: x64 |
| # python_arch: x64 |
| # spec: 3.8 |
| # - platform: windows-2019 |
| # build_arch: x64 |
| # python_arch: x64 |
| # spec: 3.9 |
| # - platform: windows-2019 |
| # build_arch: x64 |
| # python_arch: x64 |
| # spec: '3.10' |
| # - platform: windows-2019 |
| # build_arch: x64 |
| # python_arch: x64 |
| # spec: '3.11' |
| - platform: windows-2019 |
| build_arch: x64 |
| python_arch: x64 |
| spec: '3.12.0-rc.1' |
| # - platform: windows-2019 |
| # build_arch: win32 |
| # python_arch: x86 |
| # spec: 3.6 |
| # - platform: windows-2019 |
| # build_arch: win32 |
| # python_arch: x86 |
| # spec: 3.7 |
| # - platform: windows-2019 |
| # build_arch: win32 |
| # python_arch: x86 |
| # spec: 3.8 |
| # - platform: windows-2019 |
| # build_arch: win32 |
| # python_arch: x86 |
| # spec: 3.9 |
| # - platform: windows-2019 |
| # build_arch: win32 |
| # python_arch: x86 |
| # spec: '3.10' |
| # - platform: windows-2019 |
| # build_arch: win32 |
| # python_arch: x86 |
| # spec: '3.11' |
| - platform: windows-2019 |
| build_arch: win32 |
| python_arch: x86 |
| spec: '3.12.0-rc.1' |
| 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: Checkout pyyaml |
| uses: actions/checkout@v3 |
| |
| - name: Get cached libyaml state |
| id: cached_libyaml |
| uses: actions/cache/restore@v3 |
| with: |
| path: libyaml |
| key: libyaml_${{matrix.platform}}_${{matrix.build_arch}}_${{env.LIBYAML_REF}} |
| fail-on-cache-miss: true |
| |
| - name: Install python ${{ matrix.spec }} |
| uses: actions/setup-python@v4 |
| with: |
| architecture: ${{ matrix.python_arch }} |
| python-version: ${{ matrix.spec }} |
| |
| - name: Build/Test/Package |
| env: |
| PYYAML_FORCE_CYTHON: 1 |
| PYYAML_FORCE_LIBYAML: 1 |
| shell: bash |
| run: | |
| set -eux |
| python -V |
| python -m pip install "Cython<3.0" setuptools wheel |
| |
| python setup.py \ |
| --with-libyaml build_ext \ |
| -I libyaml/include \ |
| -L libyaml/build/Release \ |
| -D YAML_DECLARE_STATIC \ |
| build bdist_wheel |
| |
| # run tests on built wheel |
| python -m pip install dist/*.whl |
| python tests/lib/test_all.py |
| |
| - name: Upload artifacts |
| uses: actions/upload-artifact@v3 |
| with: |
| name: dist |
| path: dist/*.whl |
| if-no-files-found: error |
| ... |