Skip to content

feat: Overhaul documentation and add advanced usage sections #58

feat: Overhaul documentation and add advanced usage sections

feat: Overhaul documentation and add advanced usage sections #58

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python package
permissions:
contents: read
on:
push:
branches: [ "main" ]
paths-ignore:
- '.github/**'
- '.devcontainer/**'
- '.vscode/**'
pull_request:
branches: [ "main" ]
paths-ignore:
- '.github/**'
- '.devcontainer/**'
- '.vscode/**'
jobs:
build:
runs-on: self-hosted
strategy:
fail-fast: false
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
steps:
- uses: actions/create-github-app-token@v2
id: app-token
with:
app-id: ${{ vars.FLAGGLE_BOT_ID }}
private-key: ${{ secrets.FLAGGLE_BOT_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.in-project true
poetry lock --verbose
poetry env use ${{ matrix.python-version }}
poetry install --no-interaction --no-ansi
- name: Lint with flake8
run: |
# stop the build if there are Python syntax errors or undefined names
${{ github.workspace }}/.venv/bin/flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --exclude=.venv,.git,__pycache__,docs,tests,examples
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
${{ github.workspace }}/.venv/bin/flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics --statistics --exclude=.venv,.git,__pycache__,docs,tests,examples
- name: Test with pytest
run: |
${{ github.workspace }}/.venv/bin/pytest --cov=flaggle --cov-report=xml --cov-report=term-missing
release-candidate:
runs-on: self-hosted
needs: build
if: github.event_name == 'pull_request' && (github.event.action == 'opened' || github.event.action == 'synchronize')
outputs:
version-component: ${{ steps.semver.outputs.semver }}
gh-app-id: ${{ steps.get-user-id.outputs.user-id }}
steps:
- uses: actions/create-github-app-token@v2
id: app-token
with:
app-id: ${{ vars.FLAGGLE_BOT_ID }}
private-key: ${{ secrets.FLAGGLE_BOT_KEY }}
- uses: actions/checkout@v4
with:
token: ${{ steps.app-token.outputs.token }}
- name: Get SEMVER from PR Title
id: semver
run: |
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
pr_title="${{ github.event.pull_request.title }}"
pr_title_norm=$(echo "$pr_title" | tr '[:upper:]' '[:lower:]')
if [[ "$pr_title_norm" =~ ^fix ]]; then
echo "semver=patch" >> $GITHUB_OUTPUT
elif [[ "$pr_title_norm" =~ ^feat ]]; then
echo "semver=minor" >> $GITHUB_OUTPUT
elif [[ "$pr_title_norm" =~ ^breaking[[:space:]]change ]]; then
echo "semver=major" >> $GITHUB_OUTPUT
else
echo "PR title '${pr_title}' does not start with fix, feat, or breaking change, skipping version bump."
echo "semver=" >> $GITHUB_OUTPUT
fi
fi
- name: Get GitHub App User ID
if: steps.semver.outputs.semver != ''
id: get-user-id
run: echo "user-id=$(gh api "/users/flaggle-bot[bot]" --jq .id)" >> "$GITHUB_OUTPUT"
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
- name: Set Pre-release Version
if: github.event.action == 'opened' && steps.semver.outputs.semver != ''
id: set-prerelease
run: |
echo "old_version=$(poetry version -s)" >> $GITHUB_OUTPUT
echo "Setting pre-release version based on the version component '${{ steps.semver.outputs.semver }}'"
poetry version pre${{ steps.semver.outputs.semver }} -vvv
echo "New version: $(poetry version -s)"
echo "new_version=$(poetry version -s)" >> $GITHUB_OUTPUT
- name: Bump Pre-release Version
if: github.event.action == 'synchronize' && steps.semver.outputs.semver != ''
id: bump-version
run: |
echo "old_version=$(poetry version -s)" >> $GITHUB_OUTPUT
echo "Bumping pre-release version based on the version component: ${{ steps.semver.outputs.semver }}"
poetry version prerelease -vvv
echo "New version: $(poetry version -s)"
echo "new_version=$(poetry version -s)" >> $GITHUB_OUTPUT
- name: Set Commiter
if: steps.semver.outputs.semver != ''
run: |
git config --global user.name 'flaggle-bot[bot]'
git config --global user.email '${{ steps.get-user-id.outputs.user-id }}+flaggle-bot[bot]@users.noreply.github.com'
- name: Commit and push changes
if: steps.semver.outputs.semver != ''
run: |
git add .
git commit -m "[skip ci] 🔖 Bump version ${{ steps.bump-version.outputs.old_version || steps.set-prerelease.outputs.old_version }} -> ${{ steps.bump-version.outputs.new_version || steps.set-prerelease.outputs.new_version }}"
git push origin HEAD:${{ github.head_ref }} --force
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
promote-release:
runs-on: self-hosted
needs: [build,release-candidate]
if: github.event_name == 'pull_request' && github.event.pull_request.merged == true
permissions:
contents: write
pull-requests: write
steps:
- uses: actions/checkout@v4
- name: Create GitHub App Token
uses: actions/create-github-app-token@v2
id: app-token
with:
app-id: ${{ vars.FLAGGLE_BOT_ID }}
private-key: ${{ secrets.FLAGGLE_BOT_KEY }}
- name: Promote Release
id: promote-release
run: |
echo "Promoting release for version component: ${{ needs.release-candidate.outputs.version-component }}"
echo "old_version=$(poetry version -s)" >> $GITHUB_OUTPUT
echo "Bumping version with semver: ${{ needs.release-candidate.outputs.version-component }}"
poetry version pre${{ needs.release-candidate.outputs.version-component }} -vvv
echo "New version: $(poetry version -s)"
echo "new_version=$(poetry version -s)" >> $GITHUB_OUTPUT
- name: Set Commiter
run: |
git config --global user.name 'flaggle-bot[bot]'
git config --global user.email '${{ needs.release-candidate.outputs.gh-app-id }}+flaggle-bot[bot]@users.noreply.github.com'
- name: Commit and push changes
run: |
git add .
git commit -m "[skip ci] 🔖 Bump version ${{ steps.promote-release.outputs.old_version }} -> ${{ steps.promote-release.outputs.new_version }}"
git push origin HEAD:${{ github.head_ref }} --force
env:
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v7
with:
token: ${{ steps.app-token.outputs.token }}
commit-message: "[skip ci] 🔖 Bump version ${{ steps.promote-release.outputs.old_version }} -> ${{ steps.promote-release.outputs.new_version }}"
author: ${{ needs.release-candidate.outputs.gh-app-id }}+flaggle-bot[bot]@users.noreply.github.com
signoff: false
branch: release-${{ needs.release-candidate.outputs.version_component }}
delete-branch: true
title: "Release ${{ needs.release-candidate.outputs.version_component }}"
body: |
This pull request promotes the release for version component: ${{ needs.release-candidate.outputs.version_component }}"
labels: |
version-bump
automated pr
draft: false
- name: Enable Pull Request Automerge
run: gh pr merge --merge --auto "${{ steps.cpr.outputs.pull-request-number }}"
env:
GH_TOKEN: ${{ steps.app-token.outputs.token }}