-
Notifications
You must be signed in to change notification settings - Fork 0
119 lines (97 loc) · 3.53 KB
/
release-python.yml
File metadata and controls
119 lines (97 loc) · 3.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# .github/workflows/release-python.yml
# See https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
name: Release Python Package
on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+"
- "v[0-9]+.[0-9]+.[0-9]+-*" # Include pre-release tags
workflow_dispatch:
inputs:
tag:
description: "Git tag to build and release (e.g., v1.2.3). Must already exist."
required: true
jobs:
build_and_testpypi:
name: Build & Publish to TestPyPI
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
ref: ${{ github.event_name == 'push' && github.ref || github.event.inputs.tag }}
- name: Set up uv
uses: astral-sh/setup-uv@v6
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version-file: ".github/workflows/.python-version"
- name: Upload built package artifacts
uses: actions/upload-artifact@v4
with:
name: distribution-packages
path: dist/
retention-days: 7
- name: Download built package artifacts
uses: actions/download-artifact@v4
with:
name: distribution-packages-${{ github.event.inputs.tag }}
path: dist/
- name: Publish to TestPyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.TESTPYPI_API_TOKEN }}
run: uvx nox -s publish-package -- --repository testpypi
- name: Get Release Notes from Changelog
id: changelog
uses: simple-changelog/action@v3
with:
path: CHANGELOG.md
tag: ${{ github.event_name == 'push' && github.ref_name || github.event.inputs.tag }}
outputs:
changelog_body:
description: "Release notes body extracted from CHANGELOG.md"
value: ${{ steps.changelog.outputs.changes }} # Output the extracted changelog body
publish_pypi:
name: Publish to Production PyPI
runs-on: ubuntu-latest
needs: build_and_testpypi
if: "github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')"
steps:
- name: Download package artifacts
uses: actions/download-artifact@v4
with:
name: distribution-packages
path: dist/
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version-file: ".github/workflows/.python-version"
- name: Set up uv
uses: astral-sh/setup-uv@v6
- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: uvx nox -s publish-python
create_github_release:
name: Create GitHub Release
runs-on: ubuntu-latest
needs: build_and_testpypi
if: "github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')"
steps:
- name: Download package artifacts # Get built artifacts for release assets
uses: actions/download-artifact@v4
with:
name: distribution-packages
- name: Get tag name
id: get_tag
run: echo "tag=${{ github.ref_name }}" >> $GITHUB_OUTPUT
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.get_tag.outputs.tag }}
name: Release ${{ steps.get_tag.outputs.tag }}
body: ${{ needs.build_and_testpypi.outputs.changelog_body }}
files: dist/*
prerelease: ${{ contains(steps.get_tag.outputs.tag, '-') }} # Checks if tag contains hyphen (e.g. v1.0.0-rc.1)