HarmonyOS 6.1 DevOps实战:CI/CD流水线搭建与自动化上架
系列工程化收官篇·第38篇。测试篇后,有技术负责人问:“团队有5个人一起开发这个电商Demo,代码老冲突,测试靠吼,怎么做到每天都能自动打包、自动跑测试、自动上架内测?” 这正是DevOps要解决的问题。今天我们将电商Demo接入华为云DevCloud,搭建一套完整的CI/CD流水线:代码提交即触发自动构建、自动测试、自动签名、自动上架AGC内测。我们将解决多分支管理、流水线编排、AGC API鉴权三大工程化难题。全程基于API23,含官方文档未涉及的“流水线YAML配置模板”和“自动化上架脚本”。
一、前言:为什么DevOps是团队开发的“高速公路”?
在单人开发阶段,hdc std install就能搞定一切。但在团队开发中,如果没有DevOps,你会遇到:
-
“在我机器上是好的”:开发环境不一致,导致各种诡异Bug。
-
集成地狱:到了发版日,大家才合并代码,冲突解决到凌晨。
-
手工操作失误:手动打包时选错了签名证书,导致上架被拒。
-
反馈滞后:测试人员拿到包时,已经是三天前写的代码了。
DevOps的核心是自动化和持续反馈。它通过工具链将开发、测试、部署流程串联起来,实现:
-
持续集成(CI):代码一提交,自动合并、构建、跑测试。
-
持续交付(CD):测试通过后,自动生成可供发布的包。
-
持续部署(CD):自动将包部署到测试环境或应用市场。
华为云DevCloud为鸿蒙应用提供了全套的DevOps工具链,与AGC(AppGallery Connect)深度集成,是实现鸿蒙应用自动化的首选。
二、核心概念辨析(CI/CD流程)
一条标准的鸿蒙应用CI/CD流水线包含以下步骤:
|
阶段 |
英文 |
作用 |
关键产出 |
|---|---|---|---|
|
代码拉取 |
Checkout |
从代码仓库(如CodeArts)拉取最新代码 |
干净的代码目录 |
|
环境准备 |
Prepare Env |
安装DevEco Studio、Node.js、配置SDK |
可用的构建环境 |
|
代码构建 |
Build |
执行 |
未签名的HAP/APP包 |
|
自动化测试 |
Test |
运行之前编写的单元测试、UI测试 |
测试报告、覆盖率报告 |
|
签名打包 |
Sign & Package |
使用发布证书对APP进行签名 |
签好名的APP包(.app) |
|
自动化上架 |
Release |
调用AGC API,上传APP包并提交内测 |
内测邀请链接 |
三、代码实现:从“手动操作”到“流水线驱动”
3.1 环境准备:DevCloud项目配置
-
登录华为云控制台,进入DevCloud。
-
创建项目,选择“鸿蒙应用”模板。
-
关联代码仓库(如CodeArts Repo或GitHub)。
-
创建构建任务,选择“空白构建模板”。
3.2 流水线核心:cloudbuild.yaml
这是流水线的灵魂。在项目根目录创建cloudbuild.yaml文件,定义流水线步骤。
version: 2.0
params:
# 定义流水线参数,可在DevCloud界面上修改
- name: APP_NAME
value: "HarmonyShop"
- name: BUILD_TYPE
value: "release" # debug或release
- name: AGC_API_KEY
value: "${AGC_API_KEY}" # 从DevCloud密钥管理服务获取
- name: SIGN_CERT_PATH
value: "/opt/certs/release.p12"
steps:
# 步骤1:拉取代码
- name: checkout
kind: git
params:
url: "https://codearts.repo.com/your-group/harmony-shop.git"
branch: "${BRANCH_NAME}" # 动态获取分支名
# 步骤2:准备构建环境
- name: prepare_env
kind: shell
params:
command: |
echo "=== 准备构建环境 ==="
# 安装Node.js依赖
npm install
# 验证DevEco环境
hvigor -v
# 清理旧构建产物
rm -rf entry/build entry_test/build
# 步骤3:执行代码构建
- name: build_app
kind: shell
params:
command: |
echo "=== 开始构建应用 ==="
# 使用hvigorw构建APP包
./hvigorw assembleApp --mode ${BUILD_TYPE} --no-daemon
# 验证产物是否存在
ls -lh entry/build/outputs/app/${BUILD_TYPE}/
# 步骤4:运行自动化测试
- name: run_tests
kind: shell
params:
command: |
echo "=== 运行自动化测试 ==="
# 运行单元测试
./hvigorw test --mode ${BUILD_TYPE} --no-daemon
# 运行UI测试(需要连接模拟器或真机,此处略)
# ./hvigorw uiTest --mode ${BUILD_TYPE} --no-daemon
allowFailure: true # 允许测试失败,不阻断流水线(生产环境不建议)
# 步骤5:签名打包
- name: sign_package
kind: shell
params:
command: |
echo "=== 签名应用包 ==="
# 使用jarsigner或apksigner对APP进行签名
# 注意:实际签名命令需根据鸿蒙官方工具调整
# 此处仅为示例逻辑
java -jar apksigner.jar sign \
--ks ${SIGN_CERT_PATH} \
--ks-pass pass:${KEYSTORE_PASSWORD} \
--key-pass pass:${KEY_PASSWORD} \
--out ${APP_NAME}_signed.app \
entry/build/outputs/app/${BUILD_TYPE}/${APP_NAME}.app
echo "签名完成:${APP_NAME}_signed.app"
# 步骤6:上传测试报告
- name: upload_reports
kind: shell
params:
command: |
echo "=== 上传测试报告 ==="
# 将测试报告上传到DevCloud制品库
# 方便后续查看
cp -r entry/build/reports/* /opt/devcloud/artifacts/
# 步骤7:自动化上架AGC内测
- name: publish_to_agc
kind: shell
params:
command: |
echo "=== 开始自动化上架 ==="
# 调用AGC OpenAPI上传APP包
curl -X POST "https://connect-api.cloud.huawei.com/api/publish/v2/app-package/upload" \
-H "Authorization: Bearer ${AGC_API_KEY}" \
-F "file=@${APP_NAME}_signed.app" \
-F "appId=${AGC_APP_ID}" \
-F "releaseType=1" # 1表示内测
# 提交内测审核
curl -X POST "https://connect-api.cloud.huawei.com/api/publish/v2/app-release/submit" \
-H "Authorization: Bearer ${AGC_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"appId": "${AGC_APP_ID}",
"releaseType": 1,
"testAccounts": ["test1@example.com", "test2@example.com"]
}'
echo "上架请求已提交,请前往AGC查看内测状态"
# 步骤8:通知
- name: notify
kind: notification
params:
type: email # 或wechat, sms
receivers: ["team@example.com"]
subject: "【CI/CD】${APP_NAME} 构建成功"
content: |
构建版本:${BUILD_NUMBER}
分支:${BRANCH_NAME}
状态:成功
下载链接:${ARTIFACT_URL}
内测链接:${AGC_BETA_URL}
3.3 AGC API鉴权与配置
要实现自动化上架,需要获取AGC的API Key:
-
登录AGC控制台,进入“用户与权限” -> “API Key管理”。
-
创建API Key,下载私钥文件(JSON格式)。
-
在DevCloud的密钥管理服务中,导入该JSON文件,命名为
AGC_API_KEY。 -
在流水线中通过
${AGC_API_KEY}引用。
注意:API Key具有极高权限,务必妥善保管,不要硬编码在代码中。
3.4 分支管理策略
推荐使用Git Flow或GitHub Flow:
-
main/master:生产分支,仅包含已发布代码。
-
develop:开发主干,日常开发在此分支。
-
feature/*:功能分支,从develop拉取,开发完成后合并回develop。
-
release/*:发布分支,从develop拉取,用于测试和修复Bug,完成后合并回main和develop。
-
hotfix/*:热修复分支,从main拉取,用于紧急修复线上Bug。
流水线触发规则:
-
Push触发:任何代码推送到
develop或feature/*分支时,触发CI流水线(构建+测试)。 -
Merge Request触发:向
main分支发起合并请求时,触发完整的CD流水线(构建+测试+签名+上架内测)。 -
定时触发:每天凌晨2点,触发全量构建和测试,确保代码健康。
四、踩坑记录(官方文档没写的DevOps细节)
-
构建环境差异:DevCloud的构建环境可能与本地环境不同(如Node.js版本、SDK路径)。务必在流水线中显式指定环境变量,并使用
hvigorw clean清理缓存。 -
签名证书管理:签名证书(.p12)和密码不能提交到代码仓库。必须使用DevCloud的密钥管理服务或凭据管理功能,在流水线运行时动态注入。
-
AGC API限流:AGC OpenAPI有调用频率限制(QPS)。在流水线中批量上传文件或提交审核时,需要添加适当的延时(
sleep 2),避免被限流。 -
测试设备依赖:UI测试和分布式测试需要真实的物理设备。DevCloud提供了云测服务,可以租用云端设备池。但成本较高,建议仅在关键节点(如发布前)使用,日常开发使用模拟器或本地设备。
-
流水线权限:确保DevCloud项目的服务账号有足够的权限访问AGC、代码仓库和制品库。权限不足会导致流水线在最后一步失败,非常令人沮丧。
更多推荐

所有评论(0)