🚀 使用 GitHub Actions 自动化 Flutter CI/CD — Android 和 iOS (TestFlight) 部署

"手动构建是快速迭代的大敌。"

要像专业人士一样自动化你的 Flutter 应用交付流程,就看这里。

🧭 导读

欢迎关注我的公众号:OpenFlutter,谢谢

以前,给 Flutter 设置 CI/CD 就像是搞"黑魔法",但现在不同了。有了 GitHub Actions,你现在可以自动化完成:

  • ✅ 构建
  • ✅ 测试
  • ✅ 发布
  • ✅ 部署 (Android 和 iOS)

在这篇指南里,我将手把手带你搭建一个完整的 Flutter 应用 CI/CD 流程------从你 提交代码 的那一刻起,直到应用被分发到 TestFlightFirebase App Distribution ------所有这一切都由 GitHub Actions 驱动。

无论你是单打独斗的开发者还是团队合作,这套配置都能为你省下无数时间,让你的应用交付变得超级靠谱。我们开始吧!


✨ 为什么选择 GitHub Actions 来做 Flutter?

在开始之前,我先简单说说为什么我选了 GitHub Actions:

  • 原生集成:直接在 GitHub 里用,不用装额外的工具。
  • 免费额度:公共仓库完全免费,私有仓库的额度也很大方。
  • 强大生态 :有超多现成的 Action 可以直接用。
  • 一次配置,终身受用 :你只需要写一次 YAML 文件,你的应用就会永远自动构建下去!

🧱 CI/CD 流程概览

我们的 GitHub Actions 流程将会做这些事:

  • 在你向 main 分支 推送代码或提交 PR (Pull Request) 时自动运行。

  • 检出你的 Flutter 仓库

  • 安装 Flutter SDK

  • 运行 代码分析 (analyze) 和 测试 (test)。

  • 构建应用

    • Android.apk 文件
    • iOS.ipa 文件(用于 TestFlight)
  • 上传构建产物 (Artifacts)

  • 分发应用 到:

    • Firebase App Distribution (给 Android 测试人员)
    • TestFlight (通过 Fastlane )

🔧 第一步:准备你的项目

  • ✅ 你的 Flutter 项目必须已经在 GitHub 上进行版本控制。
  • ✅ 确保你能在本地成功构建你的应用。

arduino 复制代码
flutter clean  
flutter build apk  
flutter build ios --release

💡 iOS 构建你需要用到 macOS 运行器(稍后会详细介绍)。

🏗️ 第二步:创建 GitHub 工作流

bash 复制代码
.github/workflows/flutter_ci_cd.yml

粘贴以下起始 YAML 代码:

yaml 复制代码
name: Flutter CI/CD

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-android:
    name: Build Android APK
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.19.0'
          channel: stable

      - name: Install dependencies
        run: flutter pub get

      - name: Analyze code
        run: flutter analyze

      - name: Run tests
        run: flutter test

      - name: Build APK
        run: flutter build apk --release

      - name: Upload artifact
        uses: actions/upload-artifact@v3
        with:
          name: android-apk
          path: build/app/outputs/flutter-apk/app-release.apk  

✅ 这样就完成了构建,并把你的 APK 作为 "构建产物 (artifact)" 上传了。


☁️ 第三步:Firebase 应用分发(可选)

如果你想把 Android 构建 分发给测试人员:

A. 添加 Firebase CI Token

在终端中运行:

复制代码
firebase login:ci

将这个令牌(Token)保存为一个名为以下名称的 GitHub Secret:

复制代码
FIREBASE_TOKEN

B.添加分发过程:

yaml 复制代码
      - name: Distribute APK via Firebase
        run: |
          firebase appdistribution:distribute build/app/outputs/flutter-apk/app-release.apk \
            --app ${{ secrets.FIREBASE_APP_ID }} \
            --groups testers \
            --token ${{ secrets.FIREBASE_TOKEN }}

