通过 github action 发布 poetry 项目到 PYPI

前言

gemini-cli 的基础功能已经完备, 我就计划着把包发布到 pypi 上去, 这样子公司那边开发的工具也可以直接引用, 避免和工作的代码产生直接交集.

python 官方提供了很完善的 github action 发布和自动生成 release 的教程, 但它是基于 pip 和 build 写的, 用 poetry 实现构建依赖管理的项目就需要不少改动了.

而我是直接从 github 官方的 python 发布 workflow 修改而来, 只实现了构建和发布, release 以后再完善了.

需要以下几个步骤

  • 配置 workflow 文件
  • 配置仓库的发布 密钥
  • 在包的发布页面授权github workflow

生成 workflow 文件

脚本内容见下文, https://github.com/{owner}/{repo}/actions/new 通过这个路径进入, 选 python package 再贴入我下面的脚本即可.

配置 token

workflow 脚本中有一个密钥变量 PYPI_API_TOKEN

需要去到 https://pypi.org/manage/account/ PYPI 的个人账户页面, 在下方的 ‘API tokens` 中生成一个记下来备用.

这个 token 在本地 deploy 也需要用到, 所以到这一步之前应该已经拿到了.

接着, 进入 https://github.com/${owner}/${repo}/settings/secrets/actions

在 Repository secrets 中配置上 pypi 上生成的 api token, 这样子脚本中就能顺利地获取到发布 token 了.

授权 github workflow

和本地发布不同, github 发布需要在 PYPI 中注册 项目信息和 workflow 文件名.

以 gemini-cil 为例, 打开以下链接, 进入发布配置页面

https://pypi.org/manage/project/gemini-cli/settings/publishing/

在 Trusted Publisher Management 配置自己的 github 项目名和 workflow 文件名 (注意是 xxx.yml 文件名)

如果这里不进行授权, 那么 github workflow 会报 403 错误
PYPI 还支持必须带上相应环境变量才放行, 我这里就用不到了.

workflow 脚本内容

以下是完整的发布脚本

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
# This workflow will upload a Python Package using Twine when a release is created
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python#publishing-to-package-registries

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

name: Upload Python Package

on:
release:
types: [published]

permissions:
contents: read

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v3
with:
python-version: '3.x'
- name: Install Poetry
uses: snok/install-poetry@v1
- name: Install dependencies
run: |
python -m pip install --upgrade pip
poetry install --no-root --only=main
- name: Build package
run: poetry build
- name: Publish package
uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}

引用