Setup trusted publishing for testing. #648
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
# This workflow will install Python dependencies, run tests and lint with a variety of Python versions | |
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions | |
name: Package | |
on: | |
push: | |
pull_request: | |
types: [opened, reopened] | |
defaults: | |
run: | |
shell: bash | |
env: | |
git-depth: 0 # Depth to search for tags. | |
jobs: | |
black: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Install Black | |
run: pip install black | |
- name: Run Black | |
run: black --check --diff examples/ scripts/ tcod/ tests/ *.py | |
isort: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Install isort | |
run: pip install isort | |
- name: isort | |
uses: liskin/gh-problem-matcher-wrap@v2 | |
with: | |
linters: isort | |
run: isort scripts/ tcod/ tests/ examples/ --check --diff | |
flake8: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Install Flake8 | |
run: pip install Flake8 | |
- name: Flake8 | |
uses: liskin/gh-problem-matcher-wrap@v2 | |
with: | |
linters: flake8 | |
run: flake8 scripts/ tcod/ tests/ | |
mypy: | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Checkout submodules | |
run: git submodule update --init --recursive --depth 1 | |
- name: Install Python dependencies | |
run: pip install mypy pytest -r requirements.txt | |
- name: Fake initialize package | |
run: | | |
echo '__version__ = ""' > tcod/version.py | |
- name: Mypy | |
uses: liskin/gh-problem-matcher-wrap@v2 | |
with: | |
linters: mypy | |
run: mypy --show-column-numbers | |
# This makes sure that the latest versions of the SDL headers parse correctly. | |
parse_sdl: | |
needs: [black, isort, flake8, mypy] | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: ["windows-latest", "macos-latest"] | |
sdl-version: ["2.0.14", "2.0.16"] | |
fail-fast: true | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: ${{ env.git-depth }} | |
- name: Checkout submodules | |
run: git submodule update --init --recursive --depth 1 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.x" | |
- name: Install build dependencies | |
run: pip install build | |
- name: Build package | |
run: python -m build | |
env: | |
SDL_VERSION: ${{ matrix.sdl-version }} | |
TDL_BUILD: DEBUG | |
build: | |
needs: [black, isort, flake8, mypy] | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: ["ubuntu-latest", "windows-latest"] | |
python-version: ["3.7", "3.8", "3.9", "pypy-3.7"] | |
architecture: ["x64"] | |
include: | |
- os: "windows-latest" | |
python-version: "3.7" | |
architecture: "x86" | |
- os: "windows-latest" | |
python-version: "pypy-3.7" | |
architecture: "x86" | |
fail-fast: false | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: ${{ env.git-depth }} | |
- name: Checkout submodules | |
run: | | |
git submodule update --init --recursive --depth 1 | |
- name: Set up Python ${{ matrix.python-version }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
architecture: ${{ matrix.architecture }} | |
- name: Install APT dependencies | |
if: runner.os == 'Linux' | |
run: | | |
sudo apt-get update | |
sudo apt-get install libsdl2-dev xvfb | |
- name: Install Python dependencies | |
run: | | |
python -m pip install --upgrade pip | |
pip install pytest pytest-cov pytest-benchmark build twine | |
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi | |
- name: Initialize package | |
run: | | |
pip install -e . # Install the package in-place. | |
- name: Build package. | |
run: | | |
python -m build | |
- name: Test with pytest | |
if: runner.os == 'Windows' | |
run: | | |
pytest --cov-report=xml | |
- name: Test with pytest (Xvfb) | |
if: always() && runner.os != 'Windows' | |
run: | | |
xvfb-run -e /tmp/xvfb.log --server-num=$RANDOM --auto-servernum pytest --cov-report=xml | |
- name: Xvfb logs | |
if: runner.os != 'Windows' | |
run: cat /tmp/xvfb.log | |
- uses: codecov/codecov-action@v3 | |
- name: Upload to PyPI | |
if: startsWith(github.ref, 'refs/tags/') && runner.os != 'Linux' | |
env: | |
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} | |
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} | |
run: | | |
twine upload --skip-existing dist/* | |
- uses: actions/upload-artifact@v3 | |
if: runner.os == 'Linux' | |
with: | |
name: sdist | |
path: dist/tcod-*.tar.gz | |
retention-days: 7 | |
- uses: actions/upload-artifact@v3 | |
if: runner.os == 'Windows' | |
with: | |
name: wheels-windows | |
path: dist/*.whl | |
retention-days: 7 | |
isolated: # Test installing the package from source. | |
needs: build | |
runs-on: ${{ matrix.os }} | |
strategy: | |
matrix: | |
os: ["ubuntu-latest", "windows-latest"] | |
steps: | |
- name: Set up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: 3.x | |
- name: Install Python dependencies | |
run: | | |
python -m pip install --upgrade pip | |
pip install wheel | |
- name: Install APT dependencies | |
if: runner.os == 'Linux' | |
run: | | |
sudo apt-get update | |
sudo apt-get install libsdl2-dev | |
- uses: actions/download-artifact@v3 | |
with: | |
name: sdist | |
- name: Build package in isolation | |
run: | | |
pip install tcod-*.tar.gz | |
- name: Confirm package import | |
run: | | |
python -c "import tcod" | |
linux-wheels: | |
needs: build # These take a while to build/test, so wait for normal tests to pass first. | |
if: startsWith(github.event.ref, 'refs/tags/') | |
runs-on: "ubuntu-latest" | |
strategy: | |
matrix: | |
arch: ["x86_64", "aarch64"] | |
build: ["cp37-manylinux*", "pp37-manylinux*"] | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: ${{ env.git-depth }} | |
- name: Set up QEMU | |
if: ${{ matrix.arch == 'aarch64' }} | |
uses: docker/setup-qemu-action@v2 | |
- name: Checkout submodules | |
run: | | |
git submodule update --init --recursive --depth 1 | |
- name: Set up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: "3.x" | |
- name: Install Python dependencies | |
run: | | |
python -m pip install --upgrade pip | |
pip install twine cibuildwheel==2.3.1 | |
- name: Build wheels | |
run: | | |
python -m cibuildwheel --output-dir wheelhouse | |
env: | |
CIBW_BUILD: ${{ matrix.build }} | |
CIBW_ARCHS_LINUX: ${{ matrix.arch }} | |
CIBW_MANYLINUX_*_IMAGE: manylinux2014 | |
CIBW_MANYLINUX_PYPY_X86_64_IMAGE: manylinux2014 | |
CIBW_MANYLINUX_PYPY_AARCH64_IMAGE: manylinux2014 | |
CIBW_BEFORE_ALL_LINUX: > | |
yum install -y epel-release && | |
yum-config-manager --enable epel && | |
yum install -y SDL2-devel | |
CIBW_BEFORE_TEST: pip install numpy | |
CIBW_TEST_COMMAND: python -c "import tcod" | |
- name: Archive wheel | |
uses: actions/upload-artifact@v3 | |
with: | |
name: wheels-linux | |
path: wheelhouse/*.whl | |
retention-days: 7 | |
- name: Upload to PyPI | |
if: startsWith(github.ref, 'refs/tags/') | |
env: | |
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} | |
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} | |
run: | | |
twine upload --skip-existing wheelhouse/* | |
build-macos: | |
needs: [black, isort, flake8, mypy] | |
runs-on: "macos-11" | |
strategy: | |
fail-fast: true | |
matrix: | |
python: ["cp38-*_universal2", "cp38-*_x86_64", "cp38-*_arm64", "pp37-*"] | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
fetch-depth: ${{ env.git-depth }} | |
- name: Checkout submodules | |
run: git submodule update --init --recursive --depth 1 | |
- name: Print git describe | |
# "--tags" is required to workaround actions/checkout's broken annotated tag handing. | |
# https://github.com/actions/checkout/issues/290 | |
run: git describe --tags | |
- name: Install Python dependencies | |
run: pip3 install wheel twine -r requirements.txt | |
- name: Prepare package | |
# Downloads SDL2 for the later step. | |
run: python3 setup.py || true | |
- name: Build wheels | |
uses: pypa/cibuildwheel@v2.12.3 | |
env: | |
CIBW_BUILD: ${{ matrix.python }} | |
CIBW_ARCHS_MACOS: x86_64 arm64 universal2 | |
CIBW_BEFORE_BUILD_MACOS: pip install --upgrade delocate | |
CIBW_BEFORE_TEST: pip install numpy | |
CIBW_TEST_COMMAND: python -c "import tcod" | |
CIBW_TEST_SKIP: "pp* *-macosx_arm64 *-macosx_universal2:arm64" | |
- name: Archive wheel | |
uses: actions/upload-artifact@v3 | |
with: | |
name: wheels-macos | |
path: wheelhouse/*.whl | |
retention-days: 7 | |
- name: Upload to PyPI | |
if: startsWith(github.ref, 'refs/tags/') | |
env: | |
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} | |
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} | |
run: twine upload --skip-existing wheelhouse/* | |
publish: | |
needs: [build] | |
runs-on: ubuntu-latest | |
if: startsWith(github.ref, 'refs/tags/') | |
environment: | |
name: release | |
url: https://pypi.org/p/tcod | |
permissions: | |
id-token: write | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
name: sdist | |
path: dist/ | |
- uses: actions/download-artifact@v3 | |
with: | |
name: wheels-windows | |
path: dist/ | |
- uses: pypa/gh-action-pypi-publish@release/v1 | |
with: | |
skip-existing: true | |
publish-macos: | |
needs: [build-macos] | |
runs-on: ubuntu-latest | |
if: startsWith(github.ref, 'refs/tags/') | |
environment: | |
name: release | |
url: https://pypi.org/p/tcod | |
permissions: | |
id-token: write | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
name: wheels-macos | |
path: dist/ | |
- uses: pypa/gh-action-pypi-publish@release/v1 | |
with: | |
skip-existing: true | |
publish-linux: | |
needs: [linux-wheels] | |
runs-on: ubuntu-latest | |
if: startsWith(github.ref, 'refs/tags/') | |
environment: | |
name: release | |
url: https://pypi.org/p/tcod | |
permissions: | |
id-token: write | |
steps: | |
- uses: actions/download-artifact@v3 | |
with: | |
name: wheels-linux | |
path: dist/ | |
- uses: pypa/gh-action-pypi-publish@release/v1 | |
with: | |
skip-existing: true |