在管道中使用Docker

许多组织使用码头工人跨机器统一它们的构建和测试环境,并为部署应用程序提供有效的机制。从管道版本2.5及更高版本开始,管道已经内置了与Docker交互的支持必威国际有限公司Jenkinsfile

虽然这一节将介绍使用Docker的基础知识必威国际有限公司Jenkinsfile,它不会涵盖Docker的基础知识,可以在Docker入门指南

定制执行环境

管道设计方便使用码头工人图像作为单个的执行环境58必威网站 或者整个输油管。这意味着用户可以定义其Pipeline所需的工具,而无需手动配置代理。实际上任何工具都可以包装在Docker容器.可以通过对a必威国际有限公司Jenkinsfile

必威国际有限公司Jenkinsfile(声明式管道)
管道{代理{docker{图像节点:16.13.1-alpine}}阶段{阶段(测试){步骤节点——版本} } } }

当Pipeline执行时,Jenkins会自动启动指定的必威国际有限公司容器,并执行其中定义的步骤:

[Pipeline] stage [Pipeline] {(Test) [Pipeline] sh [guide -tour]正在运行shell script + node——version v14.15.0 [Pipeline]} [Pipeline] // stage [Pipeline]}

工作区同步

简而言之:如果保持工作空间与其他阶段同步很重要,那就使用reuseNode真实.否则,dockerized stage可以在任何其他代理上运行,也可以在同一代理上运行,但是在临时工作空间中。

默认情况下,对于集装箱阶段,Jenkins会:必威国际有限公司

  • 选择任何代理,

  • 创建新的空工作区,

  • 将管道代码克隆到其中,

  • 将这个新工作区装入容器中。

如果你有多个詹金斯特工,你的集装箱阶段可以必威国际有限公司在其中任何一个上启动。

reuseNode设置为真正的:不会创建新的工作空间,当前代理的当前工作空间会被挂载到容器中,容器会在同一个节点启动,因此整个数据会同步。

