Jenkins Pipeline(二)-设置Docker Agent

发布于:2025-09-01 ⋅ 阅读:(16) ⋅ 点赞:(0)

设计流水线的目的是更方便地使用 Docker镜像作为单个 Stage或整个流水线的执行环境。

1.安装必要插件 

在Jenkins服务器上已经安装了插件。

  1. Docker Pipeline
  2. Pipeline Maven Integration
  3. 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 主机。以下是配置凭证的步骤:

  1. 打开 Jenkins 控制台。
  2. 导航到“Manage Jenkins” > “Manage Credentials”。
  3. 在“Stores scoped to Jenkins”下,选择“Jenkins”。
  4. 在“System”下,选择“Global credentials (unrestricted)”。
  5. 单击“Add Credentials”创建新的凭证。
  6. 选择“Username with password”作为凭证类型。
  7. 输入 Docker 主机的用户名和密码。
  8. 提供凭证的 ID 和描述信息,然后保存。

4.创建Docker 镜像

使用DockerFile创建一个的镜像docker_in_docker_jdk23_mvn_git

# 使用官方的ubuntu镜像作为基础镜像
FROM ubuntu

USER root

run pwd

run 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-8

run mkdir -p /app/application
workdir /app/application

RUN groupadd -r jenkins && \
    useradd -r -g jenkins -m jenkins && \
    chown -R jenkins:jenkins /app && \
    chmod -R 755 /app

# 暴露Docker的socket给外部容器使用
VOLUME /var/run/docker.sock

ENTRYPOINT ["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


网站公告

今日签到

点亮在社区的每一天
去签到