Centos7.x内网环境Jenkins前端打包环境配置
Centos7.x内网环境Jenkins前端打包环境配置
参考地址:
https://www.cnblogs.com/guangdelw/p/18763336
https://2048.csdn.net/682c1be8606a8318e857d687.html
前言:环境描述和目标
最近公司新接了一个项目,要求是:需要再桌面云中进行内网开发,所有的开发桌面云没办法连接公网,但是内网搭建了nexus私服,java 和 npm 的应用可以通过nexus私服来下载依赖。
我们本地的文件可以复制到桌面云内部,但是桌面云中的文件无法复制出来。
目标:
- 需要将本地的代码上传到对方提供的gitlab私服
- 安装Jenkins到Centos服务器中
- 添加前后端的打包配置到Jenkins中
代码迁移的过程就不描述了,这里着重描述安装Jenkins 和 添加配置。
一、安装Jenkins
Jenkins的国内源:
以下是一些常用的国内 Jenkins 插件更新源地址:
- 清华大学:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 华为开源镜像站:https://mirrors.huaweicloud.com/jenkins/updates/update-center.json
- 腾讯云:https://mirrors.cloud.tencent.com/jenkins/updates/update-center.json
- 中国科学技术大学:https://mirrors.ustc.edu.cn/jenkins/updates/update-center.json
- 北京理工大学:https://mirror.bit.edu.cn/jenkins/updates/update-center.json
1.1、前置思考:
由于公司的后端代码使用的JDK版本为1.8,所以为了统一jdk版本,所以最初选定使用JDK8的最后一个版本:Jenkins-2.346.3;
但是再实际操作的时候发现:Jenkins在线安装插件的时候,并不会将当前Jenkins的版本传过去获取适合当前版本的插件,而是会获取当前最新版本,基于这种情况最终选定安装比较LTS新版本的2.479.3 (注意这里使用的是JDK17)
而安装的过程区分为两种方式:
- 再一个可联网的机器上安装插件,然后将插件和配置目录打包一起迁移到服务器中(默认的目录为:当前用户主目录下的**.jenkins**文件夹下)
- 只是将 jpi插件 copy到桌面云中,并通过web界面一个个上传上去
相比之下第一种操作方式更简单,所以最终选用第一种方式。
但是当前时间(2025-05-27)前后国内的插件源没办法使用,找不到对应的 update-center.json 文件,所以吭哧了好久最终使用魔法直接连接插件官网直接进行下载的。
1.2、安装的过程
操作步骤如下:
- 下载 jenkins.war 文件
- 通过 java -jar jenkins.war 命令进行启动
- 然后配置用户名和密码和选择插件下载即可。
- 下载完毕后,直接将jenkins配置主目录(当前用户主目录下的**.jenkins**文件夹下)和 jenkins.war 文件打包上传到桌面云服务器中
- 然后解压,将其 .jenkins 目录同样放到当前用户主目录下,然后启动即可
二、前端环境的配置
2.1、nodejs环境的安装和配置
2.1.1、前置思考:
由于我们使用服务器为:Centos7.9,而项目依赖的nodejs版本要求为:16.15.1, pnpm的安装要求为:大于18,基于安装LTS版本的要求,最终选定安装:18.20.8或者20.19.2版本。
而官网提供 18.20.8 或者 20.19.2 版本的nodejs再Centos7.9通过tar包安装配置后,再执行:node -v 的过程出现类似一下的错误:
$ node -v
/lib64/libm.so.6: version `GLIBC_2.27' not found (required by ./node)
/lib64/libc.so.6: version `GLIBC_2.25' not found (required by ./node)
/lib64/libc.so.6: version `GLIBC_2.28' not found (required by ./node)
/lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by ./node)
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by ./node)
/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by ./node)linux-vdso.so.1 => (0x00007ffca6bd4000)libdl.so.2 => /lib64/libdl.so.2 (0x00002b574ed87000)libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00002b574ef8b000)libm.so.6 => /lib64/libm.so.6 (0x00002b574f293000)libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b574f595000)libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b574f7ab000)libc.so.6 => /lib64/libc.so.6 (0x00002b574f9c7000)/lib64/ld-linux-x86-64.so.2 (0x00002b574eb63000)
大概的原因是:
而CentOS 7.x等操作系统自带的glibc版本为2.17,Node.js v18.x或更高编译的环境所需glibc≥2.28,所以这里有三种方案:
- 升级本服务器的glibc,但是各个应用之间会依赖低版本的,强制升级会导致其他应用服务异常(不推荐)
- 通过Linux的scl计划,再CentOS 7.x安装各种开发工具集,重新编译(不推荐)
- 通过nodejs官网旗下的unofficial-builds子计划,来下载对方提供好的编译版。地址为:https://unofficial-builds.nodejs.org/download/release/
再unofficial-builds提供的nodejs中, 18.20.8 版本再实际的使用过程中发现还是会有报错的情况,所以最终选择了 20.19.2,下载的地址为:
https://unofficial-builds.nodejs.org/download/release/v20.19.2/node-v20.19.2-linux-x64-glibc-217.tar.xz
2.1.2、nodejs的安装
具体的操作如下:
- 下载 node-v20.19.2-linux-x64-glibc-217.tar.xz 文件并上传到桌面云服务器中
- 通过
tar -Jxf node-v20.19.2-linux-x64-glibc-217.tar.xz
对文件进行解压缩 - 配置环境变量,将当前目录配置到 PATH 中,然后重新加载配置文件:
. /etc/profile
- npm配置使用nexus的私服,执行操作:
npm config set registry https://nexus.sunwoda.com/repository/npm-group
2.2、项目的编译
2.2.1、项目中的配置文件
{// 省略部分配置"devDependencies": {"@ant-design/colors": "^6.0.0","@commitlint/cli": "^17.6.6","@commitlint/config-conventional": "^17.6.6","@iconify/json": "^2.2.87","@purge-icons/generated": "^0.9.0","@types/codemirror": "^5.60.8","@types/crypto-js": "^4.1.1","@types/intro.js": "^5.1.1","@types/lodash-es": "^4.17.7","@types/mockjs": "^1.0.7","@types/nprogress": "^0.2.0","@types/qrcode": "^1.5.1","@types/qs": "^6.9.7","@types/showdown": "^2.0.1","@types/sortablejs": "^1.15.1","@dcore/eslint-config": "workspace:*","@dcore/stylelint-config": "workspace:*","@dcore/ts-config": "workspace:*","@dcore/types": "workspace:*","@dcore/vite-config": "workspace:*","@vue/compiler-sfc": "^3.3.4","@vue/test-utils": "^2.4.0","cross-env": "^7.0.3","cz-git": "^1.6.1","czg": "^1.6.1","eslint": "^8.13.0","eslint-config-prettier": "^8.5.0","eslint-define-config": "^1.1.1","eslint-plugin-jest": "^25.2.2","eslint-plugin-prettier": "^4.0.0","eslint-plugin-vue": "^8.6.0","husky": "^8.0.3","lint-staged": "13.2.3","prettier": "^2.8.8","prettier-plugin-packagejson": "^2.4.4","rimraf": "^5.0.1","turbo": "^1.10.7", // 这里是个关键,后面考试要考"typescript": "^5.1.6","unbuild": "^1.2.1","vite": "^4.4.0","vite-plugin-mock": "^2.9.6","vue-tsc": "^1.8.4"},"packageManager": "pnpm@8.1.0","engines": {"node": ">=16.15.1","pnpm": ">=8.1.0"}
}
2.2.2、配置、编译和打包
# npm 先配置registry私服地址,注意私服地址结尾不要添加“/”否则后期会报错
$ npm config set registry https://nexus.sunwoda.com/repository/npm-group# 先安装 pnpm 命令
$ npm install pnpm@8.6.7 -g# 安装 turbo 命令
$ npm install turbo@1.10.8 -g# pnpm 命令也配置registry私服地址
$ pnpm config set registry https://nexus.sunwoda.com/repository/npm-group# 进入项目工程,先拉取依赖
$ pnpm install# 打包操作
$ pnpm run build
2.2.3、操作过程中的异常情况
2.2.3.1、pnpm install
出现error (ERR_INVALID_THIS)的情况
具体的报错内容如下:
$ pnpm install
Scope: all 7 workspace projects
internal/eslint-config | WARN deprecated eslint@8.46.0WARN deprecated eslint-define-config@1.1.1: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.WARN deprecated @iconify/iconify@3.1.1: no longer maintained, switch to modern iconify-icon web componentWARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/debug error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/graphemer error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/ignore error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left. WARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/natural-compare-lite error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/semver error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/ts-api-utils error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/@eslint%2Feslintrc error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.WARN GET https://nexus.sunwoda.com/repository/npm-ptl-hosted/@eslint%2Fjs error (ERR_INVALID_THIS). Will retry in 10 seconds. 2 retries left.
在 nodejs20 版本中,就会出现这个问题,为了解决这个问题,你只需要升级到 pnpm v8.3.1 或更高版本即可。
参考地址:
https://www.wyr.me/post/746
https://blog.csdn.net/qq_19661477/article/details/134234971
2.2.3.2、pnpm install
出现turbo run stub,run failed: error hashing package files
具体的报错内容如下:
$ pnpm install
. postinstall$ turbo run stub
│ ERROR run failed: error hashing package files: git error: 'git status' in /root/abc/limsui/packages/hooks exited with code 129 stderr: error: unknown option `no-renames'
│ usage: git status [options] [--] <pathspec>...
│ -v, --verbose be verbose
│ -s, --short show status concisely
│ -b, --branch show branch information
│ --porcelain machine-readable output
│ --long show status in long format (default)
│ -z, --null terminate entries with NUL
│ -u, --untracked-files[=<mode>]
│ show untracked files, optional modes: all, normal, no. (Default: all)
│ --ignored show ignored files
│ --ignore-submodules[=<when>]
│ ignore changes to submodules, optional when: all, dirty, untracked. (Default: all)
│ --column[=<style>] list untracked files in columns
这个是 turbo v1.10.7 版本的bug,然后升级package.json中turbo的版本到新版本即可,例如: turbo v1.10.8,
参考地址:
https://github.com/vercel/turborepo/issues/5447#issuecomment-1621908600
扩展操作
1、将依赖上传到nexus私服中
# 本地npm环境添加镜像
$ npm config set registry https://registry.npmmirror.com# 安装 pnpm
$ npm i pnpm@8.6.7 -g# 安装 get-npm-tgz
$ npm i get-npm-tgz -g# 进入到项目目录中,然后下载依赖
$ pnpm install# 然后将 pnpm-lock.yaml 转换为:package-lock.json
$ npx pnpm-lock-to-npm-lock ./pnpm-lock.yaml# 这个命令会把当前文件夹的 package-lock.json 的依赖tgz格式下载下来, 执行成功后所有的依赖会再当前目录的 tgz 文件夹下
$ npx get-npm-tgz# 然后将tgz文件夹压缩为xz文件,然后上传到桌面云中
$ tar -Jcf tgz.tar.xz tgz#======= 以下内容再桌面云中执行 =======
# 先解压缩
$ tar -Jxf tgz.tar.xz# 先设置私服的url并进行登录
$ npm login --registry http://registry.npmjs.com# 发布 xxxx.tgz 文件
$ npm publish xxxx.tgz
批量的发布脚本
#!/bin/bashREPOSITORY=https://nexus.sunwoda.com/repository/npm-ptl-hosted
PACKAGES_PATH=./tgznpm login --registry=$REPOSITORYfor package in $PACKAGES_PATH/*.tgz; donpm publish --registry=$REPOSITORY $package
done
参考地址:
https://blog.csdn.net/2401_85743969/article/details/141128702
https://www.npmjs.com/package/get-npm-tgz
相关文章:
Centos7.x内网环境Jenkins前端打包环境配置
Centos7.x内网环境Jenkins前端打包环境配置 参考地址: https://www.cnblogs.com/guangdelw/p/18763336 https://2048.csdn.net/682c1be8606a8318e857d687.html 前言:环境描述和目标 最近公司新接了一个项目,要求是:需要再桌面…...

Kafka集成Flume/Spark/Flink(大数据)/SpringBoot
Kafka集成Flume Flume生产者 ③、安装Flume,上传apache-flume的压缩包.tar.gz到Linux系统的software,并解压到/opt/module目录下,并修改其名称为flume Flume消费者 Kafka集成Spark 生产者 object SparkKafkaProducer{def main(args:Array[S…...

Scratch节日 | 拯救屈原 | 端午节
端午节快乐! 这款特别为端午节打造的Scratch游戏 《拯救屈原》,将带你走进古代中国,感受历史与文化的魅力! 🏮 游戏介绍 扮演勇敢的探险者,穿越时空回到古代,解锁谜题,完成任务&…...

rabbitmq Direct交换机简介
在实际开发中,需求可能变得复杂,如消息的收发和处理。以支付系统为例,成功支付后需要改变订单状态并通知用户,而失败则不需要。为处理这种情况,提出了使用Direct交换机,它可以根据规则将消息路由到指定队列…...

Git实战--基于已有分支克隆进行项目开发的完整流程
Git克隆项目开发流程 ✅ 一、完整流程概述✅ 二、详细操作步骤Step 1:克隆仓库(如果尚未克隆)Step 2:获取远程分支信息并切换到 feature/ 获取所有远程分支Step 3:创建并切换到你的新分支Step 4:开始开发新…...
MapReduce(期末速成版)
起初在B站看3分钟的速成视频,感觉很多细节没听懂。 具体例子解析(文件内容去重) 对于两个输入文件,即文件A 和文件B,请编写MapReduce 程序,对两个文件进行合并,并剔除 其中重复的内容,得到一个新的输出文件…...
鸿蒙OSUniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器#三方框架 #Uniapp
UniApp 移动端直播流播放实战:打造符合鸿蒙设计风格的播放器 在移动互联网时代,直播已经成为一种主流的内容形式。本文将详细介绍如何使用 UniApp 框架开发一个优雅的直播流播放器,并融入鸿蒙系统的设计理念,实现一个既美观又实用…...

C3、C2f、C3K2、C2PSA的具体结构
YOLOV5 C3 Bottleneck C2f...

2_MCU开发环境搭建-配置MDK兼容Keil4和C51
MCU开发环境搭建-配置MDK兼容Keil4和C51 一、概述 本文以MDK-ARM V5.36版本基础介绍DMK-ARM工程兼容Keil4和C51的配置。 注:在阅读本文前,请先安装和配置完成MDK-ARM(Keil5)。 二、工具包下载 链接: https://pan.baidu.com/s/1Tu2tDD6zRra4xb_PuA1Wsw 提取码: 81pp 三、…...

通过远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误怎么办?
本文介绍通过远程桌面连接Windows实例提示“出现身份验证错误无法连接到本地安全机构”错误的解决方案。 问题现象 通过本地电脑内的远程桌面连接Windows实例提示“出现身份验证错误,无法连接到本地安全机构”错误。 问题原因 导致该问题的可能原因如下&#x…...

百度golang研发一面面经
输入一个网址,到显示界面,中间的过程是怎样的 IP 报文段的结构是什么 Innodb 的底层结构 知道几种设计模式 工厂模式 简单工厂模式:根据传入类型参数判断创建哪种类型对象工厂方法模式:由子类决定实例化哪个类抽象工厂模式&#…...

TC3xx学习笔记-启动过程详解(一)
文章目录 前言Firmware启动过程BMHD Check流程ABM启动Internal Flash启动Bootloader ModeProcessing in case no valid BMHD foundProcessing in case no Boot Mode configured by SSW 总结 前言 之前介绍过UCB BMHD的使用,它在启动过程中起着重要的作用࿰…...

Scratch节日 | 六一儿童节抓糖果
六一儿童节怎么能没有糖果?这款 六一儿童节抓糖果 小游戏,让你变身小猫,开启一场甜蜜大作战! 🎮 游戏玩法 帮助小猫收集所有丢失的糖果,收集越多分数越高! 小心虫子一样的“坏糖果”ÿ…...
系统调用与程序接口的关系
程序接口类型 系统调用:是操作系统提供给应用程序的接口 ,允许应用程序请求操作系统执行特定操作,像文件操作(打开、读写、关闭文件 )、进程管理(创建、终止进程 )、设备管理(操作磁…...
从线性方程组角度理解公式 s=n−r(3E−A)
从线性方程组角度理解公式 sn−r(3E−A) 这个公式本质上是 齐次线性方程组解空间维度 的直接体现。下面通过三个关键步骤解释其在线性方程组中的含义: 1. 公式对应的线性方程组 考虑矩阵方程: (3E−A)x0 其中: x 是 n 维未知向量3E−…...

通信算法之280:无人机侦测模块知识框架思维导图
1. 无人机侦测模块知识框架思维导图, 见文末章节。 2. OFDM参数估计,基于循环自相关特性。 3. 无人机其它参数估计...

【Doris基础】Apache Doris中的Coordinator节点作用详解
目录 1 Doris架构概述 2 Coordinator节点的核心作用 2.1 查询协调与调度 2.2 执行计划生成与优化 2.3 资源管理与负载均衡 2.4 容错与故障恢复 3 Coordinator节点的关键实现机制 3.1 两阶段执行模型 3.2 流水线执行引擎 3.3 分布式事务管理 4 Coordinator节点的高可…...
软考 系统架构设计师之考试感悟3
接前一篇文章:软考 系统架构设计师之考试感悟2 上周六(2025年5月24日),本人第三次参加了软考系统架构师的考试。和前两次一样,考了一天,身心俱疲。不过这次感觉比上一次要稍微好点,可能也是考的…...

【Kubernetes-1.30】--containerd部署
文章目录 一、环境准备1.1 三台服务器1.2 基础配置(三台机通用)1.3 关闭 Swap(必须)1.4 关闭防火墙(可选)1.5 加载必要模块 & 配置内核参数 二、安装容器运行时(containerd 推荐)…...
Flutter 嵌套H5 传参数
你可以通过在加载 H5 页面时,将 token 作为 URL 参数拼接,或者通过 WebView 的 JavaScript 通信功能(如 runJavaScript 或 addJavaScriptChannel)传递 token。常用方式如下: 方式一:URL 拼接参数 假设你的…...
什么是线程上下文切换?
导语: 线程上下文切换(Context Switch)是Java并发编程中一个常见但容易被忽视的概念。在高并发场景下,它直接影响系统性能。本文将从面试官角度深入剖析这个话题,帮你理解底层原理、掌握优化思路、规避项目中的常见陷阱…...
Jvm 元空间大小分配原则
JVM元空间(Metaspace)的大小分配原则与系统物理内存密切相关,但并不是直接等比例分配,而是通过一系列参数和JVM的动态管理机制来确定。下面从原理和实际行为两方面详细说明: 1. 元空间(Metaspace࿰…...

相机--相机标定
教程 内外参公式及讲解 相机标定分类 相机标定分为内参标定和外参标定。 相机成像原理 相机成像畸变 链接 四个坐标系的转变 内参标定 内参 相机内参通常用一个 33 矩阵(内参矩阵,KK)表示,形式如下: (1)焦距&…...

MongoDB(七) - MongoDB副本集安装与配置
文章目录 前言一、下载MongoDB1. 下载MongoDB2. 上传安装包3. 创建相关目录 二、安装配置MongoDB1. 解压MongoDB安装包2. 重命名MongoDB文件夹名称3. 修改配置文件4. 分发MongoDB文件夹5. 配置环境变量6. 启动副本集7. 进入MongoDB客户端8. 初始化副本集8.1 初始化副本集8.2 添…...

131. 分割回文串-两种回溯思路
我们可以将字符串分割成若干回文子串,返回所有可能的方案。如果将问题分解,可以表示为分割长度为n-1的子字符串,这与原问题性质相同,因此可以采用递归方法解决。 为什么回溯与递归存在联系?在解决这个问题时࿰…...

[Java恶补day13] 53. 最大子数组和
休息了一天,开始补上! 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums …...

摩尔投票算法原理实现一文剖析
摩尔投票算法原理&实现一文剖析 一、算法原理1.1 基本思想1.2 数学原理 二、算法实现2.1 Python实现2.2 Java实现2.3 C实现 三、复杂度分析四、应用场景4.1 多数元素问题4.2 扩展应用:寻找出现次数超过n/3的元素 五、算法优势与注意事项5.1 优势5.2 注意事项 总…...
springboot项目下面的单元测试注入的RedisConnectionFactory类redisConnectionFactory值为什么为空呢?
你遇到的问题是: RedisConnectionFactory redisConnectionFactory 在单元测试中为 null 这是 Spring Boot 单元测试中非常常见的问题,根本原因是你的测试类没有启用 Spring 容器上下文,导致 Resource 注解无法注入 Bean。 ✅ 正确做法&…...

MyBatis操作数据库(2)
1.#{}和${}使用 Interger类型的参数可以看到这里显示的语句是:select username,password,age,gender,phone from userinfo where id? 输入的参数并没有在后面进行拼接,,id的值是使用?进行占位,这种sql称之为"预编译sql".这里,把#{}改成${}观察情况:这里可以看到…...

C++面向对象(二)
面向对象基础内容参考: C面向对象(一)-CSDN博客 友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定…...