ci: release workflow
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
name: Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build distributions
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v7
|
||||
with:
|
||||
python-version: "3.13"
|
||||
enable-cache: true
|
||||
|
||||
- name: Check tag matches project version
|
||||
run: |
|
||||
uv run --no-project python - <<'PY'
|
||||
import os
|
||||
import re
|
||||
import tomllib
|
||||
from pathlib import Path
|
||||
|
||||
tag = os.environ.get('GITHUB_REF_NAME', '')
|
||||
tag_version = tag[1:] if tag.startswith('v') else tag
|
||||
|
||||
pyproject = tomllib.loads(Path('pyproject.toml').read_text(encoding='utf-8'))
|
||||
project_version = pyproject['project']['version']
|
||||
|
||||
init_version = None
|
||||
init_path = Path('src') / 'takopi' / '__init__.py'
|
||||
if init_path.is_file():
|
||||
m = re.search(r'__version__\s*=\s*"([^"]+)"', init_path.read_text(encoding='utf-8'))
|
||||
if m:
|
||||
init_version = m.group(1)
|
||||
|
||||
if project_version != tag_version:
|
||||
raise SystemExit(f"Tag {tag!r} does not match pyproject version {project_version!r}")
|
||||
if init_version and init_version != project_version:
|
||||
raise SystemExit(
|
||||
f"src/takopi/__init__.py __version__ {init_version!r} does not match pyproject version {project_version!r}"
|
||||
)
|
||||
|
||||
print(f"OK: tag {tag!r} matches version {project_version!r}")
|
||||
PY
|
||||
|
||||
- name: Run tests
|
||||
run: uv run pytest
|
||||
|
||||
- name: Build (wheel + sdist)
|
||||
run: uv build
|
||||
|
||||
- name: Upload dist artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
||||
if-no-files-found: error
|
||||
|
||||
publish:
|
||||
name: Publish to PyPI (trusted publishing)
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: pypi
|
||||
url: https://pypi.org/p/takopi
|
||||
permissions:
|
||||
contents: read
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Download dist artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
||||
|
||||
- name: Publish package distributions to PyPI
|
||||
uses: pypa/gh-action-pypi-publish@release/v1
|
||||
with:
|
||||
packages-dir: dist/
|
||||
skip-existing: true
|
||||
|
||||
github-release:
|
||||
name: Create GitHub Release
|
||||
needs: publish
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
steps:
|
||||
- name: Download dist artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: dist/
|
||||
|
||||
- name: Create GitHub release and upload artifacts
|
||||
uses: softprops/action-gh-release@v2
|
||||
with:
|
||||
generate_release_notes: true
|
||||
files: |
|
||||
dist/*
|
||||
Reference in New Issue
Block a user