name: "π Release with UV"
on:
push:
tags:
- 'v*'
release:
types: [created, published]
repository_dispatch:
types: [release-trigger]
workflow_dispatch:
inputs:
tag_name:
description: 'Tag name to release (e.g., v2.0.1)'
required: true
type: string
version:
description: 'Version number (e.g., 2.0.1)'
required: true
type: string
# Permissions needed for release operations
permissions:
contents: write # Required to create releases and upload assets
id-token: write # Required for trusted publishing to PyPI
actions: read # Required to read workflow artifacts
# Cancel previous release runs for the same tag
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
# Setup and validation
setup:
name: "β‘ Setup & Validation"
runs-on: ubuntu-latest
steps:
- name: "π₯ Checkout repository"
uses: actions/checkout@v4
- name: "β‘ Install UV"
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
export PATH="$HOME/.cargo/bin:$PATH"
- name: "π Set up Python"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
uv python install 3.11
- name: "β
Verify UV Installation"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
echo "UV version:"
uv --version
echo "UV Python installations:"
uv python list
echo "β
Setup completed successfully"
- name: "π¦ Install dependencies"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
echo "π¦ Installing project dependencies..."
uv sync --all-groups
echo "β
Dependencies installed"
# Pre-release tests
pre-release-tests:
name: "π§ͺ Pre-Release Tests"
runs-on: ubuntu-latest
needs: setup
steps:
- name: "π₯ Checkout repository"
uses: actions/checkout@v4
- name: "β‘ Install UV"
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
export PATH="$HOME/.cargo/bin:$PATH"
- name: "π Set up Python"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
uv python install 3.11
- name: "π¦ Install dependencies"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
uv sync --all-groups
- name: "π§ͺ Run critical tests"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
echo "π§ͺ Running critical tests before release..."
uv run pytest tests/test_config.py tests/test_config_real.py -v
echo "β
Critical tests passed"
- name: "π Quality check"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
echo "π Running quality checks..."
uv run ruff check src/ tests/
echo "β
Quality checks passed"
# Build package
build:
name: "ποΈ Build Package"
runs-on: ubuntu-latest
needs: [setup, pre-release-tests]
steps:
- name: "π₯ Checkout repository"
uses: actions/checkout@v4
- name: "β‘ Install UV"
run: |
curl -LsSf https://astral.sh/uv/install.sh | sh
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
export PATH="$HOME/.cargo/bin:$PATH"
- name: "π Set up Python"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
uv python install 3.11
- name: "π¦ Install dependencies"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
uv sync --all-groups
- name: "ποΈ Build package"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
echo "ποΈ Building package with UV..."
uv build
echo "β
Package built successfully"
- name: "β
Validate package"
run: |
export PATH="$HOME/.cargo/bin:$PATH"
echo "β
Validating package quality..."
uv run twine check dist/*
echo "β
Package validation passed"
- name: "π¦ Upload build artifacts"
uses: actions/upload-artifact@v4
with:
name: dist-packages
path: dist/
# Production publish to PyPI
publish:
name: "π Publish to PyPI"
runs-on: ubuntu-latest
needs: build
if: always() && needs.build.result == 'success'
environment: production
steps:
- name: "π₯ Checkout repository"
uses: actions/checkout@v4
- name: "π¦ Download build artifacts"
uses: actions/download-artifact@v4
with:
name: dist-packages
path: dist/
- name: "π Publish to PyPI"
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
- name: "β
Production publish completed"
run: echo "π Package published to PyPI successfully!"
# Create GitHub release
github-release:
name: "π·οΈ GitHub Release"
runs-on: ubuntu-latest
needs: [publish]
steps:
- name: "π₯ Checkout repository"
uses: actions/checkout@v4
- name: "π¦ Download build artifacts"
uses: actions/download-artifact@v4
with:
name: dist-packages
path: dist/
- name: "π·οΈ Create GitHub Release"
id: create_release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ github.event.inputs.tag_name || github.ref_name }}
name: Release ${{ github.event.inputs.tag_name || github.ref_name }}
draft: false
prerelease: false
files: dist/*
generate_release_notes: true
- name: "β
GitHub release completed"
run: |
echo "π·οΈ GitHub release created successfully!"
echo "π Release assets available in GitHub Releases page"
# Post-release notifications
post-release:
name: "π’ Post-Release"
runs-on: ubuntu-latest
needs: [github-release]
steps:
- name: "π₯ Checkout repository"
uses: actions/checkout@v4
- name: "π’ Release summary"
run: |
echo "π Release completed successfully!"
echo "π¦ Package: notebooklm-mcp"
echo "π·οΈ Tag: ${{ github.ref }}"
echo "π PyPI: https://pypi.org/project/notebooklm-mcp/"
echo "π GitHub: https://github.com/khengyun/notebooklm-mcp/releases"
echo "β
All release steps completed"