写在最前
使用 docker 容器化启动 jenkins-slave,构建 nodejs18 新版本
1. 节点管理
点击系统管理 > 管理节点 > 就可以看到 新建节点 按钮。
节点名称:build-nodejs
固定节点
参数很多不过都是固定的写法,可以参考我以下的内容来进行添
名称:build-nodejs
远程工作目录:/home/jenkins/agent
标签:build-nodejs
用法:只允许运行绑定到这台机器的Job
启动方式:通过Java Web启动代理
重新回到节点列表,点击刚才新建的节点,然后可以看到一串连接秘钥和工作目录
2. 构建镜像
以docker方式构建nodejs18的jnlp-slave
FROM jenkins/jnlp-slave:4.6-1-jdk11
# 安装必要的工具
USER root
RUN apt-get update && apt-get install -y curl tar --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
# 下载并安装 Node.js 18
ENV NODE_VERSION=18.16.0
RUN curl -fsSL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz -o node.tar.xz \
&& tar -xJf node.tar.xz -C /usr/local --strip-components=1 \
&& rm node.tar.xz
# 验证 Node.js 和 npm 是否安装成功
RUN node -v && npm -v
# 创建docker组并指定GID为999
RUN groupadd -g 999 docker && \
usermod -aG docker jenkins
# 切换回 Jenkins 用户
USER jenkins
构建命令:docker build -t jnlp-slave-nodejs18 .
2024年8月26日 构建通过
3. 启动连接
以下方式比较讨巧,把宿主机的docker命令给挂载到容器里面,这样容器内可以直接使用docker命令而无需二次安装。启动完成可以看到成功连接到jenkins
docker run --name build-nodejs -d \
--init \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /etc/sysconfig/docker:/etc/sysconfig/docker \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/bin/docker-current:/usr/bin/docker-current \
jnlp-slave-nodejs18:latest \
-url http://172.31.0.222:8080 \
你的秘钥 \
build-nodejs
4. 任务测试
在运行Job任务的时候选择 标签表达式 选择最开始创建命名的 build-nodejs 即可使用该环境执行
# 打印npm和nodejs版本
npm --version
node -v
npm config set registry https://registry.npm.taobao.org
echo `npm config get registry`
npm install
echo "install finished"
npm run build
echo "build finished"
5. 高级操作
5.1 描述
如果我们有n个前端项目呢,有使用nodejs12的老项目也有14的过渡项目还有nodejs18的前沿项目。我们总不能每个都构建一个吧?实际上我们可以使用nvm脚本来完成一键切换,这样在使用之前切换一下构建版本即可达到一个镜像内置n个nodejs
5.2 镜像构建
FROM jenkins/inbound-agent:3107.v665000b_51092-15-jdk17
# 使用 root 用户下载软件,创建目录与权限
USER root
LABEL maintainer="1330884822@qq.com"
LABEL name="tanqidi"
LABEL version="latest"
# 创建 Jenkins 的工作目录
RUN mkdir -p /home/jenkins/agent/workspace && chmod 777 /home/jenkins/agent/workspace/
# 设置 SHELL 为 bash,并启用 pipefail 选项
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# 在安装 apt 包时禁止对话框
ENV DEBIAN_FRONTEND=noninteractive
# 选择一个更快的 Ubuntu apt 镜像站点
ENV UBUNTU_APT_SITE=ubuntu.cs.utah.edu
# 替换默认的 apt 软件包源为镜像站点
RUN sed -E -i "s/([a-z]+.)?archive.ubuntu.com/$UBUNTU_APT_SITE/g" /etc/apt/sources.list
RUN sed -i "s/security.ubuntu.com/$UBUNTU_APT_SITE/g" /etc/apt/sources.list
# 安装必要的 apt 软件包
RUN apt update && \
apt upgrade -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" && \
apt install -y \
curl \
git \
wget \
ca-certificates \
build-essential && \
apt-get clean
# 创建 docker 组并指定 GID 为 999,并将 jenkins 用户加入 docker 组
RUN groupadd -g 999 docker && \
usermod -aG docker jenkins
# 切换回 jenkins 用户,并在其目录下安装 nvm 和 nodejs
USER jenkins
# 创建 nvm 目录并下载 nvm
RUN mkdir /home/jenkins/.nvm && \
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
# nvm 配置
RUN echo 'export NVM_DIR="$HOME/.nvm"' >> "$HOME/.bashrc"
RUN echo '[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm' >> "$HOME/.bashrc"
RUN echo '[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion" # This loads nvm bash_completion' >> "$HOME/.bashrc"
# 使用 nvm 安装 Node.js 版本以及全局工具
RUN bash -c 'source $HOME/.nvm/nvm.sh && \
nvm install node && \
nvm install 4 && \
nvm install 6 && \
nvm install 8 && \
nvm install 10 && \
nvm install 12 && \
nvm install 14 && \
nvm install 16 && \
nvm install 18 && \
nvm install 19 && \
nvm install 20 && \
nvm install 21 && \
nvm install 22 && \
nvm alias default 14 && \
nvm ls'
# 默认入口点
# ENTRYPOINT ["/bin/bash"]
5.3 使用方式
运行方式和上述nodejs18是一样的,只是在运行之前需要执行一下初始化nvm脚本,这是一个待完善的步骤
# 执行初始化脚本
set +x
. ~/.nvm/nvm.sh
. ~/.profile
. ~/.bashrc
# nvm 命令可以列表已经安装好的的版本
nvm list
nvm use 18
# 正常的构建步骤
npm --version
node -v
npm config set registry https://registry.npm.taobao.org
echo `npm config get registry`
npm install
echo "install finished"
npm run build
echo "build finished"
6. 镜像制品
上述构建的镜像已经放在官方和阿里云镜像仓库中,欢迎下载测试
# 适用于jenkins旧版本
registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nodejs18
registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nvm
# 适用于jenkins新版本
registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nvm:inbound-agent-3107.v665000b_51092-15-jdk17
7. 异常解决
7.1 SEVERE: Agent version 3107.v665000b_51092 or newer is required
https://github.com/jenkinsci/jenkins/pull/9440
从讨论中得知,新版本jenkins中如果 jenkins/jnlp-slave 低于4.13会拒绝连接的,请尝试更换更新的版本吧
jenkins/inbound-agent:3107.v665000b_51092-15-jdk17
FROM jenkins/inbound-agent:3107.v665000b_51092-15-jdk17
# 安装必要的工具
USER root
RUN apt-get update && apt-get install -y curl tar --no-install-recommends \
&& rm -rf /var/lib/apt/lists/*
# 下载并安装 Node.js 18
ENV NODE_VERSION=18.16.0
RUN curl -fsSL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz -o node.tar.xz \
&& tar -xJf node.tar.xz -C /usr/local --strip-components=1 \
&& rm node.tar.xz
# 验证 Node.js 和 npm 是否安装成功
RUN node -v && npm -v
# 创建docker组并指定GID为999
RUN groupadd -g 999 docker && \
usermod -aG docker jenkins
# 切换回 Jenkins 用户
USER jenkins