必威国际有限公司Jenkinsfile(声明式管道)
管道{代理任何阶段{阶段(构建){代理{docker{图像gradle: 6.7 -jdk11//在相同的工作空间中,在管道顶层指定的节点上运行容器,而不是完全在一个新节点上运行:reuseNode真正的}}步骤{shgradle——版本} } } }

为容器缓存数据

许多构建工具将下载外部依赖项并将它们缓存到本地,以便将来重用。由于容器最初是用“干净”的文件系统创建的,这可能导致管道变慢,因为它们可能无法在后续的管道运行之间利用磁盘上的缓存。

Pipeline支持添加自定义参数,这些参数被传递给Docker,允许用户指定自定义参数码头工人卷挂载,可用于缓存数据到58必威网站 管道运行之间。下面的示例将缓存~ / .m2在管道运行之间使用maven容器,从而避免了在后续运行Pipeline时重新下载依赖项的需要。

必威国际有限公司Jenkinsfile(声明式管道)
管道{代理{docker{图像maven: 3.8.1-adoptopenjdk-11arg游戏- v $ HOME / .m2: /根/ .m2}}阶段{阶段(构建){步骤mvn - b} } } }

使用多个容器

代码库依赖于多种不同的技术已经变得越来越普遍。例如,存储库可能同时具有基于java的后端API实现而且基于javascript的前端实现。结合Docker和Pipeline允许必威国际有限公司Jenkinsfile使用多个技术类型的结合代理{}指令,有不同的阶段。

必威国际有限公司Jenkinsfile(声明式管道)
管道{代理无阶段{阶段(后端){代理{docker{图像maven: 3.8.1-adoptopenjdk-11}}步骤{shmvn——版本}}阶段(前端){代理{docker{图像节点:16.13.1-alpine}}步骤{sh节点——版本} } } }

使用Dockerfile

对于需要更自定义执行环境的项目,Pipeline还支持从Dockerfile在源存储库中。相对于以前的方法使用现成的容器,使用代理{dockerfile true}语法将从Dockerfile而不是从码头工人中心

重用上面的一个示例,具有更多的定制Dockerfile

Dockerfile
FROM节点:16.13.1-alpine RUN apk add -U subversion

通过将其提交到源存储库的根目录必威国际有限公司Jenkinsfile可以更改为基于此构建容器吗Dockerfile然后使用该容器运行定义的步骤:

必威国际有限公司Jenkinsfile(声明式管道)
管道{代理{dockerfile真正的}阶段{阶段(测试){步骤节点——版本上海svn,版本} } } }

代理{dockerfile true}语法支持许多其他选项,这些选项在管道的语法部分。

使用Dockerfile与Jenkins Pip必威国际有限公司eline

指定Docker标签

默认情况下,Pipeline假定任何配置58必威网站 能够运行基于docker的管道。对于具有必威国际有限公司macOS、Windows或其他代理的Jenkins环境,这些代理无法运行Docker守护进程,这个默认设置可能会有问题。方法中的一个全局选项管理詹金斯必威国际有限公司Page,并对58必威网站 级别,用于指定哪些代理(由58必威网站 )用于运行基于docker的管道。

配置流水线Docker标签">
            </div>
           </div>
          </div>
         </div>
        </div>
        <div class=

脚本管道的高级用法

运行“双轮马车”容器

在Pipeline中使用Docker可以有效地运行构建或一组测试所依赖的服务。类似于双轮马车的模式, Docker Pipeline可以在后台运行一个容器,同时在另一个容器中执行工作。利用这种sidecar方法,管道可以为每次管道运行提供一个“干净”的容器。

考虑一个假设的集成测试套件,它依赖于本地MySQL数据库运行。使用withRun方法中实现的码头工人管道插件对脚本管道的支持必威国际有限公司Jenkinsfile可以运行MySQL作为sidecar:

节点{校验SCM为了与MySQL服务器通信,该管道显式地*映射端口(' 3306 ')到主机上的一个已知端口。* /docker.image (mysql: 5) .withRun (-e "MYSQL_ROOT_PASSWORD=my-secret-pw" -p 3306:3306) {c ->/*等待mysql服务启动*/上海虽然!Mysqladmin ping -h0.0.0.0——silent;做睡眠1;完成/*运行一些需要MySQL */的测试上海做检查}}

这个示例还可以进一步使用,同时使用两个容器。一个“sidecar”运行MySQL,另一个提供执行环境,通过使用Docker容器的链接

节点{检查SCM docker.image(mysql: 5) .withRun (- e“MYSQL_ROOT_PASSWORD = my-secret-pw”docker.image()mysql: 5) .inside (——链接$ {c.id: db){/*等待mysql服务启动*/上海虽然!Mysqladmin ping -hdb -silent;做睡眠1;完成} docker.image (centos: 7) .inside (——链接$ {c.id: db){/* *运行一些需要MySQL的测试,并假设它在主机名' db ' */上可用上海做检查}}}

上面的例子使用了暴露的对象withRun,它具有可用的运行容器IDid财产。使用容器的ID,管道可以通过传递定制的Docker参数来创建一个链接在()方法。

id属性也可以用于在管道退出前检查运行中的Docker容器中的日志:

上海码头工人日志$ {c.id

建筑的容器

为了创建一个Docker映像码头工人管道插件还提供了build ()方法创建新映像Dockerfile在Pipeline运行期间,在存储库中。

使用该语法的一个主要好处是docker.build(“my-image-name”)脚本管道可以在后续的Docker管道调用中使用返回值,例如:

节点{校验SCMdefcustomImage = docker.build (我的形象:$ {env。BUILD_ID) customImage。在{sh做测试}}

该返回值还可以用于发布Docker映像码头工人中心,或者一个自定义注册中心通过push ()方法,例如:

节点{校验SCMdefcustomImage = docker.build (我的形象:$ {env。BUILD_ID) customImage.push ()}

图像“标记”的一个常见用法是指定一个最新的标签用于Docker映像的最近的、经过验证的版本。的push ()方法接受可选的标签参数,允许Pipeline推送customImage使用不同的标签,例如:

节点{校验SCMdefcustomImage = docker.build (我的形象:$ {env。BUILD_ID) customImage.push () customImage.push (最新的)}

build ()方法构建Dockerfile默认在当前目录中。可以通过提供包含Dockerfile的第二个参数build ()方法,例如:

节点{校验SCMdeftestImage = docker.build (测试图/ dockerfiles /测试(1)testImage。内部{ sh做测试}}
1 构建测试图从Dockerfile发现在/ dockerfiles /测试/ Dockerfile

可以将其他参数传递给码头工人建造方法的第二个参数添加它们build ()方法。当以这种方式传递参数时,该字符串中的最后一个值必须是docker文件的路径,并且应该以作为构建上下文使用的文件夹结束)

这个例子覆盖了默认值Dockerfile通过- f国旗:

节点{校验SCMdefdockerfile =Dockerfile.testdefcustomImage = docker.build (我的形象:$ {env。BUILD_ID- f$ {dockerfile。/ dockerfiles(1)
1 构建我的形象:$ {env。BUILD_ID}从Dockerfile发现在/ dockerfiles / Dockerfile.test

使用远程Docker服务器

默认情况下,码头工人管道插件将与一个本地Docker守护进程通信,通常通过/var/run/docker.sock

选择一个非默认的Docker服务器,例如with码头工人群,withServer ()应采用方法。

通过传递URI和可选的凭证IDDocker服务器证书认证在Jenkins中预先配置的方法:必威国际有限公司

docker.withServer(tcp: / / swarm.example.com: 2376swarm-certs) {docker.image (mysql: 5) .withRun (- p 3306:3306){/*做事情*/}}}

在()而且build ()将不能正常工作与Docker群服务器开箱

在()为了工作,Docker服务器和Jenkins代理必须使用相同的文件系统必威国际有限公司,以便可以挂载工作区。

目前Jenkins插件和Docker CLI必威国际有限公司都不会自动检测服务器正在远程运行的情况;典型的症状是嵌套错误上海命令,如

不能创建/...@tmp/耐看目录—

当Jenk必威国际有限公司ins检测到代理本身在Docker容器中运行时,它将自动传递——的交易量参数内部容器,确保它可以与代理共享工作空间。

此外,一些版本的Docker Swarm不支持自定义注册表。

使用自定义注册中心

默认情况下,码头工人管道的默认Docker注册表码头工人中心

为了使用自定义Docker注册表,Scripted Pipeline的用户可以使用withRegistry ()方法,传入自定义注册表URL,例如:

docker.withRegistry(https://registry.example.com) {docker.image (my-custom-image).在{sh做测试}}}

对于需要身份验证的Docker注册表,从Jenkins主页添加一个“用户名/密码”凭据项,并使用凭据ID作为第二个参数必威国际有限公司withRegistry ()

docker.withRegistry(https://registry.example.comcredentials-id){defcustomImage = docker.build (我的形象:$ {env。BUILD_ID/*将容器推送到自定义注册表*/customImage.push ()}}


这个页面有用吗?

请通过此页面提交您的反馈快速形成

或者,如果您不希望填写快速表格,您可以简单地指出,您认为这一页是否有用?

是的没有


在这里.

Baidu