主题
一、Npm&Pnpm工具实践

1.1 Npm构建工具简介
NPM(Node Package Manager)是Node.js的默认包管理器,用于JavaScript项目的依赖管理和构建。而 pnpm 是其高效替代方案,通过硬链接复用依赖节省磁盘空间并提升安装速度
NPM主要特点
依赖管理:自动处理包依赖关系
脚本运行:定义和执行项目脚本
版本控制:精确的依赖版本管理
安全检查:自动的安全漏洞检测
对比
| 工具 | 安装速度 | 磁盘占用 | 依赖管理 |
|---|---|---|---|
| npm | 较慢 | 较高 | 平铺结构 |
| pnpm | 快 | 低 | 硬链接复用 |
- 常用命令
bash
● npm install <moduleName> -g 包安装到全局
● npm list:查看当前已安装的包。
● npm config set registry https://registry.npm.taobao.org 设置淘宝源
● npm config set cache "/opt/npmcache/" 设置缓存路径1.2 Npm&Pnpm配置
1.2.1 安装Nvn工具并配置Npm/Pnpm
TIP
在安装Pnpm的时候,都需要先切换到Node.js,再安装Pnpm; Pnpm和Node.js版本关联
bash
wget https://github.com/nvm-sh/nvm/archive/refs/tags/v0.40.3.tar.gz
tar -xf v0.40.3.tar.gz -C /home/application && rm -rf v0.40.3.tar.gz
ls -l /home/application/nvm-0.40.3
总用量 288
-rw-rw-r-- 1 root root 2299 4月 24 07:34 bash_completion
-rw-rw-r-- 1 root root 7560 4月 24 07:34 CODE_OF_CONDUCT.md
-rw-rw-r-- 1 root root 5817 4月 24 07:34 CONTRIBUTING.md
-rw-rw-r-- 1 root root 3696 4月 24 07:34 Dockerfile
-rw-rw-r-- 1 root root 467 4月 24 07:34 GOVERNANCE.md
-rwxrwxr-x 1 root root 16631 4月 24 07:34 install.sh
-rw-rw-r-- 1 root root 1113 4月 24 07:34 LICENSE.md
-rw-rw-r-- 1 root root 5440 4月 24 07:34 Makefile
-rwxrwxr-x 1 root root 371 4月 24 07:34 nvm-exec
-rwxrwxr-x 1 root root 150227 4月 24 07:34 nvm.sh
-rw-rw-r-- 1 root root 2925 4月 24 07:34 package.json
-rw-rw-r-- 1 root root 2935 4月 24 07:34 PROJECT_CHARTER.md
-rw-rw-r-- 1 root root 50661 4月 24 07:34 README.md
-rwxrwxr-x 1 root root 1235 4月 24 07:34 rename_test.sh
-rw-rw-r-- 1 root root 882 4月 24 07:34 ROADMAP.md
drwxrwxr-x 11 root root 4096 4月 24 07:34 test
-rwxrwxr-x 1 root root 2478 4月 24 07:34 update_test_mocks.shbash
cat >> /etc/profile << 'EOF'
#nvm
. /home/application/nvm-0.40.3/nvm.sh
EOF
#使环境变量生效
source /etc/profilebash
#nvm版本
nvm -v
0.40.3
#nvm版本列表
nvm ls-remote
#安装node-v18.20.8
nvm install v18.20.8
#安装node-v16.17.1
nvm install v16.17.1
#查看本地所有node版本
nvm ls
v18.20.8
-> v16.17.1
v22.16.0
#切换node版本
nvm use v18.20.8
#查看node版本
node -vbash
npm config set registry https://registry.npmmirror.com
npm config get registry
https://registry.npmmirror.combash
npm install -g pnpm
pnpm config set registry https://registry.npmmirror.com
pnpm config get registry
https://registry.npmmirror.com
pnpm -v
10.12.11.3 Jenkins集成Npm
1.3.1 准备一个Npm项目

1.3.2 创建一个freestyle项目
- 创建JOB

- 源码管理

