第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。
特性JenkinsGitLab CIGitHub Actions
部署方式自托管(需单独服务器)自托管 / SaaSSaaS(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.47.111
2.8 – 2.97.07.011
2.0 – 2.76.1.14.28

若使用Gradle Wrapper,确保项目根目录的gradle/wrapper/gradle-wrapper.properties中的版本号符合上述要求:

distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
常见错误:Android SDK not found
在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系统选择到环境配置的完整决策与执行流程:

CI流水线选型与前置环境配置流程 项目需求分析 团队规模 / 运维能力 / 预算 仓库平台 / 定制需求 Jenkins GitLab CI GitHub Actions 前置环境配置 安装JDK 11 / 配置ANDROID_SDK_ROOT 设置Gradle版本(≥7.4) / 本地属性文件 验证构建与LeakCanary插件 说明:选型后统一按上图节点配置环境,确保CI Runner能正确执行Gradle任务并触发LeakCanary字节码插桩。

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。