当前位置: 首页 > 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.xdnf.cn/news/1386559.html

相关文章:

  • Python中的匿名函数详解(lambda)
  • 无人机固件升级与技术要点解析
  • 命令行操作:逻辑运算符、重定向与管道
  • Cesium 入门教程(十二):时间动画实例
  • AI共链·智存未来 | 绿算技术受邀出席华为AI SSD发布会
  • 预测模型及超参数:3.集成学习:[1]LightGBM
  • TDengine 3.3.7.0 新增性能基准工具 taosgen
  • Django开发规范:构建可维护的AWS资源管理应用
  • LRU 内存淘汰策略
  • 扩展中国剩余定理脚本(恢复密文c)
  • 匠心传承,古韵新生——记木雕名家龙巍的艺术人生
  • Android 打包适配15 版本(api 35)问题处理
  • 【观成科技】蔓灵花User下载者加密通信分析
  • 微硕WINSOK高性能NP沟道MOS管WSP4067在Type-C双向快充电源管理系统中的应用
  • 美摄科技受邀参加2025中关村论坛年会,以超高清车载影像技术赋能智慧出行新体验!
  • 4x12G-SDI(四链接12G-SDI)
  • Lambda 表达式在 PyQt/PySide 中的应用
  • 突破传统企业组网瓶颈:某科技公司智能组网服务项目深度解析
  • Docker部署单节点使用KRaft存储数据的Kafka与可视化界面Kafka-Map
  • 解决多种类潮湿敏感元器件的多温度、多时长的排潮烘干
  • 网络编程 04:TCP连接,客户端与服务器的区别,实现 TCP 聊天及文件上传,Tomcat 的简单使用
  • CVPR 强化学习模块深度分析:连多项式不等式+自驾规划
  • 判断语句中std::cin隐式转换为bool--重载operator bool()
  • 外卖大战之后,再看美团的护城河
  • autojs RSA加密(使用public.pem、private.pem)
  • IAR工程如何生成compile_commands.json文件(能生成但是clangd不能生成“.cache文件”)
  • 水质溶解氧检测仪:用于测量水体中溶解氧浓度的专业设备
  • Partner 类开发:会议参与者可视化控件
  • Excel Word Pdf 格式转换
  • 深入解析Qt节点编辑器框架:高级特性与性能优化(四)