如何使用GitHub Actions版本化构建工件?

58

我的使用场景是,我想为每个构建/运行的工件生成唯一的版本号。目前像CircleCI、Travis等工具提供了一个可用的构建编号,该编号基本上是一个不断增加的计数器。因此,我可以创建类似 0.1.0-27 的版本字符串。即使是相同的提交,这个计数器也会每次增加。

如何在GitHub Actions中实现类似的功能?Github Actions只提供GITHUB_SHA和GITHUB_REF。


$GITHUB_EVENT_PATH JSON文件中是否包含可以使用的某种唯一ID? - cspotcode
2
不过,使用GITHUB_SHA难道不是惯用的做法吗? 如果你有几个分支等,计数器很快就会变得混淆。 - maxheld
我已经在 GitHub 上开启了一个讨论,以便将自动递增计数器添加到 GitHub Actions。请去点赞它 :) https://github.com/orgs/community/discussions/64533 - deadlydog
7个回答

108

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 }}

11
重要提示:如果您重新运行该操作,这些数字不会改变。这将导致构建号非常脆弱。 - Javelin
12
@Javelin 我认为可以使用 github.run_attempt 来解决这个问题。 - Anand Rockzz
4
“run_id”和“run_number”的区别对我来说仍然不是非常清楚...? - Josh M.
@JoshM. 据我所知,run_id是唯一的,但并不具有意义。run_number是该作业运行次数的简单计数器,在用户界面上显示得整洁,并且用户可以轻松理解构建序列。但是将run_no作为唯一标识是错误的。只需简单地重命名工作流文件就会重置计数器。因此,您始终希望同时包括run_id和run_number。 - Philip Couling
这些变量对于获取随机唯一ID非常有用,但是对于版本控制来说,有顺序的值更好。我已经发起了这个讨论,希望能在GitHub Actions中添加自动递增计数器。请去投票支持它 :) https://github.com/orgs/community/discussions/64533 - deadlydog

15

我曾遇到同样的问题,现在刚刚创建了一个操作来生成连续的构建编号。使用方法如下:

- uses: einaregilsson/build-number@v1
  with:
    token: ${{secrets.github_token}}

在那之后,您将拥有一个名为 BUILD_NUMBER 的环境变量。有关在不同作业中使用相同构建编号的更多信息,请参见https://github.com/einaregilsson/build-number/ 更新:现在 GitHub Actions 中内置了一个名为 $GITHUB_RUN_NUMBER 的变量,因此不再需要使用此方法。

1
喜欢这里的优雅黑客技巧。使用标签作为状态存储是非常聪明的。 - growse
1
谢谢 :) 我很享受搭建它的过程,在 http://einaregilsson.com/a-github-action-for-generating-sequential-build-numbers/ 写了一些相关内容。 - Einar Egilsson
棒极了。非常聪明的方法。 - MrTristan
github_token应该是什么值?这是需要权限才能执行的令牌吗?我一直收到“凭证无效”的错误提示。 - nashter

1
如果你需要一个常量整数递增(1,2,3,4,5),我在文档中没有找到可以用作此类递增的内容,它能意识到特定操作运行的次数。我可以想到两种解决方案:
  1. 维护仓库上的状态:例如使用一个count.build文件来使用工作流ID并在构建时使其自增。这是我最不喜欢的两个解决方案之一,因为它会增加其他复杂性,比如它本身会触发推送事件。你可以将此文件存储在其他地方,如S3或Gist中。

  2. 使用日期:如果你不担心整数递增的顺序,你可以使用当前的日期和时间,例如今天13:10的0.1.0-201903031310

无论你是否拥有Actions Beta访问权限,我都会向GitHub提供反馈。

希望能帮助到你。


0

你可以使用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\""

0

要存储增量(或任何其他数据字符串),您可以使用存储库变量,但无法像本地ENV变量一样直接设置它们。请使用GitHub Actions API将变量设置为所需的值。

https://docs.github.com/en/rest/actions/variables?apiVersion=2022-11-28

例如

  curl --location --request PATCH 'https://api.github.com/repos/my_org/any_app/actions/variables/BUILD_INCREMENT' \
--header 'Accept: application/vnd.github+json' \
--header 'Authorization: Bearer ghp_Fd6N34L9sometoken' \
--header 'Content-Type: text/plain' \
--header 'X-GitHub-Api-Version: 2022-11-28' \
--data '{"name":"BUILD_INCREMENT","value":"1111"}'

这个解决方案允许您控制增量并在必要时进行编辑。
附言:感谢来自YouTube的Mickey Gousset。他的建议帮助我找到了这些信息。

0

我在我的 Docker 推送中使用它,像这样:


- name: Push Docker image with incremented version tag
  uses: docker/build-push-action@v2
  with:
   context: .
   push: true
   tags: ${{secrets.DOCKER_USERNAME}}/${{secrets.DOCKER_IMAGE_NAME}}:${{ github.run_number }}

0
如果你想提取GitHub的版本号并将其放入一个可以导入到你的应用程序中的JSON文件中,这是我在构建我的应用程序之前所做的事情:
- name: Add version info to json file
    env:
      Version: ${{ github.run_id }}.${{ github.run_number }}.${{ github.run_attempt }}
    run: |
      echo "{\"version\": \"$Version\"}" > /assets/version.json

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接