name: Python on: workflow_dispatch: inputs: build: required: true type: number permissions: contents: read jobs: wheel-linux: name: Linux ${{ matrix.os }}, ${{ matrix.arch.name }}, Python ${{ matrix.ver }} runs-on: ${{ matrix.arch.runs-on }} container: image: quay.io/pypa/${{ matrix.os }}_${{ matrix.arch.python-name }} # Don't run as root within the container. # Neither Git nor Bazel appreciates that. # 1001 is the GitHub Actions runner user. options: --init --user 1001 strategy: fail-fast: false matrix: arch: - { name: X64, python-name: x86_64, runs-on: [ubuntu-latest] } - { name: ARM64, python-name: aarch64, runs-on: [self-hosted, linux, arm64] } os: [manylinux_2_28] ver: ['3.8', '3.9', '3.10', '3.11', '3.12'] env: BAZELISK_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} PYTHON: /usr/local/bin/python${{ matrix.ver }} # Bazel fails if the username is unknown. USER: runner steps: - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' - name: Prepare Python ${{ matrix.ver }} environment run: | "${PYTHON}" -m pip install --upgrade pip "${PYTHON}" -m pip install --upgrade build wheel auditwheel "${PYTHON}" -m pip install --upgrade absl-py shell: bash - name: Build wheel env: SOURCE_DATE_EPOCH: ${{ env.timestamp }} run: | "${PYTHON}" -m build --wheel "${PYTHON}" -m auditwheel repair --wheel-dir=. dist/* shell: bash working-directory: python - name: Test wheel run: | "${PYTHON}" -m pip install google_re2-*.whl "${PYTHON}" re2_test.py shell: bash working-directory: python - uses: actions/upload-artifact@v4.3.3 with: name: ${{ hashFiles('python/google_re2-*.whl') }} path: python/google_re2-*.whl retention-days: 1 wheel-macos: name: macOS ${{ matrix.os }}, ${{ matrix.arch.name }}, Python ${{ matrix.ver }} runs-on: macos-${{ matrix.os }}-large strategy: fail-fast: false matrix: arch: - { name: X64, bazel-name: x86_64, python-name: x86_64 } - { name: ARM64, bazel-name: arm64, python-name: arm64 } # TODO(junyer): Stop cross-compiling after we drop support for macOS 12; # instead, specify `-large` suffix on X64 and `-xlarge` suffix on ARM64. os: [12, 13, 14] ver: ['3.8', '3.9', '3.10', '3.11', '3.12'] env: BAZELISK_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BAZEL_CPU: darwin_${{ matrix.arch.bazel-name }} PLAT_NAME: macosx-${{ matrix.os }}.0-${{ matrix.arch.python-name }} # Force a specific target version of macOS. # Otherwise, `delocate` renames the wheels! MACOSX_DEPLOYMENT_TARGET: ${{ matrix.os }}.0 # Stop macOS from reporting the system version as 10.x. # Otherwise, Python refuses to install the built wheel! SYSTEM_VERSION_COMPAT: 0 steps: - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' - uses: actions/setup-python@v5.1.0 with: python-version: ${{ matrix.ver }} - name: Prepare Python ${{ matrix.ver }} environment run: | python -m pip install --upgrade pip python -m pip install --upgrade build wheel delocate python -m pip install --upgrade absl-py shell: bash - name: Build wheel env: SOURCE_DATE_EPOCH: ${{ env.timestamp }} run: | python -m build --wheel python -m delocate.cmd.delocate_wheel --wheel-dir=. dist/* shell: bash working-directory: python - if: matrix.arch.name == runner.arch name: Test wheel run: | python -m pip install google_re2-*.whl python re2_test.py shell: bash working-directory: python - uses: actions/upload-artifact@v4.3.3 with: name: ${{ hashFiles('python/google_re2-*.whl') }} path: python/google_re2-*.whl retention-days: 1 wheel-windows: name: Windows, ${{ matrix.arch.name }}, Python ${{ matrix.ver }} runs-on: windows-latest strategy: fail-fast: false matrix: arch: - { name: X86, bazel-name: x64_x86, python-name: win32 } - { name: X64, bazel-name: x64, python-name: win_amd64 } ver: ['3.8', '3.9', '3.10', '3.11', '3.12'] env: BAZELISK_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} BAZEL_CPU: ${{ matrix.arch.bazel-name }}_windows PLAT_NAME: ${{ matrix.arch.python-name }} steps: - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash - uses: bazel-contrib/setup-bazel@0.8.4 with: bazelisk-version: '1.x' # Lowercase the architecture name for `actions/setup-python`. - run: | ARCHITECTURE=${{ matrix.arch.name }} echo "architecture=${ARCHITECTURE,,}" >> "${GITHUB_ENV}" shell: bash - uses: actions/setup-python@v5.1.0 with: python-version: ${{ matrix.ver }} architecture: ${{ env.architecture }} - name: Prepare Python ${{ matrix.ver }} environment run: | python -m pip install --upgrade pip python -m pip install --upgrade build wheel delvewheel python -m pip install --upgrade absl-py shell: bash - name: Build wheel env: SOURCE_DATE_EPOCH: ${{ env.timestamp }} run: | python -m build --wheel python -m delvewheel repair --wheel-dir=. dist/* shell: bash working-directory: python - name: Test wheel run: | python -m pip install google_re2-*.whl python re2_test.py shell: bash working-directory: python - uses: actions/upload-artifact@v4.3.3 with: name: ${{ hashFiles('python/google_re2-*.whl') }} path: python/google_re2-*.whl retention-days: 1 publish: needs: - wheel-linux - wheel-macos - wheel-windows permissions: contents: read # Required for PyPI publishing. id-token: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v4.1.6 # Stash the timestamp for the commit SHA that triggered the workflow. - run: echo "timestamp=$(git log -1 --pretty=%ct)" >> "${GITHUB_ENV}" shell: bash - uses: actions/setup-python@v5.1.0 with: python-version: '3.x' - name: Prepare Python 3.x environment run: | python -m pip install --upgrade pip python -m pip install --upgrade build wheel shell: bash - if: inputs.build == 1 name: Build source env: SOURCE_DATE_EPOCH: ${{ env.timestamp }} run: | python -m build --sdist shell: bash working-directory: python - uses: actions/download-artifact@v4.1.7 with: path: python - name: Set build number to ${{ inputs.build }} env: SOURCE_DATE_EPOCH: ${{ env.timestamp }} run: | mkdir -p dist for WHL in */google_re2-*.whl; do python -m wheel unpack "${WHL}" python -m wheel pack --dest-dir=dist --build-number=${{ inputs.build }} google_re2-* rm -rf google_re2-* done shell: bash working-directory: python - if: inputs.build >= 1 uses: pypa/gh-action-pypi-publish@v1.8.14 with: packages-dir: python/dist