-
Notifications
You must be signed in to change notification settings - Fork 0
155 lines (129 loc) · 3.72 KB
/
release.yml
File metadata and controls
155 lines (129 loc) · 3.72 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
name: Release
on:
workflow_dispatch:
inputs:
publish_target:
description: "Choose whether to build only, publish to TestPyPI, or publish to PyPI"
required: true
default: dry-run
type: choice
options:
- dry-run
- testpypi
push:
tags:
- "v*"
jobs:
build:
name: Build distribution artifacts
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Set up Python 3.14
uses: actions/setup-python@v6
with:
python-version: "3.14"
- name: Verify release tag matches package version
if: ${{ github.event_name == 'push' }}
run: |
python - <<'PY'
import os
import pathlib
import tomllib
pyproject = pathlib.Path("pyproject.toml")
version = tomllib.loads(pyproject.read_text())["project"]["version"]
ref = os.environ["GITHUB_REF"]
expected_ref = f"refs/tags/v{version}"
if ref != expected_ref:
raise SystemExit(
"Publishing requires running this workflow from the "
f"tag {expected_ref}, but GitHub provided {ref!r}."
)
print(f"Publishing from {ref}, matching project version {version}.")
PY
- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
- name: Build source and wheel distributions
run: uv build
- name: Upload built distributions
uses: actions/upload-artifact@v7
with:
name: python-package-distributions
path: dist/*
if-no-files-found: error
publish-testpypi:
name: Publish to TestPyPI
if: ${{ github.event_name == 'workflow_dispatch' && inputs.publish_target == 'testpypi' }}
needs: build
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
environment:
name: testpypi
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Download built distributions
uses: actions/download-artifact@v8
with:
name: python-package-distributions
path: dist/
- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
- name: Show downloaded files
run: |
pwd
ls -lah
ls -lah dist
- name: Publish distributions to TestPyPI
run: |
uv publish --index testpypi dist/*
publish-pypi:
name: Publish to PyPI
if: ${{ github.event_name == 'push' }}
needs: build
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write
environment:
name: pypi
steps:
- name: Checkout repository
uses: actions/checkout@v6
- name: Download built distributions
uses: actions/download-artifact@v8
with:
name: python-package-distributions
path: dist/
- name: Install uv
uses: astral-sh/setup-uv@v8.1.0
- name: Show downloaded files
run: |
pwd
ls -lah
ls -lah dist
- name: Publish distributions to PyPI
run: uv publish dist/*
github-release:
name: Create GitHub Release
if: ${{ github.event_name == 'push' }}
needs: [build, publish-pypi]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download built distributions
uses: actions/download-artifact@v8
with:
name: python-package-distributions
path: dist/
- name: Create GitHub Release
uses: softprops/action-gh-release@v3
with:
generate_release_notes: true
files: dist/*