使用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命令行工具实现…...
2025年02月10日Github流行趋势
项目名称:dify 项目地址url:https://github.com/langgenius/dify项目语言:TypeScript历史star数:64707今日star数:376项目维护者:takatost, crazywoola, laipz8200, iamjoel, JohnJyong项目简介:…...
Ansible简单介绍及用法
一、简介 Ansible是一个简单的自动化运维管理工具,基于Python语言实现,由Paramiko和PyYAML两个关键模块构建,可用于自动化部署应用、配置、编排task(持续交付、无宕机更新等)。主版本大概每2个月发布一次。 Ansible与Saltstack最大的区别是…...
渗透利器工具:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)
Burp Suite 联动 XRAY 图形化工具.(主动扫描被动扫描) Burp Suite 和 Xray 联合使用,能够将 Burp 的强大流量拦截与修改功能,与 Xray 的高效漏洞检测能力相结合,实现更全面、高效的网络安全测试,同时提升漏…...
HTML-day1(学习自用)
目录 一、HTML介绍 二、常用的标签 1、各级标题(h1-h6) 2、段落标签(p) 3、文本容器(span) 4、图片标签(img) 5、超链接标签(a) 6、表格(t…...
Vue07
一、Vuex 概述 目标:明确Vuex是什么,应用场景以及优势 1.是什么 Vuex 是一个 Vue 的 状态管理工具,状态就是数据。 大白话:Vuex 是一个插件,可以管理 Vue 通用的数据 (多组件共享的数据)。例如:购物车数…...
Godot开发框架探索#2
前言 距离上次发文又又又隔了很长一段时间。主要原因还是因为思绪在徘徊,最近纠结的点有以下几个:1.渴求一个稳定的Godot开发框架;2.要不要使用更轻量的开发框架,或者直接写引擎; 3.对自己想做的游戏品类拿不定主意。…...
deepseek实现私有知识库
前言 之前写了如何本地部署deepseek,已经可以私有化问答了,本地搭建deepseek实操(ollama搭建,docker管理,open-webui使用) 其中我觉得最厉害的还是这个模型蒸馏,使我们可以用很低的代价使用大模…...
2.10学习总结
Dijkstra算法求取最短路径 注:迪杰斯特拉算法并不能直接生成最短路径,但是算法将最短路径信息保存在dist数组和path数组中。 dist数组中保存的是起始点到数组下标对应顶点的路径长度(累加的结果)path数组中保存的是对应path数组…...
【探索未来科技】2025年国际学术会议前瞻
【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议( EIBDCT 2025)代码示例:机器学习中的线性回…...
pytest.fixture
pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…...
大模型基本原理(四)——如何武装ChatGPT
传统的LLM存在几个短板:编造事实、计算不准确、数据过时等,为了应对这几个问题,可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG(检索增强生成) LLM生成的内容会受到训练…...
开发完的小程序如何分包
好几次了,终于想起来写个笔记记一下 我最开始并不会给小程序分包,然后我就各种搜,发现讲的基本上都是开发之前的小程序分包,可是我都开发完要发布了,提示我说主包太大需要分包,所以我就不会了。。。 好了…...
java配置api,vue网页调用api从oracle数据库读取数据
一、主入口文件 1:java后端端口号 2:数据库类型 和 数据库所在服务器ip地址 3:服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1:column后变量名是数据库中存储的变量名 property的值是column值的…...
iOS三方登录 - Facebook登录
引言 在出海APP的开发中,集成主流社交平台的三方登录已成为必不可少的一环。Facebook 作为全球最大的社交网络平台之一,其提供的 Facebook 登录功能能够大大简化用户注册和登录流程,提高用户体验,减少流失率。对于开发者而言&…...
使用 OpenGL ES 渲染一个四边形
使用 OpenGL ES 渲染一个四边形 在 iOS 开发中,OpenGL ES 是一个强大的工具,用于实现高性能的 2D 和 3D 图形渲染。本文将通过一个完整的代码示例,详细解析如何使用 OpenGL ES 渲染一个简单的四边形。我们将从基础概念入手,逐步讲解代码的每个部分,帮助你理解 OpenGL ES …...
机器学习 - 理解偏差-方差分解
为了避免过拟合,我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高,容易导致过拟合。相反,如果限制模型的复杂度,降低其拟合能力,又可能会导致欠拟合。因此,如何在模型…...
深入解析 Android 系统属性 跨进程 API:SystemProperties、ContentObserver 的使用
基础篇.系统属性 & 跨进程 API 📢 1. 职业规划篇 来聊聊安卓职业规划?整机开发大专能做么? 📢 2.基础篇 基础篇.前言 基础篇.编译环境搭建 基础篇.源码目录简介 基础篇.系统 mk_bp 讲解 基础篇.开机动画定制 基础篇.定制桌面壁…...
从 .NET Framework 升级到 .NET 8 后 SignalR 问题处理与解决方案
随着 .NET Framework 向 .NET 8 的迁移,许多开发者在使用 SignalR 时遇到了一些前后端连接、配置、调用等方面的问题。尤其是在处理 SignalR 实时通信功能时,升级后的一些兼容性问题可能导致应用程序无法正常工作。本文将介绍在从 .NET Framework 升级到…...
深入解析 Linux 系统中 Cron 定时任务的配置与管理
在 Linux 和类 Unix 系统中,cron 是一个非常强大的工具,用于定时执行各种任务,例如自动备份、定时运行脚本和定期清理日志文件。通过合理配置 cron,你可以让很多系统维护任务自动化,从而减轻日常管理的压力。而 cronta…...
深度学习01 神经网络
目录 神经网络 感知器 感知器的定义 感知器的数学表达 感知器的局限性 多层感知器(MLP, Multi-Layer Perceptron) 多层感知器的定义 多层感知器的结构 多层感知器的优势 偏置 偏置的作用 偏置的数学表达 神经网络的构造 神经网络的基本…...
ffmpeg基本用法
一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明: global options:全局选项,应用于整个 FFmpeg 进程,它们通常不受输入或输出部分的限制。 infile options:输入选…...
强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略
目录 一、引言二、强化学习基础回顾(一)策略(二)价值函数 三、近端策略优化(PPO)算法(一)算法原理(二)PPO 目标函数(三)代码示例&…...
【HDSF】ProtobufRpcEngine 和 ProtobufRpcEngine2
ProtobufRpcEngine2的call方法实现如下,它对历史版本的protobuf实现进行了兼容。 即同时支持protobuf 2.5.0 和protobuf 3.x版本的RPC通信。 看下具体是怎么实现的? @SuppressWarnings("deprecation")protected Writable call(RPC.Server server, String connecti…...
Redis中的某一热点数据缓存过期了,此时有大量请求访问怎么办?
1、提前设置热点数据永不过期 2、分布式中用redis分布式锁(锁可以在多个 JVM 实例之间协调)、单体中用synchronized(锁只在同一个 JVM 内有效) 编写服务类 import com.redisson.api.RLock; import com.redisson.api.RedissonCli…...
IntelliJ IDEA 安装与使用完全教程:从入门到精通
一、引言 在当今竞争激烈的软件开发领域,拥有一款强大且高效的集成开发环境(IDE)是开发者的致胜法宝。IntelliJ IDEA 作为 JetBrains 公司精心打造的一款明星 IDE,凭借其丰富多样的功能、智能精准的代码提示以及高效便捷的开发工…...
自动化xpath定位元素(附几款浏览器xpath插件)
在 Web 自动化测试、数据采集、前端调试中,XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大,但面对复杂 DOM 结构时,XPath 仍然更具灵活性。因此,掌握 XPath,不仅能提高自动化测试的稳定性,还能在爬…...
PromptSource官方文档翻译
目录 核心概念解析 提示模板(Prompt Template) P3数据集 安装指南 基础安装(仅使用提示) 开发环境安装(需创建提示) API使用详解 基本用法 子数据集处理 批量操作 提示创建流程 Web界面操作 手…...
2025年软件测试五大趋势:AI、API安全、云测试等前沿实践
随着软件开发的不断进步,测试方法也在演变。企业需要紧跟新兴趋势,以提升软件质量、提高测试效率,并确保安全性,在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...
js的DOM一遍过
一、获取元素 1.根据id获取 document.getElementById(id);2.根据标签名获取 使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的集合。 document.getElementsByTagName(标签名);获取某个元素(父元素)内部所有指定标签名的子元素。 element.getElementsByTag…...
