Github Actions中System.getenv获取的VERSION_CODE莫名自增1问题
我在编写GitHub Actions的YAML构建脚本时,通过getVersionCodeRelease.sh脚本生成VERSION_CODE,在GHA步骤中输出为2025000191,但后续执行Gradle构建时,build.gradle.kts里通过System.getenv("VERSION_CODE")获取到的值却变成了2025000192。已经尝试添加--no-configuration-cache参数,但问题依旧,求排查原因。
相关代码
YAML脚本
jobs: build-test-and-deploy: runs-on: ubuntu-latest timeout-minutes: 90 steps: - name: Calculate Version Code run: | echo "VERSION_CODE=$(scripts/getVersionCodeRelease.sh ${{ github.run_number }})" >> $GITHUB_ENV - name: Print Version Code run: | echo "VERSION_CODE=$VERSION_CODE"
Shell脚本
date=$(date "+%y") runNumber=$(printf "%06d\n" $runNumber) versionCode="$date$runNumber" echo $versionCode
Kotlin函数
fun getVersionCodeOverride(): Int { val versionCode = System.getenv("VERSION_CODE").parseIntOrDefault(1) println("Version Code: $versionCode") return versionCode }
1. Shell脚本参数接收错误
你贴出的Shell脚本未将传入的github.run_number赋值给runNumber变量,正确写法需要先接收参数:
runNumber="$1" # 新增这行,获取传入的第一个参数 date=$(date "+%y") runNumber=$(printf "%06d\n" $runNumber) versionCode="$date$runNumber" echo $versionCode
如果缺少这行,$runNumber会是空值,printf会输出000000,但你提到GHA输出为2025000191,说明实际脚本可能存在拼写错误或参数接收逻辑问题,需检查变量赋值是否正确。
2. 环境变量被后续步骤覆盖
检查YAML脚本中,在Calculate Version Code步骤之后到Gradle构建步骤之间,是否有其他步骤通过echo "VERSION_CODE=..." >> $GITHUB_ENV或其他方式修改了VERSION_CODE变量,比如误操作重新计算版本号导致覆盖。
3. Gradle构建前先验证环境变量
在Gradle构建步骤前新增打印步骤,确认环境变量在进入Gradle前是否已经变化:
- name: Verify VERSION_CODE before Gradle run: echo "VERSION_CODE=$VERSION_CODE" - name: Run Gradle build run: ./gradlew assembleRelease
如果此时打印的值已经是2025000192,说明问题出在前面的步骤;如果还是2025000191,说明是Gradle内部逻辑导致的变化。
4. Gradle内部版本号逻辑冲突
检查build.gradle.kts中是否有其他修改versionCode的逻辑:
- 是否存在默认的版本号递增逻辑
- 是否从
gradle.properties等配置文件读取版本号并覆盖环境变量值 - 确认
getVersionCodeOverride函数是否被其他代码逻辑覆盖返回值
5. 排除GitHub Actions运行环境异常
虽然可能性极低,但可以在Gradle步骤中打印时间和运行编号确认:
- name: Print env details run: | echo "Current year: $(date "+%y")" echo "GitHub run number: ${{ github.run_number }}"
排除因跨零点导致年份变化,或运行编号异常的情况。
内容的提问来源于stack exchange,提问作者toshiomagic

