CI #856
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
name: CI | |
on: | |
push: | |
branches: | |
- 'master' | |
- '[0-9].[0-9]+' # matches to backport branches, e.g. 3.6 | |
tags: [ 'v*' ] | |
pull_request: | |
branches: | |
- 'master' | |
- '[0-9].[0-9]+' | |
schedule: | |
- cron: '0 6 * * *' # Daily 6AM UTC build | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} | |
cancel-in-progress: true | |
jobs: | |
lint: | |
name: Linter | |
runs-on: ubuntu-latest | |
timeout-minutes: 5 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Setup Python 3.8 | |
uses: actions/setup-python@v4 | |
with: | |
python-version: 3.8 | |
- name: Cache PyPI | |
uses: actions/cache@v3 | |
with: | |
key: pip-lint-${{ hashFiles('requirements/*.txt') }} | |
path: ~/.cache/pip | |
restore-keys: | | |
pip-lint- | |
- name: Update pip, wheel, setuptools, build, twine | |
run: | | |
python -m pip install -U pip wheel setuptools build twine | |
- name: Install dependencies | |
run: | | |
python -m pip install -r requirements/lint.txt -c requirements/constraints.txt | |
- name: Install self | |
run: | | |
python -m pip install . | |
env: | |
AIOHTTP_NO_EXTENSIONS: 1 | |
- name: Run linters | |
run: | | |
make mypy | |
- name: Install libenchant-dev | |
run: | | |
sudo apt install libenchant-dev | |
- name: Install spell checker | |
run: | | |
pip install -r requirements/doc-spelling.txt -c requirements/constraints.txt | |
- name: Run docs spelling | |
run: | | |
# towncrier --yes # uncomment me after publishing a release | |
make doc-spelling | |
- name: Build package | |
run: | | |
python -m build | |
env: | |
AIOHTTP_NO_EXTENSIONS: 1 | |
- name: Run twine checker | |
run: | | |
twine check --strict dist/* | |
- name: Making sure that CONTRIBUTORS.txt remains sorted | |
run: | | |
LC_ALL=C sort -c CONTRIBUTORS.txt | |
gen_llhttp: | |
name: Generate llhttp sources | |
needs: lint | |
runs-on: ubuntu-latest | |
timeout-minutes: 5 | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Cache llhttp generated files | |
uses: actions/cache@v3 | |
id: cache | |
with: | |
key: llhttp-${{ hashFiles('vendor/llhttp/package.json', 'vendor/llhttp/src/**/*') }} | |
path: vendor/llhttp/build | |
- name: Setup NodeJS | |
if: steps.cache.outputs.cache-hit != 'true' | |
uses: actions/setup-node@v3.3.0 | |
with: | |
node-version: '14' | |
- name: Generate llhttp sources | |
if: steps.cache.outputs.cache-hit != 'true' | |
run: | | |
make generate-llhttp | |
- name: Upload llhttp generated files | |
uses: actions/upload-artifact@v3 | |
with: | |
name: llhttp | |
path: vendor/llhttp/build | |
if-no-files-found: error | |
test: | |
name: Test | |
needs: gen_llhttp | |
strategy: | |
matrix: | |
pyver: [3.7, 3.8, 3.9, '3.10'] | |
no-extensions: ['', 'Y'] | |
os: [ubuntu, macos, windows] | |
exclude: | |
- os: macos | |
no-extensions: 'Y' | |
- os: macos | |
pyver: 3.7 | |
- os: macos | |
pyver: 3.8 | |
- os: windows | |
no-extensions: 'Y' | |
# pypy 3.7 exists in beta and doesn't work well yet | |
# include: | |
# - pyver: pypy3 | |
# no-extensions: 'Y' | |
# os: ubuntu | |
fail-fast: true | |
runs-on: ${{ matrix.os }}-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Setup Python ${{ matrix.pyver }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.pyver }} | |
- name: Get pip cache dir | |
id: pip-cache | |
run: | | |
echo "::set-output name=dir::$(pip cache dir)" # - name: Cache | |
- name: Cache PyPI | |
uses: actions/cache@v3 | |
with: | |
key: pip-ci-${{ runner.os }}-${{ matrix.pyver }}-${{ matrix.no-extensions }}-${{ hashFiles('requirements/*.txt') }} | |
path: ${{ steps.pip-cache.outputs.dir }} | |
restore-keys: | | |
pip-ci-${{ runner.os }}-${{ matrix.pyver }}-${{ matrix.no-extensions }}- | |
- name: Update pip, wheel, setuptools, build, twine | |
run: | | |
python -m pip install -U pip wheel setuptools build twine | |
- name: Install dependencies | |
run: | | |
python -m pip install -r requirements/test.txt -c requirements/constraints.txt | |
- name: Cythonize | |
if: ${{ matrix.no-extensions == '' }} | |
run: | | |
make cythonize | |
- name: Restore llhttp generated files | |
if: ${{ matrix.no-extensions == '' }} | |
uses: actions/download-artifact@v2 | |
with: | |
name: llhttp | |
path: vendor/llhttp/build/ | |
- name: Run unittests | |
env: | |
COLOR: 'yes' | |
AIOHTTP_NO_EXTENSIONS: ${{ matrix.no-extensions }} | |
run: | | |
make vvtest | |
python -m coverage xml | |
- name: Upload coverage | |
uses: codecov/codecov-action@v3 | |
with: | |
file: ./coverage.xml | |
flags: unit | |
fail_ci_if_error: false | |
check: # This job does nothing and is only used for the branch protection | |
needs: | |
- test | |
runs-on: ubuntu-latest | |
steps: | |
- name: Report success of the test matrix | |
run: >- | |
print("All's good") | |
shell: python | |
pre-deploy: | |
name: Pre-Deploy | |
runs-on: ubuntu-latest | |
needs: check | |
# Run only on pushing a tag | |
if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') | |
steps: | |
- name: Dummy | |
run: | | |
echo "Predeploy step" | |
build-tarball: | |
name: Tarball | |
runs-on: ubuntu-latest | |
needs: pre-deploy | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Setup Python | |
uses: actions/setup-python@v4 | |
- name: Update pip, wheel, setuptools, build, twine | |
run: | | |
python -m pip install -U pip wheel setuptools build twine | |
- name: Install cython | |
run: | | |
python -m pip install -r requirements/cython.txt -c requirements/constraints.txt | |
- name: Restore llhttp generated files | |
uses: actions/download-artifact@v2 | |
with: | |
name: llhttp | |
path: vendor/llhttp/build/ | |
- name: Cythonize | |
run: | | |
make cythonize | |
- name: Make sdist | |
run: | | |
python -m build --sdist | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
name: dist | |
path: dist | |
build-wheels: | |
name: Build wheels on ${{ matrix.os }} ${{ matrix.qemu }} | |
runs-on: ${{ matrix.os }}-latest | |
needs: pre-deploy | |
strategy: | |
matrix: | |
os: [ubuntu, windows, macos] | |
qemu: [''] | |
include: | |
# Split ubuntu job for the sake of speed-up | |
- os: ubuntu | |
qemu: aarch64 | |
- os: ubuntu | |
qemu: ppc64le | |
- os: ubuntu | |
qemu: s390x | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Set up QEMU | |
if: ${{ matrix.qemu }} | |
uses: docker/setup-qemu-action@v2 | |
with: | |
platforms: all | |
id: qemu | |
- name: Prepare emulation | |
run: | | |
if [[ -n "${{ matrix.qemu }}" ]]; then | |
# Build emulated architectures only if QEMU is set, | |
# use default "auto" otherwise | |
echo "CIBW_ARCHS_LINUX=${{ matrix.qemu }}" >> $GITHUB_ENV | |
fi | |
shell: bash | |
- name: Setup Python | |
uses: actions/setup-python@v4 | |
- name: Update pip, wheel, setuptools, build, twine | |
run: | | |
python -m pip install -U pip wheel setuptools build twine | |
- name: Install cython | |
run: | | |
python -m pip install -r requirements/cython.txt -c requirements/constraints.txt | |
- name: Restore llhttp generated files | |
uses: actions/download-artifact@v2 | |
with: | |
name: llhttp | |
path: vendor/llhttp/build/ | |
- name: Cythonize | |
run: | | |
make cythonize | |
- name: Build wheels | |
uses: pypa/cibuildwheel@2.7.0 | |
env: | |
CIBW_ARCHS_MACOS: x86_64 arm64 universal2 | |
- uses: actions/upload-artifact@v3 | |
with: | |
name: dist | |
path: ./wheelhouse/*.whl | |
deploy: | |
name: Deploy | |
environment: release | |
needs: [build-tarball, build-wheels] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Update pip, wheel, setuptools, build, twine | |
run: | | |
python -m pip install -U pip wheel setuptools build twine | |
- name: Login | |
run: | | |
echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token | |
- name: Download disctributions | |
uses: actions/download-artifact@v2 | |
with: | |
name: dist | |
path: dist | |
- name: Collected dists | |
run: | | |
tree dist | |
- name: Make Release | |
uses: aio-libs/create-release@v1.6.4 | |
with: | |
changes_file: CHANGES.rst | |
name: aiohttp | |
version_file: aiohttp/__init__.py | |
github_token: ${{ secrets.GITHUB_TOKEN }} | |
pypi_token: ${{ secrets.PYPI_API_TOKEN }} | |
dist_dir: dist | |
fix_issue_regex: "`#(\\d+) <https://github.com/aio-libs/aiohttp/issues/\\1>`_" | |
fix_issue_repl: "(#\\1)" |