第2章 CI流水线选型与前置环境准备
2.1 流水线选型分析
集成LeakCananry检测到CI流水线,首先需要选择适合团队的CI系统。主流方案包括Jenkins、GitLab CI和GitHub Actions,三者从部署方式、维护成本、生态集成等方面差异明显。选型时应综合考虑以下几点:
- 团队规模与运维能力:小团队或开源项目倾向于免运维的托管服务;大型企业可能需私有化部署以满足安全与定制需求。
- 仓库托管平台:若代码已托管在GitHub,GitHub Actions零配置集成;若使用GitLab,则GitLab CI更自然。
- 自定义需求:Jenkins Pipeline支持复杂DAG、共享库和插件生态,适合深度定制。
- 构建环境一致性:是否需固定硬件/网络环境(如性能测试、专有SDK)决定是否自建Runner。
选型建议:如果项目使用GitHub管理且团队小于20人,优先选择GitHub Actions;若已采用GitLab且需要内网部署,选择GitLab CI;若已有Jenkins基础或需要高度定制pipeline,保留Jenkins。
| 特性 | Jenkins | GitLab CI | GitHub Actions |
|---|---|---|---|
| 部署方式 | 自托管(需单独服务器) | 自托管 / SaaS | SaaS(GitHub提供) |
| 流水线定义 | Jenkinsfile (Groovy) | .gitlab-ci.yml (YAML) | .github/workflows/*.yml (YAML) |
| 插件/市场 | 丰富(>1800插件) | 中等(CI/CD模板+集成) | 丰富(Actions市场) |
| 并发执行 | 需配置agent数量 | 按协作者人数限制 | 免费额度2000分钟/月 |
| 调试能力 | Web终端+重放 | 管道视图+重试 | 实时日志+复现工作流 |
| 与LeakCanary集成 | 需自行配置Gradle任务 | 原生支持artifacts传递 | Actions市场有Gradle操作 |
2.2 环境配置流程
选定CI系统后,需要在CI环境中配置Java/Android SDK和Gradle。核心步骤包括:安装JDK、设置Android SDK、指定Gradle版本。
2.2.1 Java/Android SDK 配置
多数CI Runner预装OpenJDK 11或17,但Android SDK需要手动安装或通过sdkmanager下载。以下为三种CI系统的配置方法:
Jenkins(使用管道)
pipeline {
agent any
tools {
jdk 'OpenJDK11'
gradle '7.4'
}
environment {
ANDROID_SDK_ROOT = "${WORKSPACE}/android-sdk"
}
stages {
stage('Setup Android SDK') {
steps {
sh '''
mkdir -p ${ANDROID_SDK_ROOT}
cd ${ANDROID_SDK_ROOT}
curl -o cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip
unzip cmdline-tools.zip
yes | cmdline-tools/bin/sdkmanager --sdk_root=${ANDROID_SDK_ROOT} "platforms;android-31" "build-tools;31.0.0"
'''
}
}
}
}
GitLab CI(.gitlab-ci.yml)
image: openjdk:11-jdk-slim
before_script:
- apt-get update && apt-get install -y unzip wget
- export ANDROID_SDK_ROOT=$CI_PROJECT_DIR/android-sdk
- wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip
- unzip commandlinetools-linux-*.zip -d $ANDROID_SDK_ROOT
- yes | $ANDROID_SDK_ROOT/cmdline-tools/bin/sdkmanager --sdk_root=$ANDROID_SDK_ROOT "platforms;android-31" "build-tools;31.0.0"
variables:
ANDROID_SDK_ROOT: $CI_PROJECT_DIR/android-sdk
stages:
- build
build:
stage: build
script:
- ./gradlew assembleDebug --no-daemon
GitHub Actions(.github/workflows/android.yml)
name: Android CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 11
uses: actions/setup-java@v3
with:
java-version: '11'
distribution: 'temurin'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
- name: Build with Gradle
run: ./gradlew assembleDebug --no-daemon
2.2.2 Gradle 版本要求
LeakCanary使用Gradle插件进行字节码插桩,需保证以下版本兼容:
| LeakCanary 版本 | 最低 Gradle 版本 | 最低 AGP 版本 | 推荐 Java 版本 |
|---|---|---|---|
| 2.10+ | 7.4 | 7.1 | 11 |
| 2.8 – 2.9 | 7.0 | 7.0 | 11 |
| 2.0 – 2.7 | 6.1.1 | 4.2 | 8 |
若使用Gradle Wrapper,确保项目根目录的gradle/wrapper/gradle-wrapper.properties中的版本号符合上述要求:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
常见错误:Android SDK not found
在CI中经常出现
在CI中经常出现
SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.。务必在流水线中显式设置ANDROID_SDK_ROOT或ANDROID_HOME,并在local.properties中写入sdk.dir=/path/to/android-sdk。若使用GitHub Actions,android-actions/setup-android已自动设置。2.3 选型与配置流程图
下图总结了从CI系统选择到环境配置的完整决策与执行流程:
2.4 调试与常见错误
前置环境配置中的典型问题及处理方式:
- Gradle同步失败:版本不兼容导致“Unsupported class file major version”,检查JDK与Gradle版本;
./gradlew --version可快速验证。 - SDK root not set:定义环境变量时注意
export ANDROID_SDK_ROOT,且在流水线中需全局可用。GitHub Actions中可通过android-actions/setup-android自动处理。 - LeakCanary插件未生效:确认
build.gradle中已添加LeakCanary Gradle插件依赖,且debugImplementation依赖正确。可在日志中搜索“LeakCanary instrumentation”确认。
优化建议:为加快CI构建,可在Runner上预先缓存Android SDK和Gradle wrapper,避免每次下载。Jenkins可配置
gradle cache,GitLab CI使用cache关键字,GitHub Actions使用actions/cache。