Jenkins Pipeline(二)-设置Docker Agent
设计流水线的目的是更方便地使用 Docker镜像作为单个 Stage或整个流水线的执行环境。
1.安装必要插件
在Jenkins服务器上已经安装了插件。
- Docker Pipeline
- Pipeline Maven Integration
- Pipeline Maven Plugin API
如果插件缺少什么,再次检查并安装即可。
2. 配置Docker连接
- 进入Jenkins管理界面,选择“Manage Jenkins” -> “Configure System”。
- 找到“Cloud”部分,点击“Add a new cloud”,选择“Docker”。
- 配置Docker主机的URL(例如:unix:///var/run/docker.sock)。
- 测试连接是否成功。可以配置多个Docker连接,例如用于开发、测试和生产环境。
如果遇到:
unix:///var/run/docker.sock,java.net.BindException: Permission denied
通常意味着当前用户没有足够的权限访问 Docker 守护进程。
原因分析:
Docker 守护进程默认绑定到 Unix 套接字 /var/run/docker.sock
而非 TCP 端口,该 Unix 套接字归 root
用户拥有,因此 Docker 守护程序默认只能以 root
用户的身份运行。
#创建docker 组
sudo groupadd docker#将用户添加到 docker 组
sudo usermod -aG docker jenkins#重启 Docker 服务
sudo systemctl restart docker#重新登录
newgrp docker#查看组下的用户
grep "^docker:" /etc/group | cut -d: -f4#查看用户
grep "^jenkins:" /etc/passwd#检查并调整 /var/run/docker.sock 的权限
sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock#检查 Docker 服务状态
sudo systemctl status docker
3.配置 Jenkins 凭证(可选)
在使用 Docker 插件之前,我们需要配置 Jenkins 凭证,以便 Jenkins 可以连接到 Docker 主机。以下是配置凭证的步骤:
- 打开 Jenkins 控制台。
- 导航到“Manage Jenkins” > “Manage Credentials”。
- 在“Stores scoped to Jenkins”下,选择“Jenkins”。
- 在“System”下,选择“Global credentials (unrestricted)”。
- 单击“Add Credentials”创建新的凭证。
- 选择“Username with password”作为凭证类型。
- 输入 Docker 主机的用户名和密码。
- 提供凭证的 ID 和描述信息,然后保存。
4.创建Docker 镜像
使用DockerFile创建一个的镜像docker_in_docker_jdk23_mvn_git
# 使用官方的ubuntu镜像作为基础镜像
FROM ubuntuUSER rootrun pwdrun apt-get -o Acquire::Check-Valid-Until=false update# 安装docker
# 这里容易出错443,所以需要多执行几次docker build
RUN apt-get install -y ca-certificates curl gnupg lsb-release
RUN curl -fsSL "https://download.docker.com/linux/ubuntu/gpg" | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
RUN apt-get -o Acquire::Check-Valid-Until=false update
RUN apt-get install -y --allow-unauthenticated docker-ce docker-ce-cli containerd.io# 安装jdk
run mkdir /usr/lib/jvm/
add openjdk-23.0.2_linux-x64_bin.tar.gz /usr/lib/jvm/
WORKDIR /usr/lib/jvm/
run mv jdk-23.0.2 openjdk-23-jdk
env JAVA_HOME=/usr/lib/jvm/openjdk-23-jdk
env PATH=$JAVA_HOME/bin:$PATH# 安装Maven
run mkdir /etc/maven
add apache-maven-3.9.10.tar.gz /etc/maven
env MAVEN_HOME=/etc/maven/apache-maven-3.9.10
env PATH=$MAVEN_HOME/bin:$PATH# 安装git
run apt-get install -y git# 安装vim编辑器
run apt-get install vim -y --allow-unauthenticated
run echo 'set nu' > ~/.vimrc# 拷贝时区文件,如果没有就先注释,设置时区
add zoneinfo.tar /usr/share/
run ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
run echo 'Asia/Shanghai' >/etc/timezone# 安装网络工具
run apt-get install -y net-tools inetutils-ping curl
# run apt-get install -y wget # 设置语言
env LANG=C.UTF-8run mkdir -p /app/application
workdir /app/applicationRUN groupadd -r jenkins && \useradd -r -g jenkins -m jenkins && \chown -R jenkins:jenkins /app && \chmod -R 755 /app# 暴露Docker的socket给外部容器使用
VOLUME /var/run/docker.sockENTRYPOINT ["tail","-f","/dev/null"]# docker run -d --name docker_in_docker_jdk_mvn_git -v /var/run/docker.sock:/var/run/docker.sock docker_in_docker_jdk_mvn_git
5.创建Pipeline和SCM脚本
pipeline {agent {docker {image 'docker_in_docker_jdk23_mvn_git:latest'args "-v /var/run/docker.sock:/var/run/docker.sock --entrypoint='' -u root:root"}}stages {stage('init') {steps {echo "check info"sh 'java -version'sh 'mvn -v'sh 'git --version'sh 'docker info'sh 'whoami'sh 'pwd'}}stage('git clone') {steps {echo "git clone"dir("appcode"){sh 'pwd'sh 'ls -l' git(url: 'https://gitee.com/xinlicn/springcloud-maven.git',branch: 'master',credentialsId: 'mygittree')script{env.CODE_PATH = "appcode/producter-service/producter"}}}}stage('maven build') {steps {echo "maven building"script{dir("${CODE_PATH}"){sh 'ls -l'sh " mvn -f pom.xml clean package"def pomfile = "${env.project_name}/pom.xml"def pom = readMavenPom file: "${pomfile}"env.POM_PROJECT_NAME = "${pom.artifactId}"env.POM_PROJECT_VERSION = "${pom.version}"echo "output:${POM_PROJECT_NAME}:${POM_PROJECT_VERSION}"}}}}stage('docker build') {steps {echo "docker build"script{dir("${CODE_PATH}"){def docker_name ="${POM_PROJECT_NAME}:${POM_PROJECT_VERSION}"sh "docker build -f dockerfile ./${env.project_name}/target --build-arg appname=${POM_PROJECT_NAME}.jar -t ${docker_name}"}}}}}
}
6.运行Pipeline
通过pipeline的log可以看出,所有的构建过程都是在docker容器中进行的。
参考:
在流水线中使用Docker