如何通过GitHub Actions结合Firebase Remote Config实现Android versionCode自动递增并用于Firebase应用分发?
如何通过GitHub Actions结合Firebase Remote Config实现Android versionCode自动递增并用于Firebase应用分发?
我来帮你搞定这个自动版本递增的问题!你现在的需求是把Android的versionCode和versionName从本地build.gradle移到Firebase Remote Config,通过GitHub Actions自动拉取当前版本、递增versionCode(按需处理versionName)、更新回Remote Config,最后用新的版本号构建APK并分发到Firebase App Distribution对吧?下面一步步来实现:
一、先在Firebase控制台配置初始版本参数
首先得在Firebase Remote Config里把存储版本的参数建好:
- 打开你的Firebase项目控制台,进入「Remote Config」页面
- 点击「添加参数」,创建两个参数:
- 名称:
android_version_code,类型选「整数」,默认值填初始版本码(比如1) - 名称:
android_version_name,类型选「字符串」,默认值填初始版本名(比如1.0.0)
- 名称:
- 配置完后记得点击「发布更改」,让参数生效
二、配置GitHub仓库的Firebase认证信息
要让GitHub Actions能操作Firebase,得先把认证凭证存到仓库的Secrets里:
- 方式一:用Firebase登录令牌
本地终端运行firebase login:ci,跟着提示登录后会得到一个长期有效的令牌,把这个令牌存到GitHub仓库的「Settings → Secrets and variables → Actions」里,命名为FIREBASE_TOKEN - 方式二:用服务账号密钥
在Firebase控制台「项目设置 → 服务账号」里生成新的私钥,把下载的JSON文件内容复制到GitHub Secrets里,命名为FIREBASE_SERVICE_ACCOUNT
三、修改Android项目的build.gradle,支持命令行传入版本号
原来的版本号写在build.gradle的defaultConfig里,现在要改成能读取GitHub Actions传递的参数,同时保留本地构建的默认值:
打开app模块的build.gradle(或build.gradle.kts),修改defaultConfig部分:
defaultConfig { applicationId "com.your.app.package" minSdk 21 targetSdk 33 // 优先读取命令行传入的版本号,没有的话用本地默认值 versionCode project.hasProperty('android.injected.versionCode') ? project.property('android.injected.versionCode').toInteger() : 1 versionName project.hasProperty('android.injected.versionName') ? project.property('android.injected.versionName') : "1.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }
四、编写GitHub Actions Workflow脚本
在你的Android项目根目录创建.github/workflows/build-distribute.yml文件,把下面的内容填进去,注意替换成你自己的Firebase项目ID、测试组名称等信息:
name: 构建并分发APK到Firebase on: # 可以设置成推送到主分支时触发,或者手动触发 push: branches: [ main ] workflow_dispatch: # 如果需要手动指定versionName,可以加这个输入参数 inputs: version_name: description: '手动指定版本名(比如1.1.0)' required: false default: '' jobs: build-and-distribute: runs-on: ubuntu-latest steps: - name: 检出仓库代码 uses: actions/checkout@v4 - name: 配置Java环境(Android构建需要) uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - name: 安装Firebase CLI run: npm install -g firebase-tools - name: 安装jq工具(用于解析Remote Config的JSON) run: sudo apt-get install -y jq - name: Firebase认证 run: firebase login:ci --token ${{ secrets.FIREBASE_TOKEN }} # 如果用服务账号的话,替换成下面的命令: # env: # GOOGLE_APPLICATION_CREDENTIALS: ${{ secrets.FIREBASE_SERVICE_ACCOUNT }} # run: firebase use your-firebase-project-id --add - name: 从Firebase Remote Config拉取当前版本 run: | # 拉取Remote Config配置到本地文件 firebase remoteconfig:get --project your-firebase-project-id > remote_config.json # 解析出当前的versionCode和versionName CURRENT_VERSION_CODE=$(jq -r '.parameters.android_version_code.defaultValue.value' remote_config.json) CURRENT_VERSION_NAME=$(jq -r '.parameters.android_version_name.defaultValue.value' remote_config.json) # 递增versionCode NEW_VERSION_CODE=$((CURRENT_VERSION_CODE + 1)) # 处理versionName:如果手动指定了就用指定的,否则自动递增小版本号 if [ -n "${{ github.event.inputs.version_name }}" ]; then NEW_VERSION_NAME="${{ github.event.inputs.version_name }}" else # 自动递增语义化版本的最后一位(比如1.0.0 → 1.0.1) NEW_VERSION_NAME=$(echo $CURRENT_VERSION_NAME | awk -F. -v OFS=. '{$NF++; print}') fi # 把新的版本号存入环境变量,供后续步骤使用 echo "NEW_VERSION_CODE=$NEW_VERSION_CODE" >> $GITHUB_ENV echo "NEW_VERSION_NAME=$NEW_VERSION_NAME" >> $GITHUB_ENV - name: 更新Firebase Remote Config的版本号 run: | # 生成临时的Remote Config更新配置文件 cat > update_remote_config.json << EOF { "parameters": { "android_version_code": { "defaultValue": { "value": "${{ env.NEW_VERSION_CODE }}" } }, "android_version_name": { "defaultValue": { "value": "${{ env.NEW_VERSION_NAME }}" } } } } EOF # 推送更新到Remote Config firebase remoteconfig:update --config update_remote_config.json --project your-firebase-project-id # 发布更新,让新的版本号生效 firebase remoteconfig:publish --project your-firebase-project-id - name: 构建Release版本APK run: ./gradlew assembleRelease -Pandroid.injected.versionCode=${{ env.NEW_VERSION_CODE }} -Pandroid.injected.versionName=${{ env.NEW_VERSION_NAME }} - name: 分发APK到Firebase App Distribution run: firebase appdistribution:distribute app/build/outputs/apk/release/app-release.apk --project your-firebase-project-id --groups 你的测试组名称
五、关键注意事项
- 确保GitHub Secrets里的Firebase认证凭证有足够权限:服务账号需要拥有「Remote Config编辑器」和「App Distribution分发者」的角色
- 如果你的APK输出路径和示例不一样,要修改分发步骤里的APK路径
- versionName的自动递增逻辑可以根据你的需求调整,比如如果是大版本更新,建议用手动触发Workflow时输入versionName的方式,避免自动递增出错
- 本地构建时,还是可以正常用build.gradle里的默认版本号,或者手动传入版本号测试:
./gradlew assembleRelease -Pandroid.injected.versionCode=10 -Pandroid.injected.versionName=1.1.0
备注:内容来源于stack exchange,提问作者swapnil jadhav
相关产品推荐
相关产品推荐

