主题
一、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.sh
bash
cat >> /etc/profile << 'EOF'
#nvm
. /home/application/nvm-0.40.3/nvm.sh
EOF
#使环境变量生效
source /etc/profile
bash
#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 -v
bash
npm config set registry https://registry.npmmirror.com
npm config get registry
https://registry.npmmirror.com
bash
npm install -g pnpm
pnpm config set registry https://registry.npmmirror.com
pnpm config get registry
https://registry.npmmirror.com
pnpm -v
10.12.1
1.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 jenkins
bash
docker build -t docker.cnb.cool/srebro/docker-images/jenkins-slave:node-18 .
bash
mkdir -p /home/application/jenkins/npm-cache
Docker 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 jenkins
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 jenkins
bash
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
参数化构建的项目,需要先构建一次(忽略第一次构建报错),才能在参数化构建中选择。