Flutter项目GitHub Action+Firebase分发:版本与发布笔记不匹配问题
问题诊断与修复方案
你的GitHub Action配置存在几个关键问题,导致Firebase显示的版本和发布笔记不符合预期:
1. 目录切换无效,导致构建路径错误
每个run步骤在独立的Shell中执行,cd app和cd lib不会改变后续步骤的工作目录,这会导致flutter build apk命令在根目录执行,而非app目录下,可能生成的APK版本未正确关联标签。
2. 标签消息获取逻辑错误
- 你引用了
steps.extract_version.outputs.tag,但该步骤的输出是version,不存在tag变量,导致git命令执行失败。 - 未将标签消息设置为步骤输出,因此
steps.get_tag_message.outputs.tag-message为空。 - 使用
%m格式符错误,该符号用于显示提交的说明文字,获取标签注释应使用%(contents)或%b。
3. 发布笔记变量引用错误
steps.get_tag_message.outputs.tag-message是错误的变量名,需要和步骤中设置的输出名一致。
修复后的完整main.yml配置
name: Music Metric on: push: tags: - '*' jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 # 确保获取完整标签历史 with: fetch-depth: 0 - uses: actions/setup-java@v2 with: distribution: "zulu" java-version: "11" - name: Decode google-services.json env: GOOGLE_SERVICES_JSON: ${{ secrets.GOOGLE_SERVICES_JSON }} run: echo "$GOOGLE_SERVICES_JSON" > android/app/google-services.json - name: Decode firebase_option env: firebase_options_dart: ${{secrets.FIREBASE_OPTION}} run : echo "$firebase_options_dart" > app/lib/firebase_options.dart - uses: subosito/flutter-action@v2 with: channel: "stable" - run: dart pub global activate melos - run: melos bootstrap - run: melos gen-strings - run: flutter pub get - run: melos build-resources # 修复目录切换问题:在app目录下执行后续Flutter命令 - name: Build Flutter APK working-directory: ./app run: | flutter pub get flutter clean flutter build apk lib/main.dart - uses: actions/upload-artifact@v1 with: name: release-apk path: app/build/app/outputs/apk/release/app-release.apk - name: Extract Version from Tag id: extract_version run: echo "::set-output name=version::$(echo ${{ github.ref_name }} | sed -n 's/^v//p')" - name: Fetch Tag Message id: get_tag_message run: | # 获取标签的注释内容 TAG_MESSAGE=$(git tag -l --format='%(contents)' ${{ github.ref_name }}) # 如果标签是轻量标签(无注释),则使用标签名作为默认 if [ -z "$TAG_MESSAGE" ]; then TAG_MESSAGE="${{ github.ref_name }}" fi echo "::set-output name=message::$TAG_MESSAGE" - name: Upload Artifact to Firebase App Distribution uses: wzieba/Firebase-Distribution-Github-Action@v1 with: appId: ${{ secrets.APPID }} token: ${{ secrets.TOKEN }} groups: pre-tester file: app/build/app/outputs/apk/release/app-release.apk releaseNotes: "Release for ${{ github.ref_name }}\n\n${{ steps.get_tag_message.outputs.message }}" releaseNotesFile: '' appRelease: ${{ steps.extract_version.outputs.version }}
关键修改说明
- 添加
fetch-depth: 0:确保actions/checkout获取完整的Git历史,包括标签注释信息。 - 修复目录构建:使用
working-directory: ./app指定在app目录下执行Flutter构建命令,避免目录切换无效的问题。 - 版本提取优化:使用
github.ref_name直接获取标签名(比如v1.0.7),比解析github.ref更简洁。 - 标签消息获取修复:
- 使用
git tag -l --format='%(contents)'获取标签的注释内容。 - 添加空值判断,避免轻量标签(无注释)时发布笔记为空。
- 通过
echo "::set-output name=message::$TAG_MESSAGE"将标签消息设置为步骤输出。
- 使用
- 修正发布笔记变量:使用
steps.get_tag_message.outputs.message引用正确的输出变量。 - 修正APK路径:上传的APK路径改为
app/build/app/outputs/apk/release/app-release.apk,对应修复后的构建目录。
另外,建议你检查Flutter项目app/pubspec.yaml中的version字段,确保它与Git标签一致(比如1.0.7+1),因为Firebase App Distribution有时会优先读取APK内置的版本号,如果两者不一致,可能导致显示异常。
内容的提问来源于stack exchange,提问作者khacduy
相关产品推荐
相关产品推荐

