我的使用场景是,我想为每个构建/运行的工件生成唯一的版本号。目前像CircleCI、Travis等工具提供了一个可用的构建编号,该编号基本上是一个不断增加的计数器。因此,我可以创建类似 0.1.0-27
的版本字符串。即使是相同的提交,这个计数器也会每次增加。
如何在GitHub Actions中实现类似的功能?Github Actions只提供GITHUB_SHA和GITHUB_REF。
我的使用场景是,我想为每个构建/运行的工件生成唯一的版本号。目前像CircleCI、Travis等工具提供了一个可用的构建编号,该编号基本上是一个不断增加的计数器。因此,我可以创建类似 0.1.0-27
的版本字符串。即使是相同的提交,这个计数器也会每次增加。
如何在GitHub Actions中实现类似的功能?Github Actions只提供GITHUB_SHA和GITHUB_REF。
GitHub Actions现在在github
上下文中为运行/构建分配了独特的编号和ID。
github.run_id: 存储在存储库中每个工作流运行的唯一编号。如果您重新运行工作流,此编号不会更改。
github.run_number: 存储某个特定工作流程的每个运行的唯一编号。对于工作流的第一次运行,此数字从1开始,并随着每次新运行而递增。如果您重新运行工作流,此编号不会更改。
github.run_attempt: 存储在存储库中某个特定工作流运行的每个尝试的唯一编号。对于工作流运行的第一次尝试,此数字从1开始,并随着每次重新运行而递增。
您可以像这样在工作流程中引用它们:
- 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 }}
github.run_attempt
来解决这个问题。 - Anand Rockzz我曾遇到同样的问题,现在刚刚创建了一个操作来生成连续的构建编号。使用方法如下:
- uses: einaregilsson/build-number@v1
with:
token: ${{secrets.github_token}}
BUILD_NUMBER
的环境变量。有关在不同作业中使用相同构建编号的更多信息,请参见https://github.com/einaregilsson/build-number/
更新:现在 GitHub Actions 中内置了一个名为 $GITHUB_RUN_NUMBER
的变量,因此不再需要使用此方法。维护仓库上的状态:例如使用一个count.build
文件来使用工作流ID并在构建时使其自增。这是我最不喜欢的两个解决方案之一,因为它会增加其他复杂性,比如它本身会触发推送事件。你可以将此文件存储在其他地方,如S3或Gist中。
使用日期:如果你不担心整数递增的顺序,你可以使用当前的日期和时间,例如今天13:10的0.1.0-201903031310
。
无论你是否拥有Actions Beta访问权限,我都会向GitHub提供反馈。
希望能帮助到你。
你可以使用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\""
要存储增量(或任何其他数据字符串),您可以使用存储库变量,但无法像本地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"}'
我在我的 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 }}
- 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
GITHUB_SHA
难道不是惯用的做法吗? 如果你有几个分支等,计数器很快就会变得混淆。 - maxheld