Skip to content

ci(release): correct Zenodo license and release notes #21

ci(release): correct Zenodo license and release notes

ci(release): correct Zenodo license and release notes #21

Workflow file for this run

name: Main
on:
push:
branches:
- main
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
workflow_dispatch:
jobs:
quality:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v4
- uses: actions/cache@v4
with:
path: ~/.cache/pre-commit
key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Run checks
run: make check
tests-and-type-check:
runs-on: ${{ matrix.platform }}
strategy:
matrix:
platform: [ubuntu-latest, macos-latest, windows-latest]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
fail-fast: false
defaults:
run:
shell: bash
steps:
- name: Check out
uses: actions/checkout@v4
- name: Set up the environment
uses: ./.github/actions/setup-python-env
with:
python-version: ${{ matrix.python-version }}
- name: Run tests
run: uv run python -m pytest tests --cov --cov-config=pyproject.toml --cov-report=xml
- name: Check typing
run: uv run ty check
- name: Upload coverage reports to Codecov on Ubuntu / Python 3.11
uses: codecov/codecov-action@v4
if: ${{ matrix.platform == 'ubuntu-latest' && matrix.python-version == '3.11' }}
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
check-docs:
runs-on: ubuntu-latest
steps:
- name: Check out
uses: actions/checkout@v4
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Check if documentation can be built
run: uv run zensical build -s
version-preview:
# Show contributors what a merge would release, based on the conventional
# commits on the branch. Pull requests only; informational.
if: github.event_name == 'pull_request' && github.event.pull_request.draft == false
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- name: Check out
uses: actions/checkout@v4
with:
fetch-depth: 0 # PSR needs full history + tags to compute the bump
ref: ${{ github.event.pull_request.head.sha }}
- name: Set up the environment
uses: ./.github/actions/setup-python-env
- name: Compute release preview
id: preview
run: |
# PSR only computes a release on the main branch; name the checked-out
# PR head 'main' so the preview reflects what a merge would release.
git checkout -B main >/dev/null 2>&1 || true
current=$(uv version --short 2>/dev/null || echo "unknown")
next=$(uv run semantic-release version --print 2>/dev/null || echo "")
if [ -n "$next" ] && [ "$next" != "$current" ]; then
echo "released=true" >> "$GITHUB_OUTPUT"
else
echo "released=false" >> "$GITHUB_OUTPUT"
fi
echo "current=$current" >> "$GITHUB_OUTPUT"
echo "next=$next" >> "$GITHUB_OUTPUT"
# Stamp the upcoming changelog section locally (no commit/tag/push/build)
# so the preview shows the notes this merge would add.
if [ -n "$next" ] && [ "$next" != "$current" ]; then
uv run semantic-release version --no-commit --no-tag --no-push --no-vcs-release --skip-build >/dev/null 2>&1 || true
fi
{
echo "changelog<<PSR_EOF"
git --no-pager diff HEAD -- CHANGELOG.md | awk '/^\+/ && !/^\+\+\+/ {sub(/^\+/,""); print}' | head -80
echo "PSR_EOF"
} >> "$GITHUB_OUTPUT"
- name: Post release preview comment
uses: marocchino/sticky-pull-request-comment@v2
with:
header: version-preview
message: |
## Release preview
${{ steps.preview.outputs.released == 'true' && format('Merging this PR would release **v{0}** (current: `v{1}`).', steps.preview.outputs.next, steps.preview.outputs.current) || format('No version bump from the current commits (stays at `v{0}`). Use conventional commit types (`feat`, `fix`, ...) to trigger a release.', steps.preview.outputs.current) }}
<details><summary>Changelog preview (truncated)</summary>
```markdown
${{ steps.preview.outputs.changelog }}
```
</details>
<sub>Preview via python-semantic-release and conventional commits.</sub>
benchmark:
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
permissions:
contents: read
pull-requests: write
steps:
- name: Check out
uses: actions/checkout@v4
with:
fetch-depth: 0 # need history for baseline comparison
- name: Set up the environment
uses: ./.github/actions/setup-python-env
# Run current benchmarks
- name: Run benchmark tests
run: >-
uv run python -m pytest -c pytest.benchmark.ini
--benchmark-only --benchmark-autosave
--benchmark-json=benchmark_results.json
continue-on-error: true
# Try to get baseline from main branch via worktree (avoids switching branches
# in the main workspace, which would delete action files not yet on main)
- name: Get baseline benchmarks
if: github.event_name == 'pull_request'
run: |
git worktree add /tmp/baseline main 2>/dev/null || {
echo "⚠️ Could not create worktree for main, skipping baseline"
exit 0
}
cd /tmp/baseline
uv run python -m pytest -c pytest.benchmark.ini \
--benchmark-only --benchmark-autosave \
--benchmark-json="$GITHUB_WORKSPACE/baseline_benchmark.json" || true
if [ -f "$GITHUB_WORKSPACE/baseline_benchmark.json" ]; then
echo "✓ Saved baseline benchmark results"
else
echo "⚠️ No baseline benchmarks generated"
fi
git -C "$GITHUB_WORKSPACE" worktree remove /tmp/baseline --force || true
continue-on-error: true
# Compare benchmarks if baseline exists
- name: Compare with baseline
if: github.event_name == 'pull_request' && hashFiles('baseline_benchmark.json') != ''
run: |
if [ ! -f baseline_benchmark.json ]; then
echo "❌ baseline_benchmark.json not found!"
exit 1
fi
if [ ! -f benchmark_results.json ]; then
echo "❌ benchmark_results.json not found!"
exit 1
fi
uv run python scripts/compare_benchmarks.py \
baseline_benchmark.json \
benchmark_results.json \
--threshold 1.3 \
--quiet > benchmark_comparison.txt
echo "Comparison output:"
cat benchmark_comparison.txt
continue-on-error: true
# Comment on PR with results
- name: Post benchmark results to PR
if: github.event_name == 'pull_request' && hashFiles('baseline_benchmark.json') != ''
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
let comparison = 'No comparison data available';
try {
if (fs.existsSync('benchmark_comparison.txt')) {
comparison = fs.readFileSync('benchmark_comparison.txt', 'utf8').trim();
if (!comparison) {
comparison = 'Comparison file is empty - check workflow logs for details';
}
}
} catch (e) {
comparison = `Error reading comparison: ${e.message}`;
console.error('Error:', e);
}
const body = `## 📊 Benchmark Results
<details>
<summary>Click to see benchmark comparison</summary>
\`\`\`
${comparison}
\`\`\`
</details>
**Threshold:** 1.3x (30% slower triggers a regression warning)
**Note:** Benchmarks are informational only and won't fail the build.
<sub>💡 Tip: Download the \`benchmark-results\` artifact for detailed JSON data</sub>
`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: body
});
continue-on-error: true
# Upload benchmark artifacts
- name: Upload benchmark results
uses: actions/upload-artifact@v4
if: always()
with:
name: benchmark-results
path: |
benchmark_results.json
baseline_benchmark.json
.benchmarks/
retention-days: 30