- 增加构建步骤/Execute shell
bash
#环境变量生效
. /home/application/nvm-0.40.3/nvm.sh
#选择node版本
nvm use v18.20.8
#查看npm版本
node -v
#安装依赖
npm install
#打包
npm run build
#查看打包结果
ls -l dist/
- 保存,构建


1.3.3 创建一个pipeline项目
- 创建JOB

- 编写pipeline脚本
groovy
pipeline {
agent any
stages {
stage("拉取代码"){
steps {
script {
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/npm-demo.git']])
}
}
}
stage("npm构建"){
steps {
script {
sh """
#环境变量生效
. /home/application/nvm-0.40.3/nvm.sh
#选择node版本
nvm use v18.20.8
#查看npm版本
node -v
#安装依赖
npm install
#打包
npm run build
#查看打包结果
ls -l dist/
"""
}
}
}
}
}- 保存,构建


1.3.4 指定任务在docker-slave节点上构建
Readme
在docker-slave节点上构建 需要使用到Docker-plugin 插件,docker-slave及使用方法不在此讨论,后续单独讨论

- 编写Jenkins-slave Dockerfile文件
Readme
- 基础镜像来源于
jenkins/inbound-agent:latest-jdk17,此镜像自带jdk17,此镜像自带jdk17,官方Dockerfile: https://github.com/jenkinsci/docker-agent/blob/master/debian/Dockerfile jenkins slave节点通过JNLP的方式连接jenkins master, 将自动配置代理的name和secret,不需要对容器进行任何特殊配置。- 镜像中封装了常见的工具,可自行选择
- 为了提高构建速度,可将
/root/.npm挂载到docker宿主机上/home/application/jenkins/npm-cache
yaml
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17
# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for node:18"
LABEL version="1.0"
# 切换到root用户进行安装配置
USER root
# 设置环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
LANGUAGE=C.UTF-8 \
LC_ALL=C.UTF-8
# 配置系统设置和安装必要工具
RUN set -eux; \
# 更换Debian源为腾讯云镜像
sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
# 配置时区
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
# 更新包列表并安装必要工具
apt-get update && \
apt-get install -y \
bash-completion \
bc \
cifs-utils \
curl \
dnsutils \
g++ \
gcc \
git \
git-lfs \
htop \
iftop \
iotop \
jq \
lrzsz \
nmap \
netcat-openbsd \
nethogs \
net-tools \
ntpdate \
openssh-server \
psmisc \
sysstat \
tar \
telnet \
tzdata \
unzip \
vim \
wget && \
# 安装Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
apt-get install -y nodejs && \
# 清理apt缓存
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# 安装和配置包管理工具
npm install -g pnpm yarn && \
pnpm config set registry https://mirrors.cloud.tencent.com/npm/ && \
yarn config set registry https://mirrors.cloud.tencent.com/npm/
# 切换回jenkins用户以提高安全性
USER jenkinsbash
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:node-18 .bash
mkdir -p /home/application/jenkins/npm-cacheDocker Agent templates
- 进入
Jenkins管理界面 > 系统配置 > Clouds - 选择
已有的cloud云节点 > configure > Docker Agent templates > 进度条拖到最下面 > Add Docker Template
- 进入
Readme
- 配置npm缓存目录
type=bind,source=/home/application/jenkins/npm-cache,target=/root/.npm




创建JOB

编写pipeline脚本

groovy
pipeline {
agent {
label 'node-20'
}
stages {
stage('打印版本') {
steps {
sh 'java -version'
sh 'node -v'
sh 'pnpm -v'
}
}
stage('拉取代码') {
steps {
script {
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/npm-demo.git']])
}
}
}
stage('构建前端包(Node.js)') {
steps {
script {
sh "npm install"
sh "npm run build"
sh "ls -l dist/"
}
}
}
}
}- 构建并查看结果




