GitHub Actions是否存在与Azure Pipelines自定义构建号语法等效的功能?
GitHub Actions 实现.NET Arcade 版本号格式方案
问题结论
你没有遗漏GitHub Actions的内置功能,GitHub Actions原生确实没有直接提供和Azure Pipelines Build.BuildNumber 语义完全匹配的环境变量,需要通过少量自定义逻辑实现同等效果,无需修改原有.NET Arcade的版本号算法。
实现方案
核心逻辑通过日期生成+当日递增序号计算两步完成,完全还原yyyyMMdd.r的格式要求:
- 第一步:生成格式化日期
工作流执行时获取当前UTC日期(推荐统一用UTC避免跨时区部署导致日期跳变),格式化为yyyyMMdd字符串,可直接通过shell/PowerShell命令实现。 - 第二步:计算当日递增序号
r
这里提供两种生产环境常用的实现方案,可根据项目要求选择:- 基于Actions缓存的轻量方案
将上一次构建的日期和当日最大序号r存储在GitHub Actions缓存中,每次构建时做对比:- 如果当前日期和缓存存储的上次构建日期一致,
r直接在上次值基础上加1 - 如果日期不一致,
r重置为1
计算完成后GitHub Actions会自动将新的序号写入缓存,该方案无需额外依赖,序号连续无跳变。
- 如果当前日期和缓存存储的上次构建日期一致,
- 基于工作流运行记录的方案
调用GitHub内置API查询当前工作流当日的成功运行次数,直接将次数作为r,该方案无需维护持久化存储,适合不需要严格序号连续的场景。
- 基于Actions缓存的轻量方案
示例工作流片段(Ubuntu运行器)
jobs: build: runs-on: ubuntu-latest steps: - name: 生成yyyyMMdd格式UTC日期 id: get_date run: echo "date=$(date -u +'%Y%m%d')" >> $GITHUB_OUTPUT - name: 恢复序号缓存 uses: actions/cache@v3 with: path: .build_rev key: build-rev-${{ steps.get_date.outputs.date }} - name: 计算当日递增序号r id: get_rev run: | if [ -f .build_rev ]; then rev=$(($(cat .build_rev) + 1)) else rev=1 fi echo $rev > .build_rev echo "rev=$rev" >> $GITHUB_OUTPUT - name: 生成最终BuildNumber id: get_buildnumber run: echo "build_number=${{ steps.get_date.outputs.date }}.${{ steps.get_rev.outputs.rev }}" >> $GITHUB_OUTPUT # 后续构建步骤中直接引用 ${{ steps.get_buildnumber.outputs.build_number }} 传入.NET Arcade即可
如果使用Windows运行器,将上述shell命令替换为对应的PowerShell语法即可。
内容的提问来源于stack exchange,提问作者NathanAldenSr
相关产品推荐
相关产品推荐

