生成每日构建版本号时,当日构建次数无法递增的问题排查
问题根源分析
你的代码存在两个核心错误,导致当日构建次数无法递增:
1. 数组长度计算逻辑错误
你试图用${#BUILDS_TODAY[@]}获取当日构建次数,但:
BUILDS_TODAY=$(seq ...)的结果是字符串,不是数组。在Bash中,直接赋值的字符串会被当作数组的单个元素,因此${#BUILDS_TODAY[@]}永远返回1,和实际内容无关。- 你的
seq命令语法完全错误:seq的参数顺序是seq [起始值] [结束值],当你传入${{ github.run_number }}和${{ github.run_number }} -1时,起始值大于结束值,seq不会生成任何有效序列,最终BUILDS_TODAY是空字符串,但依然被当作数组的一个元素,长度还是1。
2. 当日构建次数的计算逻辑错误
github.run_number是仓库全局的工作流运行计数器,每次触发工作流都会递增,跨天不会重置。用它来计算当日构建次数完全不成立,无法区分不同日期的构建记录。
正确实现方案
要获取当日构建次数,需要依赖外部存储或GitHub API来统计当日的工作流运行次数,以下是两种可行方案:
方案一:通过GitHub API查询当日运行次数(无需额外存储)
利用GitHub API查询当前工作流当日的运行记录数,直接计算当日构建次数:
# 先在工作流开头添加权限声明 permissions: actions: read - name: Generate Build Version Number id: GET_BUILD_VERSION run: | # 格式化当日日期为YYYY-MM-DD,匹配GitHub API的时间格式 TODAY=$(date +%Y-%m-%d) # 查询当日该工作流的总运行次数 BUILDS_TODAY=$(gh api repos/${{ github.repository }}/actions/workflows/${{ github.workflow_id }}/runs \ --method GET \ --field per_page=100 \ --field created="$TODAY" \ --jq '.total_count') # 首次构建时total_count为0,所以加1得到当前次数 CURRENT_BUILD=$((BUILDS_TODAY + 1)) BUILD_VERSION_GENERATED=$(date +v%Y.%m%d.$CURRENT_BUILD) echo "Generated Build Version: $BUILD_VERSION_GENERATED" echo "BUILD_VERSION=$BUILD_VERSION_GENERATED" >> $GITHUB_ENV echo "BUILD=true" >> $GITHUB_ENV echo "::set-output name=build_version::$BUILD_VERSION_GENERATED" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
方案二:用仓库变量存储当日计数(不依赖API)
通过仓库变量维护当日日期和计数,跨天自动重置:
# 先在工作流开头添加权限声明 permissions: repository-variables: write - name: Generate Build Version Number id: GET_BUILD_VERSION run: | TODAY=$(date +%Y%m%d) # 读取已存储的日期和计数,不存在则返回空/0 STORED_DATE=$(gh variable get BUILD_DATE --repo ${{ github.repository }} 2>/dev/null || echo "") STORED_COUNT=$(gh variable get BUILD_COUNT --repo ${{ github.repository }} 2>/dev/null || echo "0") if [ "$STORED_DATE" = "$TODAY" ]; then # 同一天,计数递增 NEW_COUNT=$((STORED_COUNT + 1)) else # 新的一天,重置计数为1并更新日期 NEW_COUNT=1 gh variable set BUILD_DATE --repo ${{ github.repository }} --body "$TODAY" fi # 更新仓库中的计数变量 gh variable set BUILD_COUNT --repo ${{ github.repository }} --body "$NEW_COUNT" BUILD_VERSION_GENERATED=$(date +v%Y.%m%d.$NEW_COUNT) echo "Generated Build Version: $BUILD_VERSION_GENERATED" echo "BUILD_VERSION=$BUILD_VERSION_GENERATED" >> $GITHUB_ENV echo "BUILD=true" >> $GITHUB_ENV echo "::set-output name=build_version::$BUILD_VERSION_GENERATED" env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
内容的提问来源于stack exchange,提问作者merilstack
相关产品推荐
相关产品推荐

