使用 docker 容器化启动 jenkins-slave,构建 nodejs18 新版本

1. 节点管理

点击系统管理 > 管理节点 > 就可以看到 新建节点 按钮。

  1. 节点名称:build-nodejs

  2. 固定节点

参数很多不过都是固定的写法,可以参考我以下的内容来进行添

  1. 名称:build-nodejs

  2. 远程工作目录:/home/jenkins/agent

  3. 标签:build-nodejs

  4. 用法:只允许运行绑定到这台机器的Job

  5. 启动方式:通过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 即可使用该环境执行

63f6a0e5-6d35-4240-83f5-84bf6bb19403.png

# 打印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. 镜像制品

上述构建的镜像已经放在官方和阿里云镜像仓库中,欢迎下载测试

  1. docker.io/tanqidi/jnlp-slave-nodejs18

  2. registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nodejs18

  3. tanqidi/jnlp-slave-nvm

  4. registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-nvm