一、环境准备
1. 基础环境要求
-
Jenkins Server:已安装JDK 11+,建议使用Linux服务器(Ubuntu/CentOS)
-
Flutter SDK:全局安装或通过工具动态管理
-
构建代理节点 :
- Android构建:需Android SDK、Gradle、NDK(可选)
- iOS构建:必须使用Mac节点,安装Xcode、CocoaPods
-
推荐插件 :
bashFlutter Plugin # Flutter环境管理 Android Emulator Plugin # 模拟器测试 Fastlane Plugin # iOS自动化部署 Blue Ocean # 流水线可视化
2. Flutter环境配置(以Linux为例)
bash
# 在Jenkins全局工具配置中添加Flutter
sudo mkdir /opt/flutter
sudo git clone https://github.com/flutter/flutter.git /opt/flutter
export PATH="$PATH:/opt/flutter/bin"
flutter doctor
二、Pipeline核心流程设计
1. 典型CI/CD流程
代码提交 触发构建 安装依赖 代码分析 单元测试 构建APK/IPA 部署测试环境 生成报告
2. Jenkinsfile示例(多平台)
groovy
pipeline {
agent any
environment {
FLUTTER_HOME = '/opt/flutter'
PATH = "$FLUTTER_HOME/bin:$PATH"
}
stages {
stage('Setup') {
steps {
sh 'flutter doctor -v'
sh 'flutter pub get'
}
}
stage('Analyze') {
steps {
sh 'flutter analyze'
}
}
stage('Test') {
parallel {
stage('Unit Test') {
steps { sh 'flutter test' }
}
stage('Widget Test') {
steps { sh 'flutter test integration_test/' }
}
}
}
stage('Build') {
parallel {
stage('Android') {
when { branch 'dev' }
steps {
sh '''
flutter build apk --release \
--dart-define=API_ENV=prod \
--target-platform android-arm64
'''
archiveArtifacts artifacts: 'build/app/outputs/flutter-apk/*.apk'
}
}
stage('iOS') {
agent { label 'mac' } // 指定Mac节点
when { branch 'release' }
steps {
sh '''
flutter build ipa --export-options-plist=ios/ExportOptions.plist \
--dart-define=API_ENV=prod
'''
stash name: 'ios_build', includes: 'build/ios/ipa/*.ipa'
}
}
}
}
stage('Deploy') {
steps {
script {
if (env.BRANCH_NAME == 'release') {
sh 'fastlane deliver' // iOS自动上传App Store
} else {
sshPublisher(
transfers: [sshTransfer(
remoteDirectory: '/var/www/test-env',
sourceFiles: 'build/app/outputs/**/*.apk'
)]
)
}
}
}
}
}
post {
always {
junit '**/test-results/**/*.xml' // 测试报告
emailext body: '构建详情:${BUILD_URL}', subject: 'Flutter构建完成'
}
}
}
三、关键配置详解
1. 多环境变量管理
groovy
// 使用参数化构建
parameters {
choice(
name: 'BUILD_ENV',
choices: ['dev', 'staging', 'prod'],
description: '选择构建环境'
)
}
// 动态注入环境变量
environment {
API_URL = sh(script: 'echo $BUILD_ENV | tr "[:lower:]" "[:upper:]"', returnStdout: true).trim()
}
2. iOS证书自动化(Fastlane集成)
ruby
# Fastfile 配置示例
lane :deploy do
increment_build_number
match(type: "appstore")
build_app(
scheme: "Release",
export_method: "app-store"
)
upload_to_app_store(
api_key_path: "auth_key.json",
skip_metadata: true
)
end
3. Android签名配置
bash
# 在Jenkins凭据管理中添加签名密钥
flutter build apk \
--release \
--keystore=${KEYSTORE_PATH} \
--store-password=${STORE_PASSWORD} \
--key-alias=${KEY_ALIAS} \
--key-password=${KEY_PASSWORD}
四、性能优化技巧
1. 依赖缓存加速
groovy
stage('Cache') {
steps {
cache([
[$class: 'ArbitraryFileCache',
path: '/root/.gradle/caches',
includes: '**/*.jar'],
[$class: 'FlutterPubCache',
path: '${WORKSPACE}/.pub-cache']
])
}
}
2. 热重启构建(增量更新)
bash
# 仅当pubspec.yaml变更时触发全量构建
def hasDependencyChanged() {
return sh(
script: 'git diff --name-only HEAD~1 HEAD | grep pubspec.yaml',
returnStatus: true
) == 0
}
五、常见问题解决方案
1. iOS构建错误处理
问题现象 :
Code Signing Error: No profile found
解决方案:
- 使用Fastlane Match同步证书
- 在Jenkins中添加Apple开发者账户凭据
bash
security import dev.p12 -k ~/Library/Keychains/login.keychain -P $CERT_PASSWORD
2. Android构建内存溢出
调整Gradle配置:
gradle
# gradle.properties
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m
3. Flutter版本冲突
多版本管理:
groovy
stage('Setup Flutter') {
steps {
flutterInstall('3.13.0') // 使用Flutter插件指定版本
}
}
六、扩展实践
1. 自动化测试集成
yaml
# integration_test/driver.dart
void main() {
integrationDriver(
responseDataPath: 'integration_test/responses.json',
onScreenshot: (name, bytes) async {
final image = File('screenshots/$name.png');
await image.create(recursive: true);
await image.writeAsBytes(bytes);
return true;
},
);
}
2. 代码质量门禁
groovy
stage('Quality Gate') {
steps {
sh 'flutter pub run dart_code_metrics:metrics analyze lib'
sh 'flutter pub run dart_code_metrics:metrics check-unused-code lib'
sonar(
properties: '''
sonar.projectKey=flutter_app
sonar.dart.analysis.reportPath=metrics_report.json
'''
)
}
}
七、完整CI/CD架构示例
plaintext
GitHub/GitLab
│
ˇ Webhook触发
Jenkins Server (Master)
├── Linux Agent: Android构建/测试
└── Mac Agent: iOS构建/签名
│
ˇ
Firebase App Distribution # 测试分发
│
ˇ
App Store/Play Console # 生产发布
通过以上实践,您可以将Flutter项目的构建、测试、打包和发布流程全面自动化。建议:
- 版本控制:将Jenkinsfile纳入代码仓库
- 安全加固:使用Vault管理签名密钥
- 监控告警:集成Prometheus监控构建资源使用
- 渐进式交付:通过Codepush实现热更新
让Flutter的跨平台优势与Jenkins的自动化能力完美结合,打造高效的移动端CI/CD流水线!