1.3.5 使用不同的Npm版本构建JOB
- 编写Jenkins-slave Dockerfile文件
yaml
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17
# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for node:20"
LABEL version="1.0"
# 切换到root用户进行安装配置
USER root
# 设置环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
LANGUAGE=C.UTF-8 \
LC_ALL=C.UTF-8
# 配置系统设置和安装必要工具
RUN set -eux; \
# 更换Debian源为腾讯云镜像
sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
# 配置时区
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
# 更新包列表并安装必要工具
apt-get update && \
apt-get install -y \
bash-completion \
bc \
cifs-utils \
curl \
dnsutils \
g++ \
gcc \
git \
git-lfs \
htop \
iftop \
iotop \
jq \
lrzsz \
nmap \
netcat-openbsd \
nethogs \
net-tools \
ntpdate \
openssh-server \
psmisc \
sysstat \
tar \
telnet \
tzdata \
unzip \
vim \
wget && \
# 安装Node.js
curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && \
apt-get install -y nodejs && \
# 清理apt缓存
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# 安装和配置包管理工具
npm install -g pnpm yarn && \
pnpm config set registry https://mirrors.cloud.tencent.com/npm/ && \
yarn config set registry https://mirrors.cloud.tencent.com/npm/
# 切换回jenkins用户以提高安全性
USER jenkinsyaml
# 基于Jenkins inbound-agent的定制镜像
FROM jenkins/inbound-agent:latest-jdk17
# 添加镜像信息
LABEL maintainer="srebro"
LABEL description="inbound-agent:latest-jdk17-debian for node:18"
LABEL version="1.0"
# 切换到root用户进行安装配置
USER root
# 设置环境变量
ENV TZ=Asia/Shanghai \
LANG=C.UTF-8 \
LANGUAGE=C.UTF-8 \
LC_ALL=C.UTF-8
# 配置系统设置和安装必要工具
RUN set -eux; \
# 更换Debian源为腾讯云镜像
sed -Ei "s/(deb|security).debian.org/mirrors.cloud.tencent.com/g" /etc/apt/sources.list.d/debian.sources && \
# 配置时区
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone && \
# 更新包列表并安装必要工具
apt-get update && \
apt-get install -y \
bash-completion \
bc \
cifs-utils \
curl \
dnsutils \
g++ \
gcc \
git \
git-lfs \
htop \
iftop \
iotop \
jq \
lrzsz \
nmap \
netcat-openbsd \
nethogs \
net-tools \
ntpdate \
openssh-server \
psmisc \
sysstat \
tar \
telnet \
tzdata \
unzip \
vim \
wget && \
# 安装Node.js
curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \
apt-get install -y nodejs && \
# 清理apt缓存
apt-get clean && \
rm -rf /var/lib/apt/lists/* && \
# 安装和配置包管理工具
npm install -g pnpm yarn && \
pnpm config set registry https://mirrors.cloud.tencent.com/npm/ && \
yarn config set registry https://mirrors.cloud.tencent.com/npm/
# 切换回jenkins用户以提高安全性
USER jenkinsbash
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:node-18 .
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:node-20 .Docker Agent templates
- 进入
Jenkins管理界面 > 系统配置 > Clouds - 选择
已有的cloud云节点 > configure > Docker Agent templates > 进度条拖到最下面 > Add Docker Template
- 进入
Readme
- 配置maven缓存目录
type=bind,source=/home/application/jenkins/npm-cache,target=/root/.npm




- 创建JOB

- 创建pipeline脚本
groovy
pipeline {
parameters {
choice choices: ['node-18', 'node-20'], description: 'npm版本', name: 'npm_version'
}
agent {
label "${npm_version}"
}
stages {
stage('拉取代码'){
steps {
script {
checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'a11aa99b-7bba-48fd-bd01-46b68732578a', url: 'http://code.srebro.cn/opforge/npm-demo.git']])
}
}
}
stage('打印版本') {
steps {
sh 'java -version'
sh 'node -v'
sh 'pnpm -v'
}
}
stage('构建前端包(Node.js)') {
steps {
script {
sh "npm install"
sh "npm run build"
sh "ls -l dist/"
}
}
}
}
}- 构建JOB
WARNING
参数化构建的项目,需要先构建一次(忽略第一次构建报错),才能在参数化构建中选择。


