From 30284bfde10444d54a491837e42fdc99ccd05ed8 Mon Sep 17 00:00:00 2001 From: Felix Soubelet Date: Tue, 5 Sep 2023 10:12:16 +0200 Subject: [PATCH] slightly out of scope, reusable workflows --- .github/workflows/README.md | 14 +++---- .github/workflows/coverage.yml | 64 ++--------------------------- .github/workflows/cron.yml | 42 +++---------------- .github/workflows/documentation.yml | 47 +++------------------ .github/workflows/publish.yml | 43 +------------------ .github/workflows/tests.yml | 41 ++++-------------- 6 files changed, 31 insertions(+), 220 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 48d181e..ce6d514 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -1,30 +1,28 @@ # Continous Integration Workflows -This package implements different workflows for CI. +This package implements different workflows for CI, based on our organisation's common workflows. They are organised as follows. ### Documentation The `documentation` workflow triggers on any push to master, builds the documentation and pushes it to the `gh-pages` branch (if the build is successful). -It runs on `ubuntu-latest` and our lowest supported Python version, `Python 3.7`. ### Testing Suite Tests are ensured in the `tests` workflow, which triggers on all pushes. -It runs on a matrix of all supported operating systems (ubuntu-18.04, ubuntu-20.04, ubuntu-22.04, windows-latest and macos-latest) for all supported Python versions (currently `3.7`, `3.8`, `3.9` and `3.10`). +It runs on a matrix of all supported operating systems for all supported Python versions. ### Test Coverage Test coverage is calculated in the `coverage` wokflow, which triggers on pushes to `master` and any push to a `pull request`. -It runs on `ubuntu-latest` & the lowest supported Python version (`Python 3.7`), and reports the coverage results of the test suite to `CodeClimate`, - +It reports the coverage results of the test suite to `CodeClimate`. ### Regular Testing A `cron` workflow triggers every Monday at 3am (UTC time) and runs the full testing suite, on all available operating systems and supported Python versions. -It also runs on `Python 3.x` so that newly released Python versions that would break tests are automatically detected. +It also runs on `Python 3.x` so that newly released Python versions that would break tests are automatically included. ### Publishing -Publishing to `PyPI` is done through the `publish` workflow, which triggers anytime a `release` is made of the Github repository. -It builds a `wheel`, checks it, and pushes to `PyPI` if checks are successful. \ No newline at end of file +Publishing to `PyPI` is done through the `publish` workflow, which triggers anytime a `release` is made of the GitHub repository. +It builds a `wheel`, checks it, and pushes to `PyPI` if checks are successful. diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 54f4306..b9ffe3a 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -1,10 +1,6 @@ # Runs all tests and pushes coverage report to codeclimate name: Coverage -defaults: - run: - shell: bash - on: # Runs on all push events to master branch and any push related to a pull request push: branches: @@ -13,59 +9,7 @@ on: # Runs on all push events to master branch and any push related to a pull r jobs: coverage: - name: ${{ matrix.os }} / ${{ matrix.python-version }} - runs-on: ${{ matrix.os }} - strategy: - matrix: # only lowest supported Python on latest ubuntu - os: [ubuntu-latest] - python-version: [3.7] - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: '**/setup.py' - - - name: Get full Python version - id: full-python-version - run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - - - name: Upgrade pip, setuptools and wheel - run: python -m pip install --upgrade pip setuptools wheel - - - name: Install package - run: python -m pip install '.[test]' - - - name: Set up env for CodeClimate (push) - run: | - echo "GIT_BRANCH=${GITHUB_REF/refs\/heads\//}" >> $GITHUB_ENV - echo "GIT_COMMIT_SHA=$GITHUB_SHA" >> $GITHUB_ENV - if: github.event_name == 'push' - - - name: Set up env for CodeClimate (pull_request) - env: - PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} - run: | - echo "GIT_BRANCH=$GITHUB_HEAD_REF" >> $GITHUB_ENV - echo "GIT_COMMIT_SHA=$PR_HEAD_SHA" >> $GITHUB_ENV - if: github.event_name == 'pull_request' - - - name: Prepare CodeClimate binary - env: - CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} - run: | - curl -LSs 'https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64' >./cc-test-reporter; - chmod +x ./cc-test-reporter - ./cc-test-reporter before-build - - name: Run all tests - run: python -m pytest --cov-report xml --cov=sdds - - - name: Push Coverage to CodeClimate - if: ${{ success() }} # only if tests were successful - env: - CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} - run: ./cc-test-reporter after-build \ No newline at end of file + uses: pylhc/.github/.github/workflows/coverage.yml@master + with: + src-dir: sdds + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/cron.yml b/.github/workflows/cron.yml index 92f14c4..66cf544 100644 --- a/.github/workflows/cron.yml +++ b/.github/workflows/cron.yml @@ -1,43 +1,13 @@ -# Runs all tests on master everyday at 10 am (UTC time) +# Runs all tests on master on Mondays at 3 am (UTC time) name: Cron Testing -defaults: - run: - shell: bash -on: # Runs on master branch on Mondays at 3am UTC time +on: schedule: - cron: '* 3 * * mon' jobs: - tests: - name: ${{ matrix.os }} / ${{ matrix.python-version }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-18.04, ubuntu-20.04,, ubuntu-22.04, macos-latest, windows-latest] - # Make sure to escape 3.10 with quotes so it doesn't get interpreted as float 3.1 by GA's parser - python-version: [3.7, 3.8, 3.9, "3.10", 3.x] # crons should always run latest python hence 3.x - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: '**/setup.py' - - - name: Get full Python version - id: full-python-version - run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - - - name: Upgrade pip, setuptools and wheel - run: python -m pip install --upgrade pip setuptools wheel - - - name: Install package - run: python -m pip install '.[test]' - - - name: Run all tests - run: python -m pytest \ No newline at end of file + tests: + uses: pylhc/.github/.github/workflows/cron.yml@master + with: + extra-dependencies: test diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index e548f81..ace3140 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -1,51 +1,14 @@ # Build documentation +# The build is uploaded as artifact if the triggering event is a push for a pull request +# The build is published to github pages if the triggering event is a push to the master branch (PR merge) name: Build and upload documentation -defaults: - run: - shell: bash - -on: # Runs on any push event to master +on: # Runs on any push event in a PR or any push event to master + pull_request: push: branches: - 'master' jobs: documentation: - name: ${{ matrix.os }} / ${{ matrix.python-version }} - runs-on: ${{ matrix.os }} - strategy: - matrix: # only lowest supported Python on latest ubuntu - os: [ubuntu-latest] - python-version: [3.7] - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: '**/setup.py' - - - name: Get full Python version - id: full-python-version - run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - - - name: Upgrade pip, setuptools and wheel - run: python -m pip install --upgrade pip setuptools wheel - - - name: Install package - run: python -m pip install '.[doc]' - - - name: Build documentation - run: python -m sphinx -b html doc ./doc_build -d ./doc_build - - - name: Upload documentation to gh-pages - if: ${{ success() }} - uses: JamesIves/github-pages-deploy-action@3.7.1 - with: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - BRANCH: gh-pages - FOLDER: doc_build + uses: pylhc/.github/.github/workflows/documentation.yml@master \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9bdca5b..bc21fe3 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,50 +1,11 @@ # Publishes to PyPI upon creation of a release name: Upload Package to PyPI -defaults: - run: - shell: bash - on: # Runs everytime a release is added to the repository release: types: [created] jobs: deploy: - name: ${{ matrix.os }} / ${{ matrix.python-version }} - runs-on: ${{ matrix.os }} - strategy: - matrix: # only lowest supported Python on latest ubuntu - os: [ubuntu-latest] - python-version: [3.7] - - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: '**/setup.py' - - - name: Get full Python version - id: full-python-version - run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - - - name: Upgrade pip, setuptools, wheel, build and twine - run: python -m pip install --upgrade pip setuptools wheel build twine - - - name: Build and check build - run: | - python -m build - twine check dist/* - - - name: Publish - if: ${{ success() }} - env: - TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} - TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} - run: | - twine upload dist/* + uses: pylhc/.github/.github/workflows/publish.yml@master + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 7fdc322..74b02fd 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -1,42 +1,17 @@ # Runs all tests -name: Tests +name: All Tests defaults: run: shell: bash -on: [push] # Runs on all push events to any branch - +on: # Runs on any push event to any branch except master (the coverage workflow takes care of that) + push: + branches-ignore: + - 'master' jobs: tests: - name: ${{ matrix.os }} / ${{ matrix.python-version }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-18.04, ubuntu-20.04, ubuntu-22.04, macos-latest, windows-latest] - # Make sure to escape 3.10 with quotes so it doesn't get interpreted as float 3.1 by GA's parser - python-version: [3.7, 3.8, 3.9, "3.10"] - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: '**/setup.py' - - - name: Get full Python version - id: full-python-version - run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") - - - name: Upgrade pip, setuptools and wheel - run: python -m pip install --upgrade pip setuptools wheel - - - name: Install package - run: python -m pip install '.[test]' - - - name: Run basic tests - run: python -m pytest \ No newline at end of file + uses: pylhc/.github/.github/workflows/tests.yml@master + with: + extra-dependencies: test \ No newline at end of file