【问题标题】:How to version build artifacts using GitHub Actions?如何使用 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 不会是这样做的惯用方式吗?如果您有多个分支机构等,计数器可能会很快变得混乱。

标签: github automation versioning continuous-delivery github-actions


【解决方案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),我在文档中没有找到任何可以用作此类增量的内容,它知道该特定操作运行了多少次。我能想到的解决方案有两种:

  1. 在 repo 上维护状态:例如,使用工作流 ID 的 count.build 文件并在构建时增加它。这是两者中我最不喜欢的解决方案,因为它增加了其他复杂性,例如它本身会触发推送事件。您可以将此文件存储在 S3 等其他位置或 Gist 中。

  2. 使用日期:如果您不担心整数增量的顺序,您可以只使用当前数据和时间,例如 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\""
    

    【讨论】: