系列工程化收官篇·第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、代码仓库和制品库。权限不足会导致流水线在最后一步失败,非常令人沮丧。