使用 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
# 切换回 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 镜像构建
构建如下版本足以满足任意前端项目
v4.9.1
v6.17.1
v8.17.0
v10.24.1
v12.22.12
v14.21.3
v16.20.2
v18.20.4
v19.9.0
v20.16.0
v21.7.3
v22.5.1
FROM jenkins/jnlp-slave
# 使用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/
# Set the SHELL to bash with pipefail option
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Prevent dialog during apt install
ENV DEBIAN_FRONTEND noninteractive
# ShellCheck version
ENV SHELLCHECK_VERSION=0.7.0
# Pick a Ubuntu apt mirror site for better speed
# ref: https://launchpad.net/ubuntu/+archivemirrors
ENV UBUNTU_APT_SITE ubuntu.cs.utah.edu
# Replace origin apt package site with the mirror site
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
# Install apt packages
RUN apt update && \
apt upgrade -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" && \
apt install -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" \
coreutils \
util-linux \
bsdutils \
file \
openssl \
libssl-dev \
locales \
ca-certificates \
ssh \
wget \
patch \
sudo \
htop \
dstat \
vim \
tmux \
curl \
git \
jq \
zsh \
ksh \
gcc \
g++ \
xz-utils \
build-essential \
bash-completion && \
apt-get clean
RUN wget https://github.com/koalaman/shellcheck/releases/download/v$SHELLCHECK_VERSION/shellcheck-v$SHELLCHECK_VERSION.linux.x86_64.tar.xz -O- | \
tar xJvf - shellcheck-v$SHELLCHECK_VERSION/shellcheck && \
mv shellcheck-v$SHELLCHECK_VERSION/shellcheck /bin && \
rmdir shellcheck-v$SHELLCHECK_VERSION
RUN shellcheck -V
# Set locale
RUN locale-gen en_US.UTF-8
# Print tool versions
RUN bash --version | head -n 1
RUN zsh --version
RUN ksh --version || true
RUN dpkg -s dash | grep ^Version | awk '{print $2}'
RUN git --version
RUN curl --version
RUN wget --version
# Add user "nvm" as non-root user
RUN useradd -ms /bin/bash nvm
# Copy and set permission for nvm directory
COPY . /home/nvm/.nvm/
RUN chown nvm:nvm -R "/home/nvm/.nvm"
# Set sudoer for "nvm"
RUN echo 'nvm ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
# Switch to user "nvm" from now
USER nvm
# 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"
# nodejs and tools
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 \
npm install -g npm \
npm install -g doctoc urchin eclint dockerfile_lint && \
npm install --prefix "$HOME/.nvm/"'
# Set WORKDIR to nvm directory
WORKDIR /home/nvm/.nvm
# 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. 镜像制品
上述构建的镜像已经放在官方和阿里云镜像仓库中,欢迎下载测试
docker.io/tanqidi/jnlp-slave-nodejs18
registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nodejs18
tanqidi/jnlp-slave-nvm
registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nvm