使用Jenkins实现鸿蒙HAR应用的自动化构建打包
使用Jenkins实现鸿蒙HAR应用的自动化构建打包
在软件开发领域,自动化构建是提高开发效率和确保代码质量的重要手段。特别是在鸿蒙(OpenHarmony)应用开发中,自动化构建更是不可或缺。本文将详细介绍如何使用Jenkins命令行工具实现鸿蒙HAR应用的自动化构建打包,让开发流程更加高效、可靠。
一、引言
随着鸿蒙系统的广泛应用,越来越多的开发者投入到鸿蒙应用的开发中。然而,手动构建和打包应用不仅耗时耗力,还容易出错。因此,实现自动化构建成为开发者的迫切需求。Jenkins作为一款开源的自动化服务器软件,以其强大的功能和灵活的插件体系,成为实现这一需求的理想选择。
二、环境准备
在开始之前,请确保你已经安装了以下软件和环境:
- Jenkins:用于自动化构建的任务调度和执行。
- DevEco Studio:鸿蒙开发的集成开发环境(IDE),包含了必要的工具和SDK。
- Node.js:JavaScript运行环境,用于执行hvigorw等脚本。
三、核心步骤
实现鸿蒙HAR应用的自动化构建打包,核心在于以下三个步骤:初始化依赖、初始化工作环境、执行具体的构建任务。下面将详细介绍每个步骤的具体实现。
1. 初始化依赖
首先,需要使用ohpm命令来初始化项目所需的依赖。ohpm是鸿蒙的包管理工具,类似于npm或yarn。在Jenkins脚本中,可以使用以下命令来安装所有依赖:
/Applications/DevEco-Studio.app/Contents/tools/ohpm/bin/ohpm install --all --registry https://ohpm.openharmony.cn/ohpm/ --strict_ssl true
这条命令会从指定的ohpm仓库(https://ohpm.openharmony.cn/ohpm/)下载并安装所有在oh-package.json5中声明的依赖。
2. 初始化工作环境
接下来,使用hvigorw脚本来初始化工作环境。hvigorw是鸿蒙的构建工具,用于执行构建、编译等任务。在Jenkins脚本中,可以使用以下命令来同步项目配置并初始化工作环境:
/Applications/DevEco-Studio.app/Contents/tools/node/bin/node /Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw.js --sync -p product=default --analyze=normal --parallel --incremental --daemon
这条命令会同步项目的配置信息,并根据指定的产品配置(product=default)初始化工作环境。同时,它还会开启并行构建、增量构建和守护进程等功能,以提高构建效率。
3. 执行具体的构建任务
最后,使用hvigorw脚本来执行具体的构建任务。在Jenkins脚本中,可以使用以下命令来构建并打包HAR应用:
hvigorw --mode module -p product=default -p module=$moduleName@default -p buildMode=release assembleHar --analyze=normal --parallel --incremental --daemon
这条命令会根据指定的模块(module=$moduleName@default)和产品配置(product=default),以发布模式(buildMode=release)构建并打包HAR应用。同样地,它也开启了并行构建、增量构建和守护进程等功能。
四、脚本实现
将上述三个步骤整合到一个脚本中,就可以在Jenkins中执行完整的业务逻辑构建了。以下是一个示例脚本:
#!/bin/bash# 设置DevEco Studio路径
DEVECO_STUDIO_PATH="/Applications/DevEco-Studio.app/Contents/tools"# 初始化依赖
${DEVECO_STUDIO_PATH}/ohpm/bin/ohpm install --all --registry https://ohpm.openharmony.cn/ohpm/ --strict_ssl true# 检查依赖安装是否成功
if [ $? -ne 0 ]; thenecho "依赖安装失败"exit 1
fi# 初始化工作环境
${DEVECO_STUDIO_PATH}/node/bin/node ${DEVECO_STUDIO_PATH}/hvigor/bin/hvigorw.js --sync -p product=default --analyze=normal --parallel --incremental --daemon# 检查工作环境初始化是否成功
if [ $? -ne 0 ]; thenecho "工作环境初始化失败"exit 1
fi# 执行具体的构建任务
hvigorw --mode module -p product=default -p module=$moduleName@default -p buildMode=release assembleHar --analyze=normal --parallel --incremental --daemon# 检查构建任务是否成功
if [ $? -ne 0 ]; thenecho "构建任务失败"exit 1
fiecho "构建成功"
将这个脚本保存为build.sh
,并在Jenkins中配置一个执行该脚本的构建任务,就可以实现鸿蒙HAR应用的自动化构建打包了。
五、总结与展望
通过本文的介绍,我们了解了如何使用Jenkins命令行工具实现鸿蒙HAR应用的自动化构建打包。这不仅提高了开发效率,还确保了代码质量。未来,随着鸿蒙系统的不断发展和完善,自动化构建工具也将更加智能和高效。我们可以期待更多的自动化工具和插件出现,为鸿蒙应用开发提供更加便捷和高效的解决方案。
希望本文对大家有所帮助!如果你有任何疑问或建议,请随时在评论区留言。
附录一
在DevEco Studio启动或项目初始化过程中,执行以下命令:
/Applications/DevEco-Studio.app/Contents/tools/ohpm/bin/ohpm install --all --registry https://ohpm.openharmony.cn/ohpm/ --strict_ssl true
作用是为鸿蒙(HarmonyOS/OpenHarmony)项目安装或更新所有依赖包。以下是具体解析:
1. 命令的组成部分
参数/路径 | 说明 |
---|---|
/Applications/DevEco-Studio.app/.../ohpm | 调用DevEco Studio内置的 ohpm(OpenHarmony Package Manager)工具,专用于管理鸿蒙生态的依赖包。 |
install --all | 安装项目配置文件(如oh-package.json5 )中定义的所有依赖项(包括dependencies 和devDependencies )。 |
--registry https://ohpm.openharmony.cn/ohpm/ | 指定鸿蒙官方包仓库作为依赖源,确保下载合法的鸿蒙组件。 |
--strict_ssl true | 启用严格的SSL证书验证,防止网络劫持或下载来源被篡改。 |
2. 该命令的典型场景
(1) 初始化项目时
- 当首次打开项目或检测到
oh_modules
(依赖目录)缺失时,DevEco Studio会自动触发此命令,确保依赖完整。 - 类似
npm install
或yarn install
的作用,但针对鸿蒙生态的包管理。
(2) 更新依赖配置后
- 如果修改了
oh-package.json5
文件(如添加/删除依赖项),手动执行此命令可同步依赖。
(3) 解决依赖冲突或缺失
- 当编译失败并提示缺少模块或版本不兼容时,重新运行此命令可尝试修复依赖树。
3. 关键注意事项
(1) 依赖源的合法性
- 必须使用鸿蒙官方仓库(
https://ohpm.openharmony.cn/ohpm/
)以确保依赖包与鸿蒙系统兼容。 - 不要随意切换第三方仓库,否则可能引入非鸿蒙适配的代码,导致编译失败。
(2) --strict_ssl true
的作用
- 若本地网络有SSL证书拦截(如公司代理),可能需要临时关闭此参数(设为
false
),但会降低安全性。 - 推荐优先配置系统信任的证书,而非禁用SSL验证。
(3) 与npm
的区别
ohpm
是鸿蒙专用的包管理器,与Node.js的npm
无直接关系。- 鸿蒙的Native模块(如C++库)和HAR/HSP包必须通过
ohpm
管理,无法使用npm
替代。
4. 常见问题
Q1: 能否省略此命令?
- 否。除非项目无任何依赖项,否则缺少依赖会导致编译失败(如
ERROR: ENOENT: no such file
)。
Q2: 执行失败怎么办?
- 步骤1:检查网络
确保能访问https://ohpm.openharmony.cn
,尤其注意代理或防火墙设置。 - 步骤2:清理缓存
rm -rf ./oh_modules # 删除依赖目录 ohpm clean # 清理ohpm缓存
- 步骤3:手动指定环境
若系统全局安装了其他Node.js版本,可能路径冲突,应直接使用DevEco Studio内置的ohpm和Node.js。
5. 总结
此命令是鸿蒙项目依赖管理的核心步骤,确保所有模块和工具链正确安装。
如果编译过程中出现依赖相关错误(如uv_cwd
或ENOENT
),优先尝试重新执行此命令并检查网络环境。
附录二
在鸿蒙(HarmonyOS/OpenHarmony)应用开发中,您提到的命令是用于调用 DevEco Studio 内置的 hvigor 工具来执行项目构建任务。以下是该命令的详细解析:
命令结构
/Applications/DevEco-Studio.app/Contents/tools/node/bin/node
/Applications/DevEco-Studio.app/Contents/tools/hvigor/bin/hvigorw.js
--sync
-p product=default
--analyze=normal
--parallel
--incremental
--daemon
各部分作用
1. node
和 hvigorw.js
路径
/Applications/DevEco-Studio.app/.../node
使用 DevEco Studio 内置的 Node.js 环境,避免因系统全局 Node.js 版本不兼容导致问题。/Applications/DevEco-Studio.app/.../hvigorw.js
hvigor
是华为为鸿蒙开发定制的构建工具(类似 Android 的 Gradle),负责管理依赖、编译代码、打包资源等任务。
2. 核心参数解析
参数 | 作用 |
---|---|
--sync | 同步项目配置,确保所有模块的依赖关系和配置(如 build-profile.json5 )一致。常用于首次拉取代码或修改依赖后。 |
-p product=default | 指定构建的 产品形态。default 表示使用默认配置(如调试模式),其他可能值如 release (发布模式)。 |
--analyze=normal | 启用构建过程分析,但仅输出常规日志(非详细)。若需调试,可改为 --analyze=verbose 。 |
--parallel | 启用多线程并行构建,加快大型项目的编译速度。 |
--incremental | 增量编译模式,仅编译修改过的文件,减少构建时间。但若缓存异常可能导致失败,需定期清理(如 hvigor clean )。 |
--daemon | 以守护进程模式运行 hvigor,首次启动稍慢,但后续构建会复用进程提升速度。 |
该命令的典型场景
1. 项目初始化或配置变更后
- 首次拉取代码或修改
build-profile.json5
、oh-package.json5
等文件后,需执行--sync
确保配置同步。
2. 日常开发构建
- 使用
--incremental
和--parallel
加速构建,适合频繁修改代码的场景。
3. 调试构建问题
- 若构建失败,移除
--incremental
和--daemon
进行全量编译,或添加--debug
参数获取详细日志。
常见问题与注意事项
1. 增量编译失败
- 现象:修改代码后构建报错,但全量编译成功。
- 解决:清理缓存重新同步:
/Applications/DevEco-Studio.app/.../hvigorw.js clean
2. 守护进程(daemon)冲突
- 现象:修改环境变量或工具链后,构建行为异常。
- 解决:终止守护进程:
/Applications/DevEco-Studio.app/.../hvigorw.js --stop
3. 并行编译(parallel)的资源竞争
- 现象:多模块同时编译时,偶发文件锁冲突(如
ENOENT
或EACCES
)。 - 解决:降低并行线程数(默认根据 CPU 核心数自动分配):
--parallel --max-workers=2 # 限制为 2 个线程
与 DevEco Studio 图形化操作的关系
- GUI 操作等价性:在 DevEco Studio 中点击 Build > Build Project 时,IDE 底层会生成类似命令,但可能省略部分参数(如默认启用
--daemon
)。 - 手动调用的优势:在自动化脚本或调试复杂问题时,手动指定参数更灵活。
总结
此命令是鸿蒙项目构建的核心步骤,通过 hvigor 工具实现:
- 同步配置(
--sync
) - 按产品形态构建(
-p product=default
) - 优化构建速度(
--parallel
、--incremental
、--daemon
)
若构建不稳定,可尝试以下操作:
4. 清理缓存:hvigor clean
5. 关闭增量编译:移除 --incremental
6. 查看详细日志:添加 --debug
参数。
附录三 .鸿蒙构建-Error: ENOENT: no such file or directory, uv_cwd
工程在进行构建的时候遇到这个问题:Error: ENOENT: no such file or directory, uv_cwd
详细报错其实是在 node 里面,因此在网络上主要有以下几种解决方式
-
如果是在终端运行的话,可以重启终端,看是否解决
-
暴力终止所有 node 进程:killall node (本人用此方法解决问题)
-
重启电脑。还真别说,我觉得靠谱。跟上一种方法有异曲同工之妙。但如果你不想每次都重启,可能还是优先看看上面的方法吧
上面参考了其他博主的问题。
相关文章:

使用Jenkins实现鸿蒙HAR应用的自动化构建打包
使用Jenkins实现鸿蒙HAR应用的自动化构建打包 在软件开发领域,自动化构建是提高开发效率和确保代码质量的重要手段。特别是在鸿蒙(OpenHarmony)应用开发中,自动化构建更是不可或缺。本文将详细介绍如何使用Jenkins命令行工具实现…...

AI时代,职场人如何开启学习之旅
为什么要学习 AI 在当今数字化时代,AI 正以前所未有的速度改变着我们的工作和生活方式。从智能客服到自动化生产,从数据分析到个性化推荐,AI 已经广泛渗透到各个行业和领域。学习 AI,对于工作人员来说,不仅是提升工作…...

MIT6.824 Lecture 2-RPC and Threads Lecture 3-GFS
Lecture 2-RPC and Threads Go语言在多线程、同步,还有很好用的RPC包 《Effective Go》 线程是实现并发的重要工具 在分布式系统里关注多线程的原因: I/O concurrencyParallelismConvenience Thread challenges 用锁解决race问题 Coordination channel…...

MySQL第五次作业
根据图片内容完成作业 1.建表 (1)建立两个表:goods(商品表)、orders(订单表) mysql> create table goods( -> gid char(8) primary key, -> name varchar(10), -> price decimal(8,2), -> num int); mysql> create t…...

【PDF提取内容】如何批量提取PDF里面的文字内容,把内容到处表格或者批量给PDF文件改名,基于C++的实现方案和步骤
以下分别介绍基于 C 批量提取 PDF 里文字内容并导出到表格,以及批量给 PDF 文件改名的实现方案、步骤和应用场景。 批量提取 PDF 文字内容并导出到表格 应用场景 文档数据整理:在处理大量学术论文、报告等 PDF 文档时,需要提取其中的关键信…...

智慧机房解决方案(文末联系,领取整套资料,可做论文)
智慧机房解决方案-软件部分 一、方案概述 本智慧机房解决方案旨在通过硬件设备与软件系统的深度整合,实现机房的智能化管理与服务,提升机房管理人员的工作效率,优化机房运营效率,确保机房设备的安全稳定运行。软件部分包括机房管…...

【C编程问题集中营】使用数组指针时容易踩得坑
【C编程问题集中营】使用数组指针时容易踩得坑 文章目录 【C编程问题集中营】使用数组指针时容易踩得坑一、获取数组首地址二、应用场景举例2.1 正常场景2.2 异常场景 三、总结 一、获取数组首地址 一维数组的首地址即数组第一个元素的指针,常用的获取一维数组首地…...

【Redis】Linux、Windows、Docker 环境下部署 Redis
一、Linux环境部署Redis 1、卸载 # 查看 Redis 是否还在运行 [appuserlocalhost redis]$ ps -ef|grep redis appuser 135694 125912 0 14:24 pts/1 00:00:00 ./bin/redis-server *:6379 appuser 135731 125912 0 14:24 pts/1 00:00:00 grep --colorauto redis# 停止…...

反函数定义及其推导
文章目录 定义存在条件举例说明总结 反函数是数学中一种特殊的函数,用于“逆转”另一个函数的映射关系。 定义 设有一个函数 f : X → Y f: X \to Y f:X→Y。如果存在一个函数 g : Y → X g: Y \to X g:Y→X,使得对于所有 x ∈ X x \in X x∈X 和 y…...

2025.2.9机器学习笔记:PINN文献阅读
2025.2.9周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 文献阅读 题目信息 题目: GPT-PINN:Generative Pre-Trained Physics-Informed Neural Networks toward non-intrusive Meta-learning of parametric PDEs期刊: Fini…...

Oracle数据连接 Dblink
拓展: oracle远程登陆数据库 1.oracle客户端或者服务端 2.修改你的电脑如下路径文件(服务器IP,服务器的数据库名,服务器的数据库端口号) c:\oracle\product\10.2.0\db_1\NETWORK\ADMIN\tnsnames.ora orcl_109 (DESCRIPTION …...

fetch请求总结,fastadmin中后台接口强制返回json数据
fetch请求 提交图片,只支持formData方式,这样会自动变为multiform方式,而且一般的post大多都可以用这样的方式来完成请求 const formData new FormData(); formData.append(file, fileInput.files[0]); formData.append(pid, id); formData.append(dc, 1);fetch(/api/common…...

基于STM32的智能鱼缸水质净化系统设计
🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智能鱼缸水质净化系统。 目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 1、设计要求…...

JAVA安全—FastJson反序列化利用链跟踪autoType绕过
前言 FastJson这个漏洞我们之前讲过了,今天主要是对它的链条进行分析一下,明白链条的构造原理。 Java安全—log4j日志&FastJson序列化&JNDI注入_log4j漏洞-CSDN博客 漏洞版本 1.2.24及以下没有对序列化的类做校验,导致漏洞产生 1.2.25-1.2.41增加了黑名单限制,…...

格式化字符串漏洞(Format String Vulnerability)
格式化字符串漏洞(Format String Vulnerability)是程序中因不当处理格式化字符串参数而导致的一类安全漏洞,常被攻击者利用来读取内存数据、篡改程序执行流程,甚至执行任意代码。以下是对其原理、利用方式及防御措施的详细解析&am…...

C++--iomanip库
目录 1. 设置字段宽度:std::setw() 2. 设置浮点数精度:std::setprecision() 3. 设置填充字符:std::setfill() 4. 控制对齐方式:std::left 和 std::right,std::internal 5. 控制进制输出:std::hex、std…...

Redis 集群原理、主从复制和哨兵模式的详细讲解
引言:本文记录了博主在学习Redis的过程中的原理,了解为什么使用与怎么样使用 Redis 集群,在使用 Redis 集群时出现的主从复制和哨兵模式的相关知识。本文并不涉及Redis安装。 文章目录 一、简单介绍什么是 Redis二、为什么要使用 Redis 集群三…...

基于Java的远程视频会议系统(源码+系统+论文)
第一章 概述 1.1 本课题的研究背景 随着人们对视频和音频信息的需求愈来愈强烈,追求远距离的视音频的同步交互成为新的时尚。近些年来,依托计算机技术、通信技术和网络条件的发展,集音频、视频、图像、文字、数据为一体的多媒体信息ÿ…...

springboot 事务管理
在Spring Boot中,事务管理是通过Spring框架的事务管理模块来实现的。Spring提供了声明式事务管理和编程式事务管理两种方式。通常,我们使用声明式事务管理,因为它更简洁且易于维护。 1. 声明式事务管理 声明式事务管理是通过注解来实现的。…...

深度学习-神经机器翻译模型
以下为你介绍使用Python和深度学习框架Keras(基于TensorFlow后端)实现一个简单的神经机器翻译模型的详细步骤和代码示例,该示例主要处理英 - 法翻译任务。 1. 安装必要的库 首先,确保你已经安装了以下库: pip insta…...

.NET周刊【2月第1期 2025-02-02】
国内文章 dotnet 9 已知问题 默认开启 CET 导致进程崩溃 https://www.cnblogs.com/lindexi/p/18700406 本文记录 dotnet 9 的一个已知且当前已修问题。默认开启 CET 导致一些模块执行时触发崩溃。 dotnet 使用 ColorCode 做代码着色器 https://www.cnblogs.com/lindexi/p/…...

【合集】Java进阶——Java深入学习的笔记汇总 amp; 再论面向对象、数据结构和算法、JVM底层、多线程
前言 spring作为主流的 Java Web 开发的开源框架,是Java 世界最为成功的框架,持续不断深入认识spring框架是Java程序员不变的追求;而spring的底层其实就是Java,因此,深入学习Spring和深入学习Java是硬币的正反面&…...

GPU、CUDA 和 cuDNN 学习研究【笔记】
分享自己在入门显存优化时看过的一些关于 GPU 和 CUDA 和 cuDNN 的网络资料。 更多内容见: Ubuntu 22.04 LTS 安装 PyTorch CUDA 深度学习环境-CSDN博客CUDA 计算平台 & CUDA 兼容性【笔记】-CSDN博客 文章目录 GPUCUDACUDA Toolkit都包含什么?NVID…...

【5】阿里面试题整理
[1]. 介绍一下ZooKeeper ZooKeeper是一个开源的分布式协调服务,核心功能是通过树形数据模型(ZNode)和Watch机制,解决分布式系统的一致性问题。 它使用ZAB协议保障数据一致性,典型场景包括分布式锁、配置管理和服务注…...

计算机毕业设计hadoop+spark+hive物流预测系统 物流大数据分析平台 物流信息爬虫 物流大数据 机器学习 深度学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...

Wpf美化按钮,输入框,下拉框,dataGrid
Wpf美化按钮,输入框,下拉框,dataGrid 引用代码后 引用资源 <ControlTemplate x:Key"CustomProgressBarTemplate" TargetType"ProgressBar"><Grid><Border x:Name"PART_Track" CornerRadius&q…...

搜索插入位置:二分查找的巧妙应用
问题描述 给定一个已排序的整数数组 nums 和一个目标值 target,要求在数组中找到目标值并返回其索引。如果目标值不存在于数组中,则返回它按顺序插入的位置。必须使用时间复杂度为 O(log n) 的算法。 示例: 示例1: 输入: nums …...

Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡
Cocos2d-x 游戏开发-打包apk被默认自带了很多不必要的权限导致apk被报毒,如何在Cocos 2d-x中强制去掉不必要的权限-优雅草卓伊凡 实战操作 去除权限 要在 Cocos2d-x 开发的游戏中去掉 APK 自带权限,可以按照以下步骤操作: 编辑 AndroidMa…...

自动化xpath定位元素(附几款浏览器xpath插件)
在 Web 自动化测试、数据采集、前端调试中,XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大,但面对复杂 DOM 结构时,XPath 仍然更具灵活性。因此,掌握 XPath,不仅能提高自动化测试的稳定性,还能在爬…...

String类(6)
大家好,今天我们继续来学习一下String类的查找方法,主要是反向查找的一些方法。 ⭐️从后往前找一样的道理,如果找到了就返回对应字符的下标. 如果后面有对应的字符,则会返回第一个遇到的字符下标. ⭐️注意一下传入字符串的找法…...