写在最前

使用 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

# 创建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 即可使用该环境执行

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 镜像构建

https://ghp.ci/
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

图片-vzmb.png