Appearance
10_Engineering/10 - 自动化构建 CI/CD
1. HarmonyOS CI/CD 概览
HarmonyOS 应用的 CI/CD 流水线主要依赖 DevEco Studio 内置工具和云端构建服务。
1.1 构建工具链
源代码 → hvigorw 构建 → 产物签名 → 测试 → 产物归档 → 发布
(Hvigor) (签名) (Hypium) (.app) (AppGallery)1.2 工具对比
| 工具 | 用途 | 说明 |
|---|---|---|
| hvigorw | 构建/测试 | 本地构建引擎 |
| DevEco Studio | IDE + 构建 | 图形化构建/调试 |
| AppGallery Connect (AGC) | 云端 CI/CD | 云端构建/分发 |
| OpenHarmony CI | 开源社区 CI | 开源项目 CI/CD |
2. DevEco Studio 本地构建
2.1 基本构建流程
bash
# 安装依赖
ohpm install
# 构建 Debug 版本
hvigorw assembleDebug
# 构建 Release 版本
hvigorw assembleRelease
# 运行测试
hvigorw testApp
# 全量构建(Clean + Assemble + Test)
hvigorw clean
hvigorw assembleRelease
hvigorw testApp --coverage2.2 构建产物
| 产物 | 路径 | 说明 |
|---|---|---|
.app | entry/build/outputs/app-debug/ | Debug 包 |
.app | entry/build/outputs/app-release/ | Release 包 |
| 映射文件 | entry/build/outputs/app-release/mapping.txt | 混淆映射 |
| APK | entry/build/outputs/app-debug.apk | 可安装 APK |
| 覆盖率 | entry/build/reports/coverage/ | 覆盖率报告 |
3. AppGallery Connect CI/CD
3.1 AGC 云端构建配置
yaml
# .agconnect/agconnect-config.yaml
pipeline:
name: "harmonyos-app-pipeline"
stages:
- name: "build"
tasks:
- task: "compile"
settings:
build_tool: "hvigor"
build_type: "release"
target: "default"
- task: "sign"
settings:
signing_config: "release_certificate"
- task: "package"
settings:
output_format: "app"
- name: "test"
tasks:
- task: "unit_test"
settings:
test_framework: "hypium"
coverage: true
- name: "distribute"
tasks:
- task: "publish"
settings:
channel: "appgallery"
track: "production"3.2 AGC 构建步骤
1. 代码拉取 → Git clone
2. 依赖安装 → ohpm install
3. 代码编译 → hvigorw assembleRelease
4. 代码签名 → AGC 签名服务
5. 自动化测试 → Hypium 单元测试 + E2E
6. 产物上传 → AGC artifacts
7. 发布到 AppGallery → 人工审核或自动发布3.3 签名配置(云端)
json5
// agconnect-service.json
{
"app": {
"appGallery": {
"appId": "123456789",
"productId": "com.example.myapp"
},
"signingConfigs": {
"release": {
"certificateFingerprint": "SHA256:AB:CD:EF:12:34:56",
"storeFile": "release.cer",
"keyAlias": "release_key"
}
}
}
}4. GitHub Actions / GitLab CI 集成
4.1 GitHub Actions for HarmonyOS
yaml
# .github/workflows/harmonyos-build.yml
name: HarmonyOS Build & Test
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install Dependencies
run: ohpm install
- name: Build Debug
run: hvigorw assembleDebug
- name: Run Unit Tests
run: hvigorw testApp --coverage
- name: Upload Coverage Report
uses: codecov/codecov-action@v3
with:
files: ./coverage/lcov.info
- name: Build Release
if: github.ref == 'refs/heads/main'
run: hvigorw assembleRelease
- name: Upload Artifacts
if: github.ref == 'refs/heads/main'
uses: actions/upload-artifact@v4
with:
name: harmonyos-app-release
path: entry/build/outputs/app-release/*.app4.2 GitLab CI 配置
yaml
# .gitlab-ci.yml
stages:
- build
- test
- release
build-debug:
stage: build
image: node:18
script:
- ohpm install
- hvigorw assembleDebug
artifacts:
paths:
- entry/build/outputs/app-debug/
expire_in: 1 week
unit-test:
stage: test
image: node:18
script:
- ohpm install
- hvigorw testApp
artifacts:
reports:
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
build-release:
stage: release
image: node:18
script:
- ohpm install
- hvigorw assembleRelease
only:
- main5. 多环境自动化构建
5.1 多环境构建流水线
yaml
# CI Pipeline - 多环境构建
stages:
- build_dev
- test_dev
- build_beta
- test_beta
- build_release
- publish
build_dev:
stage: build_dev
script:
- ohpm install
- hvigorw assembleApp --product=dev --mode=DEBUG
artifacts:
paths:
- entry/build/outputs/app-dev-debug/
test_dev:
stage: test_dev
dependencies:
- build_dev
script:
- hvigorw testApp --coverage
allow_failure: true
build_beta:
stage: build_beta
script:
- ohpm install
- hvigorw assembleApp --product=beta --mode=DEBUG
artifacts:
paths:
- entry/build/outputs/app-beta-debug/
build_release:
stage: build_release
script:
- ohpm install
- hvigorw assembleApp --product=release --mode=RELEASE
artifacts:
paths:
- entry/build/outputs/app-release/
only:
- tags
publish:
stage: publish
script:
- echo "Publishing to AppGallery..."
# AGC CLI publish command
only:
- tags6. 自动化测试集成
6.1 Hypium 集成到 CI
bash
#!/bin/bash
# ci/test.sh
set -e
echo "=== Running Unit Tests ==="
hvigorw testApp --suite=unit_test
echo "=== Generating Coverage ==="
hvigorw testApp --coverage
echo "=== Checking Coverage Threshold ==="
coverage=$(cat coverage/summary.json | jq '.coverage')
if [ $(echo "$coverage < 80" | bc) -eq 1 ]; then
echo "Coverage below threshold: ${coverage}% (threshold: 80%)"
exit 1
fi
echo "=== All tests passed ==="6.2 E2E 测试集成
bash
#!/bin/bash
# ci/e2e.sh
echo "=== Starting E2E Tests ==="
# 使用云测平台(如华为云 AppGallery Cloud Test)
agc cloud:execute-test \
--package entry/build/outputs/app-debug/app-debug.app \
--devices "phone-1:30,phone-2:30,tablet-1:30" \
--test-suite e2e_test_suite \
--report-path ./e2e-report
echo "E2E Tests complete. Report: ./e2e-report"7. 面试高频考点
Q1: HarmonyOS 的 CI/CD 工具体系?
回答要点:
- hvigorw 本地构建引擎
- AppGallery Connect (AGC) 云端 CI/CD
- Hypium 自动化测试
- GitHub Actions / GitLab CI 可集成外部 CI
Q2: AGC 云端构建流程?
回答要点:
- 代码拉取 → 依赖安装 → 编译 → 签名 → 测试 → 发布
- AGC 内置签名服务,不需要手动配置证书
- 支持多设备云测
- 构建产物自动上传到 AGC
Q3: 如何在 CI 中处理签名?
回答要点:
- 本地构建:手动配置 signingConfig(p12/cer 文件)
- AGC 构建:使用 AGC 签名服务(自动管理证书)
- CI/CD 中通过环境变量传递签名文件
- 生产环境证书严格保密,只在 AGC 中配置
8. Android 对比
| 概念 | Android | HarmonyOS |
|---|---|---|
| CI 工具 | Jenkins / GitHub Actions | AGC / GitHub Actions |
| 构建命令 | ./gradlew assembleRelease | hvigorw assembleRelease |
| 测试框架 | JUnit / Espresso | Hypium |
| 云端构建 | Firebase Test Lab / AGC | AppGallery Connect |
| 签名 | JKS / BKS | .p12 / .cer |
| 产物格式 | APK / AAB | .app |