1+ name : Publish Python 🐍 distribution 📦 to PyPI and TestPyPI
2+
3+ on : push
4+
5+ jobs :
6+ build :
7+ name : Build distribution 📦
8+ runs-on : ubuntu-latest
9+
10+ steps :
11+ - uses : actions/checkout@v4
12+ - name : Set up Python
13+ uses : actions/setup-python@v5
14+ with :
15+ python-version : " 3.x"
16+ - name : Install pypa/build
17+ run : >-
18+ python3 -m
19+ pip install
20+ build
21+ --user
22+ - name : Build a binary wheel and a source tarball
23+ run : python3 -m build
24+ - name : Store the distribution packages
25+ uses : actions/upload-artifact@v4
26+ with :
27+ name : python-package-distributions
28+ path : dist/
29+
30+ publish-to-pypi :
31+ name : >-
32+ Publish Python 🐍 distribution 📦 to PyPI
33+ if : startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes
34+ needs :
35+ - build
36+ runs-on : ubuntu-latest
37+ environment :
38+ name : pypi
39+ url : https://pypi.org/p/<package-name> # Replace <package-name> with your PyPI project name
40+ permissions :
41+ id-token : write # IMPORTANT: mandatory for trusted publishing
42+
43+ steps :
44+ - name : Download all the dists
45+ uses : actions/download-artifact@v4
46+ with :
47+ name : python-package-distributions
48+ path : dist/
49+ - name : Publish distribution 📦 to PyPI
50+ uses : pypa/gh-action-pypi-publish@release/v1
51+
52+ github-release :
53+ name : >-
54+ Sign the Python 🐍 distribution 📦 with Sigstore
55+ and upload them to GitHub Release
56+ needs :
57+ - publish-to-pypi
58+ runs-on : ubuntu-latest
59+
60+ permissions :
61+ contents : write # IMPORTANT: mandatory for making GitHub Releases
62+ id-token : write # IMPORTANT: mandatory for sigstore
63+
64+ steps :
65+ - name : Download all the dists
66+ uses : actions/download-artifact@v4
67+ with :
68+ name : python-package-distributions
69+ path : dist/
70+ - name : Sign the dists with Sigstore
71+ 72+ with :
73+ inputs : >-
74+ ./dist/*.tar.gz
75+ ./dist/*.whl
76+ - name : Create GitHub Release
77+ env :
78+ GITHUB_TOKEN : ${{ github.token }}
79+ run : >-
80+ gh release create
81+ '${{ github.ref_name }}'
82+ --repo '${{ github.repository }}'
83+ --notes ""
84+ - name : Upload artifact signatures to GitHub Release
85+ env :
86+ GITHUB_TOKEN : ${{ github.token }}
87+ # Upload to GitHub Release using the `gh` CLI.
88+ # `dist/` contains the built packages, and the
89+ # sigstore-produced signatures and certificates.
90+ run : >-
91+ gh release upload
92+ '${{ github.ref_name }}' dist/**
93+ --repo '${{ github.repository }}'
94+
95+ publish-to-testpypi :
96+ name : Publish Python 🐍 distribution 📦 to TestPyPI
97+ needs :
98+ - build
99+ runs-on : ubuntu-latest
100+
101+ environment :
102+ name : testpypi
103+ url : https://test.pypi.org/p/<package-name>
104+
105+ permissions :
106+ id-token : write # IMPORTANT: mandatory for trusted publishing
107+
108+ steps :
109+ - name : Download all the dists
110+ uses : actions/download-artifact@v4
111+ with :
112+ name : python-package-distributions
113+ path : dist/
114+ - name : Publish distribution 📦 to TestPyPI
115+ uses : pypa/gh-action-pypi-publish@release/v1
116+ with :
117+ repository-url : https://test.pypi.org/legacy/
118+
0 commit comments