You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }}

关键修改说明

  1. 添加fetch-depth: 0:确保actions/checkout获取完整的Git历史,包括标签注释信息。
  2. 修复目录构建:使用working-directory: ./app指定在app目录下执行Flutter构建命令,避免目录切换无效的问题。
  3. 版本提取优化:使用github.ref_name直接获取标签名(比如v1.0.7),比解析github.ref更简洁。
  4. 标签消息获取修复:
    • 使用git tag -l --format='%(contents)'获取标签的注释内容。
    • 添加空值判断,避免轻量标签(无注释)时发布笔记为空。
    • 通过echo "::set-output name=message::$TAG_MESSAGE"将标签消息设置为步骤输出。
  5. 修正发布笔记变量:使用steps.get_tag_message.outputs.message引用正确的输出变量。
  6. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:34:58