当前位置: 首页 > news >正文

Jenkins Pipeline(二)-设置Docker Agent

设计流水线的目的是更方便地使用 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 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

http://www.dtcms.com/a/357190.html

相关文章:

  • 渲染速度由什么决定?四大关键因素深度解析
  • 【拍摄学习记录】07-影调、直方图量化、向右向左
  • Docker部署openai-edge-tts和即梦API以及应用案例
  • 透视文件IO:从C库函数的‘表象’到系统调用的‘本质’
  • 12、做中学 | 初一上期 Golang函数 包 异常
  • electron-vite 配合python
  • AI驱动万物智联:IOTE 2025深圳展呈现无线通信×智能传感×AI主控技术融合
  • 软件系统的部署方式:单机、主备(冷主备、热主备)、集群
  • LeetCode100-54螺旋矩阵
  • Verilog 硬件描述语言自学——重温数电之组合逻辑电路
  • 高性能 JSON:System.Text.Json Source Generator vs 手写 Span(Utf8JsonReader/Writer)
  • 并发编程——06 JUC并发同步工具类的应用实战
  • 如何高效批量完成修改文件名的工作?
  • NullPointerException 空指针异常,为什么老是遇到?
  • 嵌入式Ubuntu22.04安装过程详解实现
  • Oracle SQL性能调优之魂:深入理解索引原理与优化实践
  • 智能接听,破局高峰占线:云蝠AI客服重塑企业服务新范式
  • 【Spring底层分析】Spring AOP补充以及@Transactional注解的底层原理分析
  • 球型摄像机实现360°无死角
  • 【前端教程】从基础到专业:诗哩诗哩网HTML视频页面重构解析
  • 技术干货|Prometheus告警及告警规则
  • APM32芯得 EP.31 | APM32F402 HC-SR04超声测距经典操作:波形输出与滤波
  • 微算法科技(NASDAQ:MLGO)一种基于FPGA的Grover搜索优化算法技术引领量子计算
  • PCIe 6.0配置与地址空间架构:深入解析设备初始化的核心机制
  • C#实现OPC客户端
  • 《Password Guessing Using Random Forest》论文解读
  • system论文阅读--HPCA25
  • Excel Word Pdf 格式转换
  • ubuntu 安装 vllm
  • 电平移位器的原理