
"手动构建是快速迭代的大敌。"
要像专业人士一样自动化你的 Flutter 应用交付流程,就看这里。
🧭 导读
欢迎关注我的公众号:OpenFlutter,谢谢
以前,给 Flutter 设置 CI/CD 就像是搞"黑魔法",但现在不同了。有了 GitHub Actions,你现在可以自动化完成:
- ✅ 构建
- ✅ 测试
- ✅ 发布
- ✅ 部署 (Android 和 iOS)
在这篇指南里,我将手把手带你搭建一个完整的 Flutter 应用 CI/CD 流程------从你 提交代码 的那一刻起,直到应用被分发到 TestFlight 和 Firebase 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)
- ✅ Android 的
-
上传构建产物 (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_IDAPP_STORE_CONNECT_API_ISSUER_IDAPP_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 交付流程了吗?
在评论中留下你的配置或问题吧------我很想知道你是如何更快地交付应用的!