用 GitHub Actions 自动打包发布 Python 项目
文章目录
前言
还在手动打包上传 PyPI?GitHub Actions 自动化真香!🌟
在《Python 代码一键转流程图》一文中,我介绍了我的开源项目 PyFlowchart。这段时间,已有好几位朋友为这个项目提出建议或报告 Bug,在他们的帮助下,项目已更新了多个版本。
然而,每次版本更新时,我都需要做很多冗余的工作:
- 在 GitHub 上发布一个 release
- 手动打包并上传到 PyPI
这些步骤十分繁琐,特别是上传 PyPI 的工作非常模板化。于是,我决定用 GitHub Actions 自动化这个过程,让发布新版本时,只需在 GitHub 上创建一个 Release,GitHub Actions 会自动完成构建、打包、上传到 PyPI 的所有工作。
本文将介绍如何利用 GitHub Actions 自动化发布 Python 包到 PyPI。
在 GitHub 上保存 token
在本文中,我们需要上传项目到 PyPI 和 TestPyPI。为此,我们需要创建两个 API token,并将它们保存到 GitHub 仓库的 Secrets 中。
1. 创建 PyPI Token
访问 PyPI API token 页面,创建一个新的 API token。确保将 token 的作用域限制为只能操作当前项目。
生成 token 后,记得保存。该页面会只显示一次 token。
2. 创建 TestPyPI Token
访问 TestPyPI API token 页面,重复步骤,创建 TestPyPI 的 token。
注意:如果你还没有 TestPyPI 账号,需要先注册一个。TestPyPI 和 PyPI 的账号是独立的。
3. 将 Token 保存到 GitHub Secrets
在 GitHub 项目页面,点击 Settings > Secrets,创建两个新的 secrets:
PYPI_API_TOKEN
:用于上传到 PyPITEST_PYPI_API_TOKEN
:用于上传到 TestPyPI
创建 workflow
GitHub CI/CD 工作流程(workflow)是存储在 .github/workflows/
目录下的 YAML 文件。
我们将创建一个名为 publish-to-test-pypi.yml
的文件。
name: Publish Python 🐍 distributions 📦 to PyPI and TestPyPI
on: push
这里定义了工作流程的名称,以及当 push
事件发生时触发工作流程。
定义工作流程的工作环境
接下来,我们为工作(job)设置初始环境。此环境将在 Ubuntu 18.04 上执行任务。
jobs:
build-n-publish:
name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI
runs-on: ubuntu-18.04
签出项目,构建发行版
在 build-n-publish
部分下添加以下步骤:
steps:
- uses: actions/checkout@master
- name: Set up Python 3.7
uses: actions/setup-python@v1
with:
python-version: 3.7
这将把项目代码下载到 CI 运行容器中,并安装 Python 3.7 环境。
构建发行版
在此示例中,我们将使用 build
包来构建发行版,确保项目中已正确设置 pyproject.toml
(参见 PEP 517 / PEP 518)。
- name: Install pypa/build
run: python -m pip install build --user
- name: Build a binary wheel and a source tarball
run: python -m build --sdist --wheel --outdir dist/ .
这些步骤将使用 build
工具生成 .tar.gz
和 .whl
格式的发行版,并保存到 dist/
文件夹。
发布到 PyPI 和 TestPyPI
最后,添加发布步骤:
- name: Publish distribution 📦 to Test PyPI
uses: pypa/gh-action-pypi-publish@master
with:
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
repository_url: https://test.pypi.org/legacy/
- name: Publish distribution 📦 to PyPI
if: startsWith(github.ref, 'refs/tags')
uses: pypa/gh-action-pypi-publish@master
with:
password: ${{ secrets.PYPI_API_TOKEN }}
- 第一个步骤将无条件上传
dist/
文件夹中的内容到 TestPyPI。 - 第二个步骤会在
git tag
的提交上执行,将内容上传到 PyPI。
完事,收工!
现在,每当你将打上标签(tag)的提交推送到 GitHub 时,这个工作流程将会自动发布到 PyPI。对于任何 push 操作,都会将代码打包并上传到 TestPyPI,这对于提供 alpha 测试版本和确保发布渠道的健康非常有用!
版权声明
本文为CSDN博主「CDFMLR」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012419550/article/details/112746782
这篇文章已经经过重新排版,删除了一些冗余部分,并且结构更加清晰易读。希望这对你有帮助!