CI/CD 实践
场景
团队协作中频繁出现"合并代码后编译失败"、"测试包版本不对"、"发布流程手动操作出错"等问题。
方案
1. CI Pipeline
# .github/workflows/ci.yml
name: Android CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
- name: Lint
run: ./gradlew lintDebug
- name: Unit Test
run: ./gradlew testDebugUnitTest
- name: Build
run: ./gradlew assembleDebug
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: debug-apk
path: app/build/outputs/apk/debug/app-debug.apk
2. CD Pipeline(发布流程)
| 阶段 | 说明 |
|---|---|
| Tag 触发 | 打 v1.x.x tag 触发发布流程 |
| Build Release | assembleRelease / bundleRelease |
| 签名 | GitHub Secrets 存储 keystore |
| 上传 | Google Play / 华为应用市场 / 蒲公英 |
| 通知 | 企业微信 / Slack 通知发布结果 |
3. 最佳实践
| 实践 | 说明 |
|---|---|
| Gradle Cache | CI 缓存 ~/.gradle 目录 |
| 并行 Job | Lint、Unit Test、Build 可并行 |
| 版本号自动化 | 从 Git tag 读取 versionName |
| Code Coverage | Jacoco 生成覆盖率报告 |
| PR 门禁 | Lint Error / Test Failure 阻止合并 |
// build.gradle.kts — 从 CI 环境变量读取版本号
android {
defaultConfig {
versionCode = System.getenv("VERSION_CODE")?.toIntOrNull() ?: 1
versionName = System.getenv("VERSION_NAME") ?: "1.0.0-dev"
}
}
面试答题要点
- CI:每次 PR 自动跑 Lint + Test + Build
- CD:Tag 触发 Release Build + 自动上传
- Gradle Cache 加速 CI 构建
- PR 门禁确保代码质量