写在最前

jenkins做的最多的就是用来编译前后端项目,这一篇章我们就来完成后端的maven构建器,不过在开始之前我建议先从前置要求2做起,里面有非常详细的连接步骤,不然本篇章构建完了可能你还不知道怎么去连接它。

1. 前置要求

  1. Jenkins:从配置到部署全面指南

  2. Jenkins:jenkins-slave-nodejs & nvm

2. 构建流程

2.1 构建镜像

在此我希望你能动手构建一下,但如果没有合适的环境那就使用我构建好的吧。

tanqidi/jnlp-slave-maven3.6:latest

registry.cn-hangzhou.aliyuncs.com/tanqidi/jnlp-slave-maven3.6:latest

FROM jenkins/inbound-agent:3107.v665000b_51092-15-jdk17

# 切换到 root 用户
USER root

# 安装 Maven
ENV MAVEN_VERSION=3.6.0
ENV MAVEN_MAJOR_VERSION=3
ENV MAVEN_HOME=/opt/maven-$MAVEN_VERSION
ENV PATH="$MAVEN_HOME/bin:$PATH"

RUN apt-get update && \
    apt-get install -y wget && \
    wget https://archive.apache.org/dist/maven/maven-${MAVEN_MAJOR_VERSION}/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz && \
    mkdir -p /opt/maven-$MAVEN_VERSION && \
    tar -xzf apache-maven-$MAVEN_VERSION-bin.tar.gz -C /opt/maven-$MAVEN_VERSION --strip-components=1 && \
    rm apache-maven-$MAVEN_VERSION-bin.tar.gz

# 查看解压后的 Maven 目录内容
RUN ls -la $MAVEN_HOME/bin

# 创建docker组并指定GID为999
RUN groupadd -g 999 docker && \
    usermod -aG docker jenkins

# 切换回 jenkins 用户
USER jenkins

# 设置工作目录
WORKDIR /home/jenkins

# 测试 Maven 是否有效
RUN mvn -v

2.2 启动连接

注意!我的 dnsmasq 解析的是 jenkins.dev.tanqidi.com 你不能直接粘贴就拿来用,需要改成你的jenkins的ip或者域名。

# 创建数据目录
mkdir -p /data/maven/repository && chown -R 1000 /data/maven/repository

# 运行容器
docker run --name build-maven3.6 -d \
  --init \
  --restart=always \
  -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 \
  -v /data/maven/repository:/home/jenkins/.m2/repository \
  tanqidi/jnlp-slave-maven3.6:latest \
  -url http://jenkins.dev.tanqidi.com \
  你的秘钥 \
  build-maven3.6

3. 异常解决

slave操作docker时出现权限不足异常

3.1 permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

临时

这是因为挂载进去的 /var/run/docker.sock 的权限,和容器内的执行者权限不一样所以出现了无法调用docker.sock的问题,最快速的就是在宿主机上对docker.sock做权限变更,但这只是临时的,下次重启docker这个sock文件会被重建权限就又丢失了。

chmod 666 /var/run/docker.sock

永久

本质上,就是要确保确保Docker运行的组和Jenkins slave运行的组一致。具体步骤如下:

  1. 我在docker-install.sh中优化了一下,先创建一个GID为999docker组,这样在生成docker.service文件时,docker.sock会自动拥有该组的权限。

  2. 在Jenkins slave的Dockerfile中,同样创建一个名为docker、GID为999的组。

  3. 将Jenkins用户(即容器中的运行用户)添加到这个docker组中。

通过这种方式,Jenkins slave在调用docker.sock时,其GID为999,与宿主机一致,从而获得必要的权限。这样可以确保容器与主机之间的Docker访问权限协调一致。

# 创建docker组并指定GID为999
RUN groupadd -g 999 docker && \
    usermod -aG docker jenkins

4. 操作总结

有了前面篇章的jenkins-slave-nodejs的操作经验本篇章就简单很多了,构建镜像创建节点直接连接就好了,但如果依然操作失败欢迎给我留言。