
系列工程化终章。上篇讲完单元测试有读者问“每次测试完还要手动打包、上传AGC、填应用信息太繁琐了有没有办法一键发布” 这正是CI/CD持续集成/持续部署要解决的核心痛点。作为系列的最后一篇工程化内容本文将把电商Demo的发布流程彻底自动化从代码提交到Git到自动运行测试、构建HAP包、上传到AGCAppGallery Connect、甚至自动分发到测试人员手中。全程基于华为云DevCloud无需自建服务器30分钟即可搭建一套企业级发布流水线。所有配置均适配API23含官方文档未提及的权限陷阱与签名方案。一、前言为什么CI/CD是专业开发的“分水岭”在之前的19篇文章里我们实现了用State/Link构建UI用分布式流转实现跨端体验用端云一体化处理业务逻辑用单元测试保障代码质量。但所有这些成果最终都要通过“发布”到达用户手中。传统的手动发布流程是这样的写完代码本地跑测试打开DevEco Studio点Build HAP打开浏览器登录AGC上传HAP包填写版本信息、更新说明提交审核等待……这个过程不仅枯燥而且极易出错比如上传了旧版本的包、忘记了版本号的递增、或者签名证书用错了。在团队开发中这种“手工发布”更是灾难每个人发布的包可能都不一致。CI/CD的核心价值就是标准化与自动化持续集成CI代码一提交自动跑测试、构建包快速反馈质量问题。持续部署CD测试通过后自动上传到AGC甚至自动开启灰度发布。对于鸿蒙生态来说CI/CD还有一个特殊意义多端统一构建。我们的电商Demo用ArkUI-X支持Android/iOSCI/CD可以一键同时构建鸿蒙、安卓、iOS三个平台的包确保版本一致性。二、核心概念辨析CI/CD工具链很多新手会被Jenkins、GitLab CI、GitHub Actions等名词吓到。其实在鸿蒙生态里工具链非常清晰工具/服务角色定位适用场景DevEco Studio本地开发IDE写代码、本地调试、手动构建Git代码版本管理代码提交、分支管理本地或托管平台华为云DevCloud云端CI/CD引擎自动化构建、测试、部署推荐与AGC无缝集成AppGallery Connect (AGC)应用分发平台存储HAP包、审核、上架应用市场Command Line Tools命令行构建工具在无界面的服务器如DevCloud上构建HAP包核心认知我们将使用Git托管代码华为云DevCloud作为CI/CD引擎AGC作为发布终点。DevEco Studio只是我们写代码的工具构建和发布都交给云端自动完成。三、代码实现搭建自动化流水线3.1 准备工作代码托管将之前的电商Demo代码上传到码云Gitee或华为云CodeHub推荐与DevCloud集成更顺畅。AGC配置在AGC上创建好应用Package Name要与代码一致。生成API Key进入AGC“用户与访问-密钥管理”创建一个API Key下载credentials.json文件。这是CI/CD上传包到AGC的凭证必须保密准备好签名证书在DevEco Studio中生成.p12、.cer、.p7b文件并备份好密码。华为云DevCloud登录华为云控制台进入“软件开发生产线 DevCloud”。创建项目关联你的代码仓库。3.2 编写构建脚本hvigorfile.jsDevEco Studio使用hvigor作为构建工具类似前端的Webpack。我们需要在项目根目录创建或修改hvigorfile.js使其支持命令行构建。关键点CI/CD环境中没有图形界面无法通过弹窗输入签名密码所以我们使用环境变量传递密码。// 项目根目录/hvigorfile.js const hvigor require(ohos/hvigor); const fs require(fs); // 定义一个名为buildHap的任务 hvigor.task(buildHap) .applyPlugin(ohos/hvigor-plugin-ohos-app) .doFirst(() { console.log(开始构建HAP包...); // 从环境变量读取签名密码CI/CD环境中设置 const storePassword process.env.SIGN_STORE_PASSWORD; const keyPassword process.env.SIGN_KEY_PASSWORD; if (!storePassword || !keyPassword) { throw new Error(签名密码未设置请在CI/CD环境中配置环境变量); } // 动态修改构建配置可选例如修改版本号 const buildProfilePath entry/build-profile.json5; if (fs.existsSync(buildProfilePath)) { let profile fs.readFileSync(buildProfilePath, utf-8); // 示例将版本号改为环境变量中的值 const buildNumber process.env.BUILD_NUMBER || 1; profile profile.replace(/versionCode:\s*\d/, versionCode: ${buildNumber}); fs.writeFileSync(buildProfilePath, profile); console.log(版本号已更新为: ${buildNumber}); } }) .doLast(() { console.log(HAP包构建完成); console.log(输出路径: entry/build/outputs/default/entry-default-signed.hap); }); // 导出任务 module.exports { tasks: [buildHap] };安全提示千万不要把密码硬编码在脚本里一定要使用环境变量。3.3 配置DevCloud流水线进入华为云DevCloud的项目点击“构建发布-流水线”新建流水线。我们分步配置步骤1克隆代码源选择你的代码仓库Gitee/CodeHub。分支选择master或main。步骤2构建HAP包核心步骤构建工具选择“Hvigor构建”。脚本输入构建命令# 设置环境变量在DevCloud的界面上设置不要写在这里 # export SIGN_STORE_PASSWORD你的密码 # export SIGN_KEY_PASSWORD你的密码 # export BUILD_NUMBER${BUILD_NUMBER} # DevCloud内置变量 # 执行构建 node hvigorw.js buildHap --no-daemon制品设置“归档制品”路径填写entry/build/outputs/default/*.hap。这一步是为了把构建好的HAP包保存下来供后续步骤使用。步骤3运行单元测试构建工具选择“命令行”。脚本在构建目录下执行测试命令# 进入测试模块目录 cd entry_test # 执行测试使用Hypium测试框架 npm install # 如果测试依赖需要安装 npx hypium run tests --testRunner OhosTestRunner配置勾选“测试报告解析”路径填写entry_test/build/reports/tests/index.html。这样DevCloud会自动收集测试报告。步骤4上传到AGCCD的关键插件选择“AppGallery Connect上传”。凭证上传你之前下载的credentials.json文件。配置应用ID填写AGC上的App ID。构建产物选择上一步归档的HAP包路径。版本更新说明可以填写Auto-release by CI/CD at ${BUILD_TIME}。分发范围选择“测试人员”先给测试人员没问题再手动点发布。步骤5通知可选插件选择“邮件通知”或“钉钉通知”。配置构建成功/失败后自动发送消息给团队。3.4 触发流水线配置完成后你可以在DevCloud中手动点击“执行”也可以设置自动触发代码提交触发当开发人员git push代码到master分支时自动启动流水线。定时触发每天凌晨2点自动构建一次确保主分支始终是可发布的。四、踩坑记录官方文档没写的7个细节环境变量优先级DevCloud的环境变量会覆盖系统变量但hvigor脚本中如果硬编码了密码会优先使用硬编码的。务必确保脚本中是从process.env读取。签名证书的路径问题CI/CD服务器上没有你的本地证书需要将.p12等证书文件也提交到代码仓库注意.p12包含私钥务必在私有仓库中操作且设置严格的访问权限或者在DevCloud中配置“文件保密存储”构建时动态下载。AGC API的速率限制频繁调用AGC的上传API可能会被限流。建议在流水线中设置合理的重试机制。构建机的环境差异DevCloud的构建机可能预装了不同版本的Node.js或Java。最好在流水线中显式指定hvigor和Node.js的版本避免因版本差异导致构建失败。测试环境的初始化如果单元测试依赖AGC的云数据库需要在测试前通过脚本初始化测试数据并在测试后清理。否则测试会相互干扰。构建产物的清理每次构建都会生成HAP包长期积累会占满磁盘。需要在流水线末尾或定期清理旧的构建产物。权限最小化AGC的API Key权限要最小化只授予“上传应用包”的权限不要授予“删除应用”或“修改财务信息”的权限防止凭证泄露造成损失。