Skip to content

refactor: CI-CD.yml #19

refactor: CI-CD.yml

refactor: CI-CD.yml #19

Workflow file for this run

# This workflow will do Continous Integration (CI) and Continous Deployment (CD).
# It will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see:
# https://py-pkgs.org/08-ci-cd
# https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: ci-cd
# Controls when the workflow will run
on: [push, pull_request]
# A workflow run is made up of one or more jobs that can run
# sequentially or in parallel
jobs:
ci:
# Set up operating system
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
# Define job steps
steps:
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Check-out karney repository
uses: actions/checkout@v4
- name: Install Poetry
uses: snok/install-poetry@v1
- name: Update PATH
run: echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Update Poetry configuration
run: poetry config virtualenvs.create false
- name: Install karney with dependencies
run: poetry install --with dev --no-interaction
- name: Lint with ruff
run: |
# stop the build if there are Python syntax errors or undefined names
ruff check ./src/
- name: Test with pytest
run: poetry run pytest tests/ --cov=karney --cov-report=xml --doctest-modules
- name: Use Codecov to track coverage
uses: codecov/codecov-action@v4
if: matrix.python-version == '3.9'
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: ./coverage.xml # coverage report
release1:
concurrency: release1
permissions:
contents: write
# Only run this job if the "ci" job passes
needs: ci
# Only run this job if new work is pushed to the "main" branch
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
# Set up operating system
runs-on: ubuntu-latest
outputs:
tag: ${{ steps.release.outputs.tag }}
released: ${{ steps.release.outputs.released }}
# Define job steps
steps:
- name: Set up Python 3.9
uses: actions/setup-python@v2
with:
python-version: 3.9
- name: Check-out repository
uses: actions/checkout@v4
with:
fetch-depth: 0
ref: main
submodules: recursive
- name: Use Python Semantic Release to prepare release
id: release
uses: python-semantic-release/python-semantic-release@v9.8.8
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Publish package distributions to GitHub Releases
uses: python-semantic-release/upload-to-gh-release@main
if: steps.release.outputs.released == 'true'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
- name: Store the distribution packages
uses: actions/upload-artifact@v4
if: steps.release.outputs.released == 'true'
with:
name: python-package-distributions
path: dist/
testpypi-publish:
needs: release1
runs-on: ubuntu-latest
permissions:
# IMPORTANT: this permission is mandatory for trusted publishing
id-token: write
# Dedicated environments with protections for publishing are strongly recommended.
environment:
name: pypi
# OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status:
url: https://test.pypi.org/p/karney
steps:
- name: Retrieve release distributions
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/
- name: Publish release distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
- name: Test install from TestPyPI
run: |
pip install \
--index-url https://test.pypi.org/simple/ \
--extra-index-url https://pypi.org/simple/ \
karney
pypi-publish:
runs-on: ubuntu-latest
needs: testpypi-publish
permissions:
# IMPORTANT: this permission is mandatory for trusted publishing
id-token: write
# Dedicated environments with protections for publishing are strongly recommended.
environment:
name: pypi
# OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status:
url: https://pypi.org/p/karney
steps:
- name: Retrieve release distributions
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/
- name: Publish release distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1