写在最前
jenkins做的最多的就是用来编译前后端项目,这一篇章我们就来完成后端的maven构建器,不过在开始之前我建议先从前置要求2做起,里面有非常详细的连接步骤,不然本篇章构建完了可能你还不知道怎么去连接它。
1. 前置要求
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运行的组一致。具体步骤如下:
我在
docker-install.sh
中优化了一下,先创建一个GID为999
的docker
组,这样在生成docker.service
文件时,docker.sock
会自动拥有该组的权限。在Jenkins slave的Dockerfile中,同样创建一个名为
docker
、GID为999
的组。将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的操作经验本篇章就简单很多了,构建镜像创建节点直接连接就好了,但如果依然操作失败欢迎给我留言。