Skip to content

一、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, 将自动配置代理的namesecret,不需要对容器进行任何特殊配置。
  • 镜像中封装了常见的工具,可自行选择
  • 为了提高构建速度,可将/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

参数化构建的项目,需要先构建一次(忽略第一次构建报错),才能在参数化构建中选择。

最近更新

采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 运维小弟