目录
文章有些长,可以先直接到最后一步
四、Jenkins + Docker集成方式对比总结
看对比总结
对于Jenkins,有3种方式可以把Docker集成到Pipeline中(括号的方式是我自己起的,只是一个称号,不那么标准不要介意)
- 直接在脚本中通过Shell调用 (Docker Shell)
- 把Docker配置成一个云,作为一个单独的Jenkins代理节点使用 (Docker as Agent)
- Docker运行Jenkins实例容器,在该容器中装Docker,映射Docker命令 (Docker out of Docker, DooD)
一、直接在脚本中通过shell调用 (Docker Shell)
前提是你的运行节点上安装了Docker,且加入了PATH变量中,这里是Pipeline脚本,比如我的master节点中装了Docker(正确的做法是master节点不运行任何项目,这里只用于示意)
node('master'){
stage('test'){
if(isUnix()){
shell "docker run --name python python:3.10-rc-slim /bin/sh -c 'ls'"
} else {
bat "docker run --name python python:3.10-rc-slim /bin/sh -c 'ls'"
}
}
}
输出效果
这种方式最简单,也很好掌握,只不过我们需要在一句话命令中需要想好所有要执行的操作,并且注意不要忘记手动检查和销毁容器。后面的两种集成方式就有些难度了,下面好戏开场
二、把Docker配置成一个云,作为一个单独的Jenkins代理节点使用 (Docker as Agent)
手画的示意图如下
这种方式集成Docker的优缺点
- 优点:
-
Jenkns master可以部署在任意平台(Windows, Mac ,Docker…)
-
Docker服务不受具体代理节点的限制 。Docker服务可以在Jenkins能够访问的任意一台机器上,而不是一定非要在依托于代理节点, 举个例子,我的电脑(Winodws)有Docker Desktop,同时Jenkins能够访问到该Docker, 那么就可以通过这个Docker服务创建Docker容器当作Jenkins的代理节点,而事实上我的电脑(Windows系统)并没有作为Jenkins的代理节点
-
支持所有类型的项目。 无论是Freestyle风格,还是Pipline风格,都可以直接用Docker代理节点
-
- 缺点:
- 配置过程比较繁琐
- Docker代理节点镜像受限制,必须基于官方提供Jenkins代理节点镜像
这里有两种方式将Docker容器视为代理节点
- 将Docker容器当作持久代理节点
- 将Docker容器挡住临时代理节点
开始介绍每种方式的配置方式
1. 配置持久的Docker代理节点
1.1. Jenkins和Docker配置
首先我们看一下示意图, 一个Jenkins的Docker子节点需要对应一个运行中的Docker容器
- Docker Desktop设置
- Docker镜像选择
- Docker节点配置
- Docker容器启动方式
1.1.1. Docker Desktop设置
Docker Desktop 启用 tcp://localhost:2375
端口,这样允许Docker与Jenkins进行交互
测试 2375端口是否可用, 转到Powershell, 测试2375端口
Test-NetConnection -ComputerName localhost -Port 2375
若成功则如下图所示
否则失败说明2375端口被占用,解决方法可以参考这个issue https://github.com/docker/for-win/issues/3633
1.1.2. 配置Docker代理节点
上一步中我们已经通过Jenkins可以访问具体的Docker服务,这时可以新建Docker代理节点, 如图所示以下参数非常重要
- 节点名称 - docker容器启动时需要用到这个参数 , 例如为 node_docker_1
- 节点根目录 - Pipeline脚本中会用到,默认的Jenkins的Job的工作目录, 这里必须填写 /home/jenkins/agent/,因为Jenkins官方的子节点镜像中默认该位置为工作目录(目录已创建),如果是其他目录则有可能为空,导致Jenkins运行Job时失败
- 节点标签 - Pipline脚本中会用到,指定某个节点运行,例如为 label_node_docker_1
- 连接方式 - 必须选用"Launch agent by connecting it to the master",因为Jenkins官方的子节点镜像默认这种连接方式
在未连接的情况下我们可以看到Jenkins有提示我们该如何连接至这个节点,事实上因为Jenkins官方提供的Jenkins子节点镜像中已经做了此项工作,我们只需记住这一步中的secret即可
- secret - 一串加密字符串
1.1.3. Docker镜像选择
Jenkins官方已经提供了 docker代理节点的镜像, jenkins/inbound-agent, 使用以下命令下载该镜像
docker pull jenkins/inbound-agent
如果你想使用自己的镜像,则必须在在此基础镜像构建,下载相关依赖, 例如下面的Dockerfile
FORM jenkins/inbound-agent
#
RUN xxx....
1.1.4. Docker容器启动方式
这里以官方的镜像jenkins/inbound-agent为例, 启动容器的方式如下(当然你也可以参考官方文档 https://hub.docker.com/r/jenkins/inbound-agent/)
docker run --name jenkins_agent_container --init jenkins/inbound-agent -url <http://jenkins-server:port> <secret> <agent name>
这里有三个参数需要更改, 也就是第2步中的参数
- <http://jenkins-server:port> - Jenkins地址例如 http://xxxx:8080/
- <secret> - 一串加密字符串,在2步中已经获取到了
- <agent name> - 代理的子节点名称, 在2步中已经配置
例如这里我们将这个容器实例命名为jenkins_agnet_container , 启动后查看相关信息 , 可以看到已经连接至我们的jenkins的docker节点, 此时Jenkins的docker节点也显示正常