aff0ef881f
CI / Lint (ruff check) (push) Successful in 31s
CI / Format (ruff format) (push) Successful in 31s
CI / Sync project version with tag (push) Has been skipped
CI / Lint (ruff check) (pull_request) Successful in 44s
CI / Type check (ty) (push) Successful in 48s
CI / Format (ruff format) (pull_request) Successful in 33s
CI / Sync project version with tag (pull_request) Has been skipped
CI / Type check (ty) (pull_request) Successful in 35s
CI / Tests (push) Successful in 5m12s
CI / Tests (pull_request) Successful in 4m40s
CI / Bump version, tag, and update changelog on merge to master (push) Has been skipped
CI / Bump version, tag, and update changelog on merge to master (pull_request) Has been skipped
The prior e2e run (task 1348) failed on the bump-version job's push step with a 403 Forbidden — CI_TOKEN lacked write access. Note this on the checkout step so the requirement isn't lost, now that the token has been rescoped. Trivial commit to re-open a merge request and re-run the job end to end. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
204 lines
7.3 KiB
YAML
204 lines
7.3 KiB
YAML
name: CI
|
|
|
|
"on":
|
|
push:
|
|
branches: ["**"]
|
|
tags: ["**"]
|
|
pull_request:
|
|
branches: [master]
|
|
|
|
env:
|
|
UV_CACHE_DIR: /uv-cache
|
|
|
|
jobs:
|
|
ruff-check:
|
|
name: Lint (ruff check)
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: docker.gitea.com/runner-images:ubuntu-latest
|
|
volumes:
|
|
- /srv/act-runner-cache/uv:/uv-cache
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: astral-sh/setup-uv@v5
|
|
with:
|
|
enable-cache: false
|
|
- run: |
|
|
echo "UV_CACHE_DIR=/uv-cache" >> "$GITHUB_ENV"
|
|
echo "UV_LINK_MODE=copy" >> "$GITHUB_ENV"
|
|
- run: uv sync --extra cpu --extra dev
|
|
- run: uv run ruff check .
|
|
|
|
ruff-format:
|
|
name: Format (ruff format)
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: docker.gitea.com/runner-images:ubuntu-latest
|
|
volumes:
|
|
- /srv/act-runner-cache/uv:/uv-cache
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: astral-sh/setup-uv@v5
|
|
with:
|
|
enable-cache: false
|
|
- run: |
|
|
echo "UV_CACHE_DIR=/uv-cache" >> "$GITHUB_ENV"
|
|
echo "UV_LINK_MODE=copy" >> "$GITHUB_ENV"
|
|
- run: uv sync --extra cpu --extra dev
|
|
- run: uv run ruff format --check .
|
|
|
|
type-check:
|
|
name: Type check (ty)
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: docker.gitea.com/runner-images:ubuntu-latest
|
|
volumes:
|
|
- /srv/act-runner-cache/uv:/uv-cache
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: astral-sh/setup-uv@v5
|
|
with:
|
|
enable-cache: false
|
|
- run: |
|
|
echo "UV_CACHE_DIR=/uv-cache" >> "$GITHUB_ENV"
|
|
echo "UV_LINK_MODE=copy" >> "$GITHUB_ENV"
|
|
- run: uv sync --extra cpu --extra dev
|
|
- run: uv run ty check .
|
|
|
|
test:
|
|
name: Tests
|
|
needs: [ruff-check, type-check]
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: docker.gitea.com/runner-images:ubuntu-latest
|
|
volumes:
|
|
- /srv/act-runner-cache/uv:/uv-cache
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
- uses: astral-sh/setup-uv@v5
|
|
with:
|
|
enable-cache: false
|
|
- run: |
|
|
echo "UV_CACHE_DIR=/uv-cache" >> "$GITHUB_ENV"
|
|
echo "UV_LINK_MODE=copy" >> "$GITHUB_ENV"
|
|
- run: uv sync --extra cpu --extra dev
|
|
- run: uv run pytest --cov --cov-report=term-missing --cov-report=xml
|
|
- uses: actions/upload-artifact@v3
|
|
with:
|
|
name: coverage-report
|
|
path: coverage.xml
|
|
|
|
bump-version:
|
|
name: Bump version, tag, and update changelog on merge to master
|
|
needs: [ruff-check, ruff-format, type-check, test]
|
|
if: github.ref == 'refs/heads/master' && github.event_name == 'push'
|
|
runs-on: ubuntu-latest
|
|
container:
|
|
image: docker.gitea.com/runner-images:ubuntu-latest
|
|
volumes:
|
|
- /srv/act-runner-cache/uv:/uv-cache
|
|
steps:
|
|
# CI_TOKEN needs write:repository scope (not just read) — this job
|
|
# pushes commits and tags to master, unlike ruff-check/ruff-format/
|
|
# type-check/test above, which only need to check out the repo.
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
token: ${{ secrets.CI_TOKEN }}
|
|
fetch-depth: 0
|
|
- name: Check whether this push is a merge commit
|
|
id: merge_check
|
|
run: |
|
|
PARENTS=$(git rev-parse HEAD^@ | wc -l)
|
|
echo "HEAD has $PARENTS parent(s)"
|
|
if [ "$PARENTS" -ge 2 ]; then
|
|
echo "is_merge=true" >> "$GITHUB_OUTPUT"
|
|
else
|
|
echo "is_merge=false" >> "$GITHUB_OUTPUT"
|
|
fi
|
|
- uses: astral-sh/setup-uv@v5
|
|
if: steps.merge_check.outputs.is_merge == 'true'
|
|
with:
|
|
enable-cache: false
|
|
- run: |
|
|
echo "UV_CACHE_DIR=/uv-cache" >> "$GITHUB_ENV"
|
|
echo "UV_LINK_MODE=copy" >> "$GITHUB_ENV"
|
|
if: steps.merge_check.outputs.is_merge == 'true'
|
|
- run: uv sync --extra cpu --extra dev
|
|
if: steps.merge_check.outputs.is_merge == 'true'
|
|
- name: Configure git identity
|
|
if: steps.merge_check.outputs.is_merge == 'true'
|
|
run: |
|
|
git config user.name "gitea-actions"
|
|
git config user.email "actions@git.larsbogner.de"
|
|
- name: Bump patch version if this merge didn't already bump it
|
|
if: steps.merge_check.outputs.is_merge == 'true'
|
|
run: |
|
|
OLD_VERSION=$(git show "${{ github.event.before }}:pyproject.toml" 2>/dev/null | grep -m1 '^version = ' | sed -E 's/version = "(.*)"/\1/')
|
|
CURRENT_VERSION=$(uv version --short)
|
|
if [ -z "$OLD_VERSION" ]; then
|
|
echo "Could not read pyproject.toml at github.event.before; falling back to HEAD^1"
|
|
OLD_VERSION=$(git show "HEAD^1:pyproject.toml" | grep -m1 '^version = ' | sed -E 's/version = "(.*)"/\1/')
|
|
fi
|
|
if [ "$OLD_VERSION" = "$CURRENT_VERSION" ]; then
|
|
echo "Version unchanged by this merge ($CURRENT_VERSION); bumping patch"
|
|
uv run bump-my-version bump patch --current-version "$CURRENT_VERSION"
|
|
else
|
|
echo "Branch already bumped the version ($OLD_VERSION -> $CURRENT_VERSION); skipping auto-bump"
|
|
fi
|
|
- name: Update changelog for the current version if not already tagged
|
|
if: steps.merge_check.outputs.is_merge == 'true'
|
|
run: |
|
|
VERSION=$(uv version --short)
|
|
TAG="v$VERSION"
|
|
if git rev-parse "$TAG" >/dev/null 2>&1; then
|
|
echo "Tag $TAG already exists; skipping changelog update"
|
|
else
|
|
uv run git-cliff --tag "$TAG" --unreleased --prepend CHANGELOG.md
|
|
git add CHANGELOG.md
|
|
if ! git diff --cached --quiet -- CHANGELOG.md; then
|
|
git commit -m "chore: update changelog for $TAG [skip ci]"
|
|
else
|
|
git restore --staged CHANGELOG.md
|
|
fi
|
|
fi
|
|
- name: Push commits and tag the current version
|
|
if: steps.merge_check.outputs.is_merge == 'true'
|
|
run: |
|
|
git push origin HEAD:master
|
|
VERSION=$(uv version --short)
|
|
TAG="v$VERSION"
|
|
if git rev-parse "$TAG" >/dev/null 2>&1; then
|
|
echo "Tag $TAG already exists"
|
|
else
|
|
git tag -a "$TAG" -m "$TAG"
|
|
git push origin "refs/tags/$TAG"
|
|
fi
|
|
|
|
sync-version-on-tag:
|
|
name: Sync project version with tag
|
|
if: startsWith(github.ref, 'refs/tags/')
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
with:
|
|
token: ${{ secrets.CI_TOKEN }}
|
|
- uses: astral-sh/setup-uv@v5
|
|
- name: Check tag against project version, update if they differ
|
|
run: |
|
|
TAG_VERSION="${GITHUB_REF_NAME#v}"
|
|
CURRENT_VERSION=$(uv version --short)
|
|
if [ "$TAG_VERSION" != "$CURRENT_VERSION" ]; then
|
|
echo "Tag version ($TAG_VERSION) != project version ($CURRENT_VERSION); updating pyproject.toml"
|
|
uv version "$TAG_VERSION" --no-sync
|
|
git config user.name "gitea-actions"
|
|
git config user.email "actions@git.larsbogner.de"
|
|
git add pyproject.toml uv.lock
|
|
git commit -m "chore: sync project version to tag ${GITHUB_REF_NAME} [skip ci]"
|
|
git push origin HEAD:master
|
|
git push origin ":refs/tags/${GITHUB_REF_NAME}"
|
|
git tag -f "${GITHUB_REF_NAME}" HEAD
|
|
git push origin "refs/tags/${GITHUB_REF_NAME}"
|
|
else
|
|
echo "Tag version matches project version ($CURRENT_VERSION)"
|
|
fi
|