如何使用 GitHub Actions 对构建工件进行版本化?
Posted
技术标签:
【中文标题】如何使用 GitHub Actions 对构建工件进行版本化?【英文标题】:How to version build artifacts using GitHub Actions? 【发布时间】:2019-06-16 00:41:03 【问题描述】:我的用例是我希望每次构建/运行都有一个唯一的工件版本号。使用当前的工具,如 CircleCI、Travis 等,有一个可用的内部版本号,基本上是一个始终上升的计数器。所以,我可以创建像0.1.0-27
这样的版本字符串。即使对于相同的提交,每次都会增加此计数器。
如何使用 GitHub Actions 做类似的事情? Github 操作仅提供 GITHUB_SHA 和 GITHUB_REF。
【问题讨论】:
$GITHUB_EVENT_PATH JSON 文件是否包含某种可以使用的唯一 ID?GITHUB_SHA
不会是这样做的惯用方式吗?如果您有多个分支机构等,计数器可能会很快变得混乱。
【参考方案1】:
GitHub Actions 现在在 github
上下文中为运行/构建提供了唯一编号和 ID。
github.run_id :存储库中运行的每个工作流的唯一编号。如果您重新运行工作流运行,此数字不会更改。
github.run_number :存储库中特定工作流每次运行的唯一编号。对于工作流的第一次运行,此数字从 1 开始,并随着每次新运行而递增。如果您重新运行工作流运行,此数字不会更改。
github.run_attempt :在存储库中运行的特定工作流的每次尝试的唯一编号。对于工作流运行的第一次尝试,此数字从 1 开始,并随着每次重新运行而递增。
参考:https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#github-context
您可以在这样的工作流程中引用它们:
- name: Output Run ID
run: echo $ github.run_id
- name: Output Run Number
run: echo $ github.run_number
- name: Output Run Attempt
run: echo $ github.run_attempt
【讨论】:
重要提示:如果您重新运行该操作,这些数字不会改变。这使得内部版本号非常脆弱。 @Javelin 我认为这可以使用github.run_attempt
来解决【参考方案2】:
我遇到了同样的问题,刚刚创建了一个操作来生成顺序内部版本号。像这样使用它
- uses: einaregilsson/build-number@v1
with:
token: $secrets.github_token
在之后的步骤中,您将拥有一个 BUILD_NUMBER
环境变量。在https://github.com/einaregilsson/build-number/https://github.com/einaregilsson/build-number/
更新:现在 GitHub Actions 中内置了一个 $GITHUB_RUN_NUMBER
变量,因此不再需要这种方法。
【讨论】:
喜欢这里优雅的 hack。将标签用作国营商店非常棒。 谢谢 :) 我在构建它时玩得很开心,在 einaregilsson.com/… 上写了一些关于它的文章 好极了。非常聪明的方法 gihub_token 的值应该是多少?这是一个需要许可才能做什么的令牌吗?我收到了“错误凭据”。【参考方案3】:如果您想要一个恒定的整数增量 (1,2,3,4,5),我在文档中没有找到任何可以用作此类增量的内容,它知道该特定操作运行了多少次。我能想到的解决方案有两种:
在 repo 上维护状态:例如,使用工作流 ID 的 count.build
文件并在构建时增加它。这是两者中我最不喜欢的解决方案,因为它增加了其他复杂性,例如它本身会触发推送事件。您可以将此文件存储在 S3 等其他位置或 Gist 中。
使用日期:如果您不担心整数增量的顺序,您可以只使用当前数据和时间,例如 0.1.0-201903031310
表示今天 13:10 .
无论您是否拥有 Actions Beta 访问权限,我都一定会将其反馈给 GitHub。
希望对你有帮助。
【讨论】:
【参考方案4】:您可以使用 GitVersion 从 Git 中的标签生成递增版本。 https://github.com/GitTools/GitVersion/pull/1787的PR有一些细节,但基本上你可以定义这个工作:
- uses: actions/checkout@v1
- name: Get Git Version
uses: docker://gittools/gitversion:5.0.2-beta1-34-linux-debian-9-netcoreapp2.1
with:
args: /github/workspace /nofetch /exec /bin/sh /execargs "-c \"echo $GitVersion_MajorMinorPatch > /github/workspace/version.txt\""
【讨论】:
以上是关于如何使用 GitHub Actions 对构建工件进行版本化?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用可重用的Github Actions和Heroku构建简单的部署管道
如何使用 Github Actions 发布对 Docker 镜像的更改
GitHub Actions:如何通过终端访问当前构建的日志