test: refactor tests into separate scripts to reduce complexity and i… #266
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-cd | |
'on': | |
push: | |
branches: | |
- main | |
pull_request: | |
branches: | |
- main | |
jobs: | |
ci: | |
runs-on: ubuntu-latest | |
env: | |
UV_CACHE_DIR: /tmp/.uv-cache | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Install uv | |
uses: astral-sh/[email protected] | |
with: | |
enable-cache: true | |
cache-dependency-glob: uv.lock | |
- name: Set up Python | |
id: setup-python | |
run: uv python install | |
- name: Restore uv cache | |
uses: actions/cache@v4 | |
with: | |
path: /tmp/.uv-cache | |
key: 'uv-${{ runner.os }}-${{ hashFiles(''uv.lock'') }}' | |
restore-keys: | | |
uv-${{ runner.os }}-${{ hashFiles('uv.lock') }} | |
uv-${{ runner.os }} | |
- name: Install dependencies and project | |
if: steps.setup-python.outputs.cache-hit != 'true' | |
run: uv sync | |
- name: Format with ruff | |
run: uv run ruff format ./ | |
- name: Lint with ruff and fix issues | |
run: uv run ruff check --fix ./ | |
- name: Type check with mypy | |
run: uv run mypy ./ | |
- name: Test with pytest | |
env: | |
CB_USERNAME: '${{ secrets.CB_USERNAME }}' | |
CB_TOKEN: '${{ secrets.CB_TOKEN }}' | |
run: uv run pytest | |
- name: Scan with SonarCloud | |
uses: SonarSource/[email protected] | |
env: | |
SONAR_TOKEN: '${{ secrets.SONAR_TOKEN }}' | |
- name: Upload coverage to Codecov | |
uses: codecov/codecov-action@v4 | |
with: | |
token: '${{ secrets.CODECOV_TOKEN }}' | |
file: ./coverage.xml | |
fail_ci_if_error: true | |
- name: Build documentation | |
run: uv run make clean html --directory docs/ | |
- name: Upload documentation to GitHub Pages | |
uses: peaceiris/actions-gh-pages@v4 | |
with: | |
personal_token: '${{ secrets.PERSONAL_TOKEN }}' | |
publish_dir: docs/_build/html | |
- name: Minimize uv cache | |
run: uv cache prune --ci | |
cd: | |
permissions: | |
id-token: write | |
contents: write | |
needs: ci | |
if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Install uv | |
uses: astral-sh/[email protected] | |
with: | |
enable-cache: true | |
cache-dependency-glob: uv.lock | |
- name: Set up Python | |
id: setup-python | |
run: uv python install | |
- name: Use Python Semantic Release to prepare release | |
id: release | |
uses: python-semantic-release/[email protected] | |
with: | |
github_token: '${{ secrets.GITHUB_TOKEN }}' | |
git_committer_name: 'MountainGod2' | |
git_committer_email: '[email protected]' | |
ssh_private_signing_key: '${{ secrets.GIT_COMMIT_SSH_PRIV_KEY }}' | |
ssh_public_signing_key: '${{ secrets.GIT_COMMIT_SSH_PUB_KEY }}' | |
- name: Publish to TestPyPI | |
uses: pypa/gh-action-pypi-publish@release/v1 | |
if: steps.release.outputs.released == 'true' | |
with: | |
repository-url: 'https://test.pypi.org/legacy/' | |
password: '${{ secrets.TEST_PYPI_API_TOKEN }}' | |
- name: Test install from TestPyPI | |
if: steps.release.outputs.released == 'true' | |
run: | | |
pip install \ | |
--index-url https://test.pypi.org/simple/ \ | |
--extra-index-url https://pypi.org/simple \ | |
chaturbate-poller | |
- name: Publish to PyPI | |
uses: pypa/gh-action-pypi-publish@release/v1 | |
if: steps.release.outputs.released == 'true' | |
with: | |
password: '${{ secrets.PYPI_API_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 }}' | |
build: | |
runs-on: ubuntu-latest | |
needs: cd | |
if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
steps: | |
- name: Docker meta | |
id: meta | |
uses: docker/metadata-action@v5 | |
with: | |
images: | | |
ghcr.io/mountaingod2/chaturbate_poller | |
tags: | | |
type=schedule | |
type=ref,event=branch | |
type=ref,event=pr | |
type=semver,pattern={{version}} | |
type=semver,pattern={{major}}.{{minor}} | |
type=semver,pattern={{major}} | |
type=sha | |
type=raw,value=latest,enable={{is_default_branch}} | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v3 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v3 | |
- name: Login to GitHub Container Registry | |
if: github.event_name != 'pull_request' | |
uses: docker/login-action@v3 | |
with: | |
registry: ghcr.io | |
username: '${{ github.repository_owner }}' | |
password: '${{ secrets.GITHUB_TOKEN }}' | |
- name: Build and push | |
uses: docker/build-push-action@v6 | |
with: | |
push: '${{ github.event_name != ''pull_request'' }}' | |
tags: | | |
${{ steps.meta.outputs.tags }} | |
labels: '${{ steps.meta.outputs.labels }}' | |
- name: Run tests on Docker image | |
run: > | |
docker run --rm ghcr.io/mountaingod2/chaturbate_poller:latest | |
--version |