chore: bump version to 0.9.9 #31
Workflow file for this run
This file contains hidden or 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: Release | |
| on: | |
| push: | |
| tags: | |
| - 'v*.*.*' | |
| permissions: | |
| contents: write | |
| id-token: write # Required for PyPI OIDC trusted publishing | |
| jobs: | |
| # Job 1: Validate the release | |
| validate: | |
| name: Validate Release | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| outputs: | |
| version: ${{ steps.get-version.outputs.version }} | |
| tag: ${{ steps.get-version.outputs.tag }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| version: 'latest' | |
| enable-cache: true | |
| - name: Install dependencies | |
| run: | | |
| uv sync --frozen --extra dev | |
| - name: Get version from tag | |
| id: get-version | |
| run: | | |
| TAG=${GITHUB_REF#refs/tags/} | |
| VERSION=${TAG#v} | |
| echo "tag=$TAG" >> $GITHUB_OUTPUT | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| echo "Tag: $TAG" | |
| echo "Version: $VERSION" | |
| - name: Verify version matches __version__.py | |
| run: | | |
| TAG_VERSION="${{ steps.get-version.outputs.version }}" | |
| FILE_VERSION=$(python -c "exec(open('src/taskrepo/__version__.py').read()); print(__version__)") | |
| echo "Tag version: $TAG_VERSION" | |
| echo "File version: $FILE_VERSION" | |
| if [ "$TAG_VERSION" != "$FILE_VERSION" ]; then | |
| echo "❌ Version mismatch: tag is $TAG_VERSION but __version__.py has $FILE_VERSION" | |
| exit 1 | |
| fi | |
| echo "✅ Version matches" | |
| - name: Verify CHANGELOG entry exists | |
| run: | | |
| VERSION="${{ steps.get-version.outputs.version }}" | |
| if ! grep -q "## \[$VERSION\]" CHANGELOG.md; then | |
| echo "❌ No CHANGELOG entry found for version $VERSION" | |
| exit 1 | |
| fi | |
| echo "✅ CHANGELOG entry found" | |
| - name: Run linting | |
| run: | | |
| echo "🔍 Running linting..." | |
| uv run ruff check . | |
| uv run ruff format --check . | |
| echo "✅ Linting passed" | |
| - name: Run type checking | |
| continue-on-error: true | |
| run: | | |
| echo "🔎 Running type checking (informational only)..." | |
| uv run mypy src/taskrepo || echo "⚠️ Type checking found issues (non-blocking)" | |
| - name: Run tests | |
| run: | | |
| echo "🧪 Running full test suite..." | |
| uv run pytest tests/ -v | |
| echo "✅ All tests passed" | |
| # Job 2: Build and publish to PyPI | |
| publish-pypi: | |
| name: Publish to PyPI | |
| runs-on: ubuntu-latest | |
| needs: validate | |
| timeout-minutes: 15 | |
| environment: | |
| name: pypi | |
| url: https://pypi.org/project/taskrepo/ | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| - name: Set up Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| version: 'latest' | |
| enable-cache: true | |
| - name: Build package | |
| run: | | |
| echo "📦 Building package..." | |
| uv build | |
| echo "✅ Package built" | |
| ls -lh dist/ | |
| - name: Publish to PyPI | |
| uses: pypa/gh-action-pypi-publish@release/v1 | |
| with: | |
| print-hash: true | |
| # Job 3: Create GitHub Release | |
| create-release: | |
| name: Create GitHub Release | |
| runs-on: ubuntu-latest | |
| needs: [validate, publish-pypi] | |
| timeout-minutes: 10 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 | |
| - name: Set up Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| version: 'latest' | |
| enable-cache: true | |
| - name: Build package | |
| run: | | |
| uv build | |
| - name: Extract release notes from CHANGELOG | |
| id: extract-notes | |
| run: | | |
| VERSION="${{ needs.validate.outputs.version }}" | |
| # Extract the section for this version from CHANGELOG.md | |
| awk "/## \[$VERSION\]/,/## \[/{ | |
| if (/## \[$VERSION\]/) next | |
| if (/## \[/ && !/## \[$VERSION\]/) exit | |
| }" CHANGELOG.md > release_notes.md | |
| # Show what we extracted | |
| echo "📝 Release notes:" | |
| cat release_notes.md | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: ${{ needs.validate.outputs.tag }} | |
| name: Release ${{ needs.validate.outputs.tag }} | |
| body_path: release_notes.md | |
| files: | | |
| dist/*.whl | |
| dist/*.tar.gz | |
| draft: false | |
| prerelease: false | |
| generate_release_notes: true | |
| - name: Post-release summary | |
| run: | | |
| echo "## 🎉 Release ${{ needs.validate.outputs.tag }} Published!" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 📦 Package Information" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Version**: ${{ needs.validate.outputs.version }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **Tag**: ${{ needs.validate.outputs.tag }}" >> $GITHUB_STEP_SUMMARY | |
| echo "- **PyPI**: https://pypi.org/project/taskrepo/${{ needs.validate.outputs.version }}/" >> $GITHUB_STEP_SUMMARY | |
| echo "- **GitHub Release**: ${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ needs.validate.outputs.tag }}" >> $GITHUB_STEP_SUMMARY | |
| echo "" >> $GITHUB_STEP_SUMMARY | |
| echo "### 📥 Installation" >> $GITHUB_STEP_SUMMARY | |
| echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY | |
| echo "pip install taskrepo==${{ needs.validate.outputs.version }}" >> $GITHUB_STEP_SUMMARY | |
| echo "# or" >> $GITHUB_STEP_SUMMARY | |
| echo "uv pip install taskrepo==${{ needs.validate.outputs.version }}" >> $GITHUB_STEP_SUMMARY | |
| echo "\`\`\`" >> $GITHUB_STEP_SUMMARY |