如何使用 github 操作发布 pip ***
Posted
技术标签:
【中文标题】如何使用 github 操作发布 pip ***【英文标题】:How to publish pip wheels using github actions 【发布时间】:2021-05-27 20:48:41 【问题描述】:也许是一个广泛的问题,但我认为这与任何使用 github 的 python 包维护者相关,并且可以显着减少他们的工作量,所以希望所拥有的权力能够让它站稳脚跟。
基本上,在我看来:
为 python 构建和发布***很好,但有时它们必须特定于操作系统才能正常工作(即构建在类似的 OS/Env 上) Github 操作提供了广泛的操作系统来运行作业(目前免费),因此可以用来构建这些*** Github 操作可轻松用于通过 twine 发布 sidst所以我的问题是:
是否有一种直接的方法可以为一堆环境构建***(例如,在 github 操作中使用 OS/env 矩阵)然后通过 github 操作将它们全部发布。通过将它们聚合在一个地方然后运行一些麻线命令?问题似乎是无法通过 github 操作在不同的 envs/vms 设置之间进行通信。我可以想到各种解决方案,例如一个中间 s3 存储桶,但我可能对 pypi 和/或 github 操作在这方面的工作方式有很大的误解,所以我可能正在浏览一个非常简单的问题。
【问题讨论】:
您不需要收集已构建的***——您只需用twine
一个一个地推动它们。每个虚拟机为一个特定的操作系统构建一个***,然后发布一个***。
示例:这就是我为CheetahTemplates 制造***的方式; GitHub 的源代码包括 Travis CI 和 AppVeyor CI 的配置。在 Travis I run 带有 Linux 和 OSX 的虚拟机;在 AppVeyor w32/w64。结果是pypi.org/project/Cheetah3/3.2.6.post1/#files
对于 Github Actions 应该是一样的。每项工作都推动一个***。
这不会导致版本发布到 pypi 和所有***都被推动之间的“lul”吗?所以你有 20 到 30 分钟的时间来安装 pip ,基本上
就像@phd 提到的那样,拥有一个操作系统矩阵似乎更有意义,每个作业都在其中构建并推送它自己的工件。但是,您可以通过一项工作来聚合矩阵的所有结果并将所有内容推送到一个位置。如果您愿意,我可以向您展示工作流程结构,但不幸的是,我不知道 pip 和 twine 的细节或命令。
【参考方案1】:
正如我在评论中提到的,这是一种运行并行构建的可能方式,但只需一次上传:
name: 'Aggregation'
on: [push]
env:
ARTIFACT: artifact.bin
jobs:
build:
runs-on: $ matrix.os
strategy:
matrix:
os:
- windows-latest
- ubuntu-latest
- macos-latest
steps:
- uses: actions/checkout@v2
- shell: bash
run: |
echo "Run your build command here"
echo "This is a fake $ matrix.os build artifact" >$ARTIFACT
- uses: actions/upload-artifact@v2
with:
name: build-$ matrix.os -$ github.sha
path: $ env.ARTIFACT
publish:
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/download-artifact@v2
with:
path: artifacts
- shell: bash
working-directory: artifacts
run: |
for i in $( ls ); do
cat $i/$ARTIFACT
done
每个矩阵作业都构建并上传自己的工件到 github。 发布作业等待所有先前的作业完成,然后下载所有工件并在本例中迭代它们。另一个好处是,如果任何矩阵作业失败,则发布将失败。当然,只有在所有操作系统上的构建步骤和命令都相同时,这才是简单的。
以下是测试运行的一些屏幕截图:
生成的工件:
发布作业的输出:
【讨论】:
以上是关于如何使用 github 操作发布 pip ***的主要内容,如果未能解决你的问题,请参考以下文章
如何从 github 上的 master 分支安装 pip 模块? [复制]
如何使用 pip 安装来自 github 的 egg 文件,而不是在当前目录中,而是在 conda env 目录中?
从 3.4 升级后如何在 python3.5 中使用 pip?