




掌握 Hvigor 命令行构建、搭建 Jenkins/GitLab CI 流水线、落地多环境配置与自动化测试、实现一键签名打包发布
一、前置思考:从"手动发版"到"流水线交付"
1.1 手动发版的痛点
| 手动环节 |
风险 |
耗时 |
| 本地构建 |
环境差异(“我这能跑”) |
10 分钟 |
| 手动测试 |
遗漏回归 |
数小时 |
| 手动签名 |
密钥泄露/混淆 |
分钟级 |
| 手动发布 |
版本错乱 |
分钟级 |
核心认知:手动流程的每一步都是不确定性的来源——环境差异、漏测、人为失误。
CI/CD 的价值不是"快",而是确定性:同样的代码,永远产出同样的产物。
1.2 CI/CD 的价值
| 维度 |
手动 |
CI/CD |
| 构建一致性 |
依赖本地环境 |
统一环境 |
| 回归保障 |
靠自觉 |
自动化必测 |
| 发布速度 |
天级 |
分钟级 |
| 可追溯 |
无 |
全链路记录 |
| 质量门禁 |
无 |
自动拦截 |
二、核心原理:流水线阶段
2.1 标准流水线
代码提交 → 触发流水线
│
├─ Stage1 静态检查: Lint / 代码规范
├─ Stage2 单元测试: 关键模块单测
├─ Stage3 构建: Hvigor 命令行出包
├─ Stage4 自动化测试: UI/性能压测
├─ Stage5 质量门禁: 崩溃率/体积/性能阈值
├─ Stage6 签名打包: 自动签名
├─ Stage7 发布: 上传商店/分发平台
└─ Stage8 通知: 结果推送团队
2.2 流水线设计的核心原则
| 原则 |
说明 |
| 快反馈 |
提交 10 分钟内出结果 |
| 门禁前置 |
便宜的门禁放前面 |
| 并行化 |
独立阶段并行执行 |
| 可重放 |
同一提交可重复构建 |
| 产物不可变 |
构建产物带版本指纹 |
三、源码/API 深度解析:核心能力
3.1 Hvigor 命令行构建
hvigorw clean
hvigorw assembleHap
hvigorw assembleHap --mode module -p product=default
hvigorw signHap
hvigorw --sync
hvigorw assembleHap --parallel
hvigorw assembleHap --daemon
hvigorw assembleHap --mode module
hvigorw assembleHap -p buildMode=release
CI 关键:命令行构建必须可重复、无交互——所有参数通过命令行/配置文件传入。
3.2 多环境配置
不同环境(debug/test/release)需要不同配置:
// build-profile.json5 多环境
{
"app": {
"products": [
{
"name": "dev",
"signingConfig": "dev_sign",
"compatibleSdkVersion": "5.0.0(12)",
"runtimeOS": "HarmonyOS",
"buildModeSet": [{ "name": "debug" }]
},
{
"name": "test",
"signingConfig": "test_sign",
"buildModeSet": [{ "name": "release" }]
},
{
"name": "release",
"signingConfig": "release_sign",
"buildModeSet": [{ "name": "release" }]
}
]
}
}
环境矩阵:
| 维度 |
dev |
test |
release |
| API 地址 |
测试环境 |
测试环境 |
生产环境 |
| 日志级别 |
debug |
info |
warn+ |
| 混淆 |
关 |
开 |
开 |
| 签名 |
dev 证书 |
test 证书 |
release 证书 |
| 崩溃上报 |
全量 |
全量 |
采样 |
3.3 自动化测试集成
import { describe, it, expect } from '@ohos/hypium';
export default function orderTest() {
describe('OrderDomainTest', () => {
it('calc_total_correct', 0, () => {
const total = calcOrderTotal([100, 200, 300]);
expect(total).assertEqual(600);
});
it('discount_apply', 0, () => {
const total = calcOrderTotal([100], 0.8);
expect(total).assertEqual(80);
});
});
}
hvigorw test
hvigorw ohosTest
CI 测试分层:
| 层级 |
内容 |
速度 |
| 单测 |
领域逻辑/工具 |
秒级 |
| 组件测试 |
组件交互 |
分钟级 |
| UI 测试 |
页面流程 |
分钟级 |
| 性能压测 |
启动/内存/卡顿 |
十分钟级 |
3.4 签名管理
| 实践 |
说明 |
| 证书分环境 |
dev/test/release 独立证书 |
| 密钥保护 |
证书放 CI 密钥库, 不进代码仓库 |
| 自动签名 |
流水线内 signHap 自动签名 |
| 签名校验 |
发布前自动校验签名 |
| 证书过期监控 |
到期前告警 |
四、企业级实战:流水线搭建
4.1 Jenkins / GitLab CI 架构
Git 提交 (Merge Request)
│ 触发 webhook
▼
CI Runner (构建机)
├─ Stage1 lint (静态检查)
├─ Stage2 unit test (单测)
├─ Stage3 assemble (Hvigor 构建)
├─ Stage4 ui test (UI 自动化)
├─ Stage5 perf gate (性能门禁)
├─ Stage6 sign (自动签名)
└─ Stage7 publish (发布 + 通知)
4.2 质量门禁矩阵
| 门禁 |
规则 |
拦截级别 |
| 编译 |
编译失败 |
阻断 |
| 单测 |
通过率 < 95% |
阻断 |
| Lint |
严重告警 > 0 |
阻断 |
| 体积 |
超基线 + 2MB |
告警 |
| 性能 |
启动超基线 |
阻断 |
| 崩溃 |
回归版本对比 |
阻断 |
4.3 多版本并行构建
同一时间多个分支同时构建:
develop 分支 → dev 包 (每日)
release/1.3 分支 → test 包 (提测)
master 分支 → release 包 (发布)
hotfix 分支 → 热修包 (紧急)
并行策略:
- 每个 MR 触发独立流水线;
- 分支合并前必须门禁全绿;
- 发布分支锁定(只允许合并经过验证的代码)。
4.4 持续交付闭环
开发 → 提测包(自动) → 测试通过 → 灰度包(自动)
→ 灰度监控(崩溃/性能) → 全量发布(自动) → 回滚预案
| 环节 |
自动化程度 |
| 提测包 |
100% 自动 |
| 灰度发布 |
自动 + 人工确认 |
| 全量发布 |
自动 + 门禁 |
| 回滚 |
一键回滚(版本表) |
五、排查与优化:流水线效率
5.1 流水线瓶颈定位
| 瓶颈 |
特征 |
对策 |
| 构建慢 |
Stage3 耗时 60%+ |
编译缓存/并行(第 38 篇联动) |
| 测试慢 |
全量测试耗时长 |
分层 + 并行 + 增量 |
| 环境不稳定 |
偶发失败 |
环境容器化 |
| 门禁误报 |
频繁告警 |
阈值校准 |
| 排队 |
构建机不足 |
扩容/负载均衡 |
5.2 高频坑点速查
六、总结与进阶
6.1 收益模型(参考实测)
| 指标 |
手动 |
CI/CD |
| 发版周期 |
3 天 |
4 小时 |
| 回归缺陷率 |
8% |
1.2% |
| 构建一致性 |
不保证 |
100% |
| 发布回滚 |
手动 |
一键 |
| 团队等待 |
阻塞式 |
异步 |
6.2 工程规范
- 一切可脚本化:构建/测试/签名/发布全部脚本化;
- 门禁强制:质量门禁是发布的唯一通行证;
- 环境隔离:dev/test/release 严格隔离;
- 可追溯:每个产物对应代码提交哈希;
- 持续演进:流水线本身纳入版本管理。
6.3 进阶方向
- 流水线即代码:Jenkinsfile/GitLab CI 配置入库;
- 容器化构建:Docker 统一构建环境;
- 性能门禁自动化:压测脚本接入(第 41 篇联动);
- 自动发版机器人:版本/更新日志自动生成。
附:Demo 演示说明
| Tab |
演示内容 |
| 🔧 流水线 |
8 阶段流水线可视化 + 门禁关卡演示 |
| 🏗️ Hvigor CLI |
命令行构建命令速查 + 执行模拟 |
| 🌍 多环境 |
dev/test/release 环境配置矩阵对比 |
| 🧪 自动化测试 |
单测/UI/性能测试分层 + 门禁规则 |
| 📦 发布管理 |
签名/灰度/全量/回滚 发布流程演示 |
所有评论(0)