✅ 恭喜,你已经自动化了你的 Android 分发流程 🎉


🍎 第四步:iOS 构建 + TestFlight 部署

这部分只会在 macOS 上运行 ,因为需要Xcode环境。

添加第二个 Job(作业/任务):

yaml 复制代码
  build-ios:
    name: Build iOS for TestFlight
    runs-on: macos-latest
    needs: build-android

    steps:
      - uses: actions/checkout@v3

      - name: Set up Flutter
        uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.19.0'

      - name: Install dependencies
        run: flutter pub get

      - name: Build iOS
        run: flutter build ios --release --no-codesign

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.2'

      - name: Install Fastlane
        run: gem install fastlane

      - name: Fastlane Match Setup
        run: |
          bundle exec fastlane match appstore
        env:
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          GIT_AUTHORIZATION: ${{ secrets.MATCH_GIT_AUTH }}

      - name: Deploy to TestFlight
        run: |
          cd ios
          fastlane beta
        env:
          APP_STORE_CONNECT_API_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }}
          APP_STORE_CONNECT_API_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_ISSUER_ID }}
          APP_STORE_CONNECT_API_KEY: ${{ secrets.APP_STORE_CONNECT_API_KEY }}

你需要做的是:

在你的** ios/ 文件夹内设置Fastlane

bash 复制代码
cd ios  
fastlane init

将 App Store API 密钥存储在 GitHub Secrets 中:

  • APP_STORE_CONNECT_API_KEY_ID
  • APP_STORE_CONNECT_API_ISSUER_ID
  • APP_STORE_CONNECT_API_KEY (经过 Base64 编码的 .p8 文件内容)

设置 match 或使用基于 App Store Connect API 的身份验证。


✅ 大功告成。现在,每次你推送到 main 分支时,TestFlight 部署都会自动运行了。


📦 第五步:福利 --- 缓存依赖项

通过缓存依赖项来加快速度:

yaml 复制代码
      - name: Cache Flutter packages
        uses: actions/cache@v3
        with:
          path: |
            ~/.pub-cache
          key: ${{ runner.os }}-pub-${{ hashFiles('**/pubspec.lock') }}
          restore-keys: ${{ runner.os }}-pub-

🔚 总结与展望

CI/CD 不仅仅适用于大团队------即使你只是一个独立开发者,它也是颠覆性的GitHub Actions 是一种免费、灵活且强大的方式,能让你的移动开发流程提升一个档次。

无论你是在推送最小可行产品(MVP )还是发布到 App Store,一个可靠的交付流程都能让你省心,并确保交付成果的完美无瑕。


📘 拓展资源


👋 轮到你了

你已经自动化你的 Flutter 交付流程了吗?

在评论中留下你的配置或问题吧------我很想知道你是如何更快地交付应用的!

相关推荐
濑户川4 小时前
Vue3 项目创建指南(Vue-CLI vs Vite 对比)
前端·javascript·vue.js
Mintopia4 小时前
🚀 Next.js 16 新特性深度解析:当框架开始思考人生
前端·后端·全栈
鼓掌MVP4 小时前
Rust Web实战:构建高性能并发工具的艺术
开发语言·前端·rust·异步编程·内存安全·actix-web·高性能web服务
Mintopia4 小时前
🌌 元宇宙 Web 场景中,AIGC 驱动的虚拟内容生成技术
前端·javascript·aigc
excel4 小时前
一文彻底搞懂 Vue3 中 ref 的源码实现(含详细注释)
前端
鹏多多4 小时前
react-konva实战指南:Canvas高性能+易维护的组件化图形开发实现教程
前端·javascript·react.js
excel4 小时前
一文彻底搞懂 Vue 中的 key(含 Vue2 / Vue3 对比)
前端
冰暮流星5 小时前
css新增盒子属性——尺寸调节
前端·css
程序员爱钓鱼5 小时前
Python编程实战 - 函数与模块化编程 - 函数的定义与调用
前端·后端·python