如何使用 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:如何通过终端访问当前构建的日志

GitHub Actions:如何像合并一样构建拉取请求?

如何在 GitHub Actions 中构建的 Dockerfile 中使用 github 令牌并尝试克隆私有存储库?

如何使用带有语义发布 Github 插件的 Github Actions 发布整个目录?