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.pswp.cn/pingmian/94731.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络|(十六)概率论基础知识-伽马函数·中

【1】引言 前序学习进程中,已经初步了解了伽马函数,认识到nnn的阶乘计算可以转化为: n!n!⋅limk→∞kn⋅k!(nk)!limk→∞kn⋅k!⋅n!(nk)!limk→∞kn⋅k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

设计模式Books Reading

文章目录 设计模式 创建型设计模式 工厂方法 示例说明 工厂方法模式结构 案例伪代码 工厂方法模式适合应用 实现方式 工厂方法模式优缺点 与其他模式的关系 概念示例 抽象工厂 抽象工厂模式结构 抽象工厂模式适合应用场景 实现方式 抽象工厂模式优缺点 与其他模式的关系 代码示…

接吻数问题:从球体堆叠到高维空间的数学奥秘

本文由「大千AI助手」原创发布,专注用真话讲AI,回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我,一起撕掉过度包装,学习真实的AI技术! 1 接吻数问题概述 接吻数问题(Kissing Number Problem&am…

深度学习③【卷积神经网络(CNN)详解:从卷积核到特征提取的视觉革命(概念篇)】

文章目录先言1. 卷积核:特征检测的魔法窗口1.1什么是卷积核:可学习的特征检测器1.2可视化理解:边缘检测、纹理提取、特征发现1.3代码实现:使用PyTorch定义和初始化卷积层2. 卷积运算的数学原理2.1.离散卷积计算:滑动窗…

当不想安装telnet或nc时,可使用 Linux 系统默认自带的bash原生网络功能或ping(辅助判断)测试连通性

1. 用bash原生/dev/tcp测试端口(无需任何工具)bashshell 内置了/dev/tcp虚拟设备,可直接通过脚本测试端口是否能连接,执行以下命令(替换数据库 IP 和端口):# 格式:echo > /dev/tc…

【STM32外设】ADC

声明:上图是STM32产品型号各字段含义,本文基于STM32F103 1、ADC的一些概念 常规通道(常规组)和注入通道(注入组)(regular channels and injected channels)ADC支持的外部通道总共16个(且被3个ADC共享,ADC12…

Aha Moment——啊哈时刻!

1. 理解面试官的意图面试官问你“Aha moment”,其实是想知道:你是否真正理解这个概念:不只是背定义,而是理解其为什么重要。你如何发现它:考察你的数据分析方法论和技术能力(用了哪些数据、指标、模型&…

RAG教程5:多表示索引和ColBERT

文章目录 导入依赖包 多表示索引 ColBERT 导入依赖包 %pip install youtube-transcript-api pytube多表示索引 from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseL

来自火山引擎的 MCP 安全授权新范式

资料来源:火山引擎-开发者社区 本文旨在深入剖析火山引擎 Model Context Protocol (MCP) 开放生态下的 OAuth 授权安全挑战,并系统阐述火山引擎为此构建的多层次、纵深防御安全方案。面对由 OAuth 2.0 动态客户端注册带来的灵活性与潜在风险,…

瑞芯微RK3506开发板PWM输入捕获驱动调试记录

本文演示PWM输入信号采集,基于触觉智能RK3506开发板。配置为: 3核Cortex-A7Cortex-M0多核异构处理器 主要接口:2路CAN FD,5路串口,RGB、MIPI、音频、USB2.0 OTG等、板载双百兆网口4G星闪SLEWiFi6BLE5.2。 PWM信号简…

PHP的header()函数分析

PHP的header()函数是HTTP协议交互的核心工具,它通过直接操纵响应头实现服务器与客户端之间的元数据通信。作为PHP原生函数,其设计初衷是处理HTTP协议层的关键操作,包括状态码设置、内容类型声明和缓存控制等基础功能。在Web开发中&#xff0c…

根据并发和响应延迟,实现语音识别接口自动切换需求

根据并发和响应延迟,语音识别接口自动 切换需求 需求描述: 当请求的语音识别的请求数量大于3或者请求语音识别接口3秒不可达无响应,切换备用语音识别接口 科大讯飞语音识别作为备用接口 科大讯飞的API文档: 进入讯飞开放平台的网页&#…

程序员之电工基础-CV程序解决目标检测

一、背景 兴趣爱好来了,决定研发一个产品。涉及到电工和机械等知识,所以记录一下相关的基础知识。今天的内容又回到了我的主营板块!!哈哈!!为后续整体集成做准备,先测试目标检测部分的能力。 二…

B树的概述以及插入逻辑

一,B树的概述1.B树(B-树)又称多路平衡查找树,B树所有节点中孩子数量的最大值n称为B树的阶,通常用m表示比如当m为2就是常见的二叉树一颗m阶的B树定义如下:1)每个结点最多有m-1个关键字;2)根节点最少可以只有1个关键字;3…

如何用 Kotlin 在 Android 手机开发一个小闹钟、计时器、秒表

以下是在 Android 上用 Kotlin 开发小闹钟、计时器和秒表的方法,分为核心功能实现和界面设计两部分: 闹钟功能实现 AlarmManager 和 BroadcastReceiver // 设置闹钟 val alarmManager getSystemService(Context.ALARM_SERVICE) as AlarmManager val i…

LeetCode Hot 100 第8天

1. 73 矩阵置零(记录标识) 链接:题目链接 题解: 题解 时间复杂度O(n*m): 方案1(空间复杂度O(n m)):matrix[i][j] 0,意味着 第i行、第j列所有元素都要置为0;维护能置为0行、列的集…

Python OpenCV图像处理与深度学习:Python OpenCV开发环境搭建与入门

Python OpenCV入门:环境设置 学习目标 通过本课程,学员们将学习在Windows、macOS和Linux操作系统上安装Python和OpenCV,配置开发环境,以及如何使用Jupyter Notebook和PyCharm等集成开发环境(IDE)进行基本操…

【论文阅读】SegCLIP:用于高分辨率遥感图像语义分割的多模态视觉语言和快速学习

【论文阅读】SegCLIP:用于高分辨率遥感图像语义分割的多模态视觉语言和快速学习 文章目录【论文阅读】SegCLIP:用于高分辨率遥感图像语义分割的多模态视觉语言和快速学习一、介绍二、联系工作三、方法四、实验结果**数据集**SegCLIP: Multimodal Visual-…

Anaconda、OpenCV安装配置方法

目录 1.Anaconda安装 1.1 国内镜像软件下载 1.2 点击exe,一路下一步安装 1.3 检查安装情况 1.3.1 安装前后系统环境变量变化对比 1.3.2 查看安装路径和版本 1.4 Anaconda自带的python版本查看命令如下: 1.5 修改镜像地址,加快下载包的…

C++函数继承

C函数继承引言C三大特征分别为封装,继承和多态,它们构成了面向对象编程的基石,它们协同工作以提升代码的模块化,可复用性和灵活性封装:提高代码的维护性(当程序出现问题时可以准确定位)继承&…