blob: 9d881eb6437bcf724b258a278f090d4d16a3b949 [file] [log] [blame]
name: CI
on:
push:
branches:
- trunk
pull_request:
branches:
- trunk
schedule:
- cron: '0 1 * * *'
permissions:
actions: write # Needed for skip-duplicate-jobs job
contents: read
jobs:
# Special job which skips duplicate jobs
pre_job:
name: Skip Duplicate Jobs Pre Job
runs-on: ubuntu-latest
# Map a step output to a job output
outputs:
should_skip: ${{ steps.skip_check.outputs.should_skip }}
steps:
- name: Checkout code
uses: actions/checkout@master
with:
persist-credentials: false
submodules: recursive
- id: skip_check
# NOTE: We store action as submodule since ASF doesn't allow directly referencing external
# actions
uses: ./.github/actions/skip-duplicate-actions # v4.0.0
with:
cancel_others: 'true'
github_token: ${{ github.token }}
unit_tests:
name: Unit Tests (Python ${{ matrix.python_version }})
runs-on: ${{ matrix.os }}
timeout-minutes: 8
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip == 'false' || github.ref == 'refs/heads/trunk' }}
strategy:
fail-fast: false
matrix:
python_version:
- 3.7
- 3.8
- 3.9
- "3.10"
- "3.11"
- "pypy-3.7"
os:
- ubuntu-latest
include:
- python_version: pyjion
os: ubuntu-20.04
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Use Python ${{ matrix.python_version }}
if: ${{ matrix.python_version != 'pyjion' }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_version }}
- name: Install OS / deb dependencies
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq gcc libvirt-dev
- name: Use Python 3.10
if: ${{ matrix.python_version == 'pyjion' }}
uses: actions/setup-python@v4
with:
python-version: "3.10"
# From https://github.com/tonybaloney/Pyjion/blob/develop/main/.github/workflows/benchmark.yml#L26 (MIT)
- name: Install OS / deb dependencies
if: ${{ matrix.python_version == 'pyjion' }}
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq cmake llvm-9 clang-9 autoconf automake \
libtool build-essential python curl git lldb-6.0 liblldb-6.0-dev \
libunwind8 libunwind8-dev gettext libicu-dev liblttng-ust-dev \
libssl-dev libnuma-dev libkrb5-dev zlib1g-dev
- name: Setup Dotnet 6
if: ${{ matrix.python_version == 'pyjion' }}
uses: actions/setup-dotnet@v3.0.3
with:
dotnet-version: "6.0.100"
- name: Cache Python Dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-tests.txt', '') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install Pyjion
if: ${{ matrix.python_version == 'pyjion' }}
run: |
pip install pyjion
- name: Install Python Dependencies
run: |
pip install "tox==4.4.2"
- name: Run unit tests tox target
run: |
script -e -c "tox -e py${{ matrix.python_version }}"
- name: Run dist install checks tox target
if: ${{ matrix.python_version != 'pypy-3.7' && matrix.python_version != 'pyjion' }}
run: |
script -e -c "tox -e py${{ matrix.python_version }}-dist,py${{ matrix.python_version }}-dist-wheel"
code_coverage:
name: Generate Code Coverage
runs-on: ubuntu-latest
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip == 'false' || github.ref == 'refs/heads/trunk' }}
strategy:
matrix:
python_version: [3.8]
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Use Python ${{ matrix.python_version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_version }}
- name: Install OS / deb dependencies
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq graphviz gcc libvirt-dev
- name: Cache Python Dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-tests.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install Python Dependencies
run: |
pip install "tox==4.4.2"
- name: Run Checks
run: |
script -e -c "tox -e coverage-ci"
lint_checks:
name: Run Various Lint and Other Checks
runs-on: ubuntu-latest
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip == 'false' || github.ref == 'refs/heads/trunk' }}
strategy:
matrix:
python_version: [3.8]
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Use Python ${{ matrix.python_version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_version }}
- name: Install OS / deb dependencies
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq graphviz gcc libvirt-dev
- name: Cache Python Dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-lint.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install Python Dependencies
run: |
pip install "tox==4.4.2"
- name: Run Checks
run: |
script -e -c "tox -e black-check,isort-check,pyupgrade,checks,import-timings,lint,pylint"
build_test_docker_image:
name: Build and Verify Docker Image
runs-on: ubuntu-latest
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip == 'false' || github.ref == 'refs/heads/trunk' }}
strategy:
matrix:
python_version: [3.8]
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Build Testing Docker Image
run: |
docker build -f contrib/Dockerfile -t libcloud_runtest_img .
- name: Verify Image Works
# This step runs checks under various Python versions and it's slow so
# we only run it on nightly basis
if: ${{ github.event.schedule == '0 1 * * *' }}
run: |
docker run libcloud_runtest_img
security_checks:
name: Run Security Checks
runs-on: ubuntu-20.04
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip == 'false' || github.ref == 'refs/heads/trunk' }}
strategy:
matrix:
python_version: [3.8]
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Install OS / deb dependencies
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq gcc libvirt-dev
- name: Use Python ${{ matrix.python_version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_version }}
- name: Cache Python Dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-lint.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install Python Dependencies
run: |
pip install "tox==4.4.2"
- name: Install Library Into Virtualenv
run: |
python -m venv venv/
source venv/bin/activate
python -m pip install .
- name: Run Pip Audit Check On Main Library Dependencies
uses: ./.github/actions/gh-action-pip-audit/ # v1.0.0
with:
virtual-environment: venv/
# setuptools which we don't install or depend on directly
ignore-vulns: |
GHSA-r9hx-vwmv-q579
- name: Cleanup
run: |
rm -rf venv/ || true
- name: Run Pip Audit Check On All Development And Test Dependencies
uses: ./.github/actions/gh-action-pip-audit/ # v1.0.0
with:
inputs: requirements-tests.txt requirements-lint.txt requirements-mypy.txt requirements-docs.txt
# setuptools which we don't install or depend on directly
ignore-vulns: |
GHSA-r9hx-vwmv-q579
- name: Run Bandit Check
run: |
script -e -c "tox -e bandit"
micro-benchmarks:
name: Micro Benchmarks
runs-on: ubuntu-latest
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip == 'false' || github.ref == 'refs/heads/trunk' }}
strategy:
matrix:
python_version: [3.8]
steps:
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Use Python ${{ matrix.python_version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_version }}
- name: Install OS / deb dependencies
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq graphviz gcc libvirt-dev
- name: Cache Python Dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-tests.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install Python Dependencies
run: |
pip install "tox==4.4.2"
- name: Run Micro Benchmarks
run: |
script -e -c "tox -e micro-benchmarks"
docs:
name: Build and upload Documentation
runs-on: ubuntu-latest
needs: pre_job
if: ${{ needs.pre_job.outputs.should_skip == 'false' || github.ref == 'refs/heads/trunk' }}
strategy:
matrix:
python_version: [3.8]
steps:
- name: Print Environment Info
id: printenv
run: |
printenv | sort
- uses: actions/checkout@master
with:
fetch-depth: 1
- name: Use Python ${{ matrix.python_version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_version }}
- name: Install OS / deb dependencies
run: |
sudo DEBIAN_FRONTEND=noninteractive apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -yq graphviz gcc libvirt-dev
- name: Cache Python Dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements-docs.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install Python Dependencies
run: |
pip install "tox==4.4.2"
- name: Build Docs
run: |
script -e -c "tox -e docs-ci"
- name: Trigger ReadTheDocs build
env:
RTD_TOKEN: ${{ secrets.RTD_TOKEN }}
run: |
pip install requests
python ./contrib/trigger_rtd_build.py