我在两年前和四年前 写过如何使用Jenkins构建Unity项目的教程。现在看来这两个教程都有些不足的地方,所以我又又又来更新这个教程了。
在上次的教程中,我们将主机中的Docker映射到Jenkins中使用。映射方式是不正确的,理由有二
1. 无法完全隔离Jenkins和其使用的Docker镜像。映射进Jenkins镜像内的Docker是主机的Docker,这也就意味着可以任意操作Jenkins的镜像,可能带来安全问题。
2. 需要转换主机上的路径和Jenkins上的路径。Jenkins运行时提供的路径是Jenkins镜像内部的路径,而Docker运行映射的是主机的路径,这需要额外的转换,比较麻烦。
故我们希望能够额外开辟一个Docker实例,将主机与Jenkins隔离。这项技术就是Docker in Docker,简称dind。以下是简化后的compose配置文件:
version: '2.0'
services:
jenkins:
image: jenkins/jenkins:lts
volumes:
- ./jenkins_home:/var/jenkins_home
- ./certs:/certs/client # 共享Docker证书
environment:
- DOCKER_HOST=tcp://docker:2376
- DOCKER_CERT_PATH=/certs/client
- DOCKER_TLS_VERIFY=1
docker:
image: docker:dind
privileged: true # dind 镜像需要特权
volumes:
- ./jenkins_home:/var/jenkins_home # 共享Jenkins Home解决路径问题
- ./certs:/certs/client
- ./docker:/var/lib/docker
在上面的配置文件中,我们将docker的证书共享,并设置了jenkins中的环境变量,使其使用镜像中的docker。同时,我们还在docker镜像中映射了Jenkins Home,以解决目录结构不一致的问题。
自此,你就可以在Jenkins内测试你的docker了。这里提供一个测试程序:
#!groovy
pipeline {
agent any
stages {
stage('Test Docker') {
steps {
script {
withDockerContainer(image: 'alpine', toolName: 'sample') {
sh "echo Hello, world."
}
}
}
}
}
}
如果上面的流水线运行到docker镜像启动后就不继续工作了,并且在5分钟后提示超时失败,那么说明docker镜像内的jenkins home映射错误了,需要重新映射。
Jenkins 希望我们能够使用额外的 Agent 代替内置的构建器做构建,具体请参考这里。我们可以使用另一个docker镜像运行Agent:
docker:
...
volumes:
- ./agent_home:/home/jenkins # 共享Jenkins Home解决路径问题
agent:
image: jenkins/inbound-agent
command: -url http://jenkins:8080 <agent-secret> <agent-name>
volumes:
- ./agent_home:/home/jenkins
- ./certs:/certs/client
environment:
- DOCKER_HOST=tcp://docker:2376
- DOCKER_CERT_PATH=/certs/client
- DOCKER_TLS_VERIFY=1
和上面一样,我们设置了docker相关的环境变量与证书映射,同时我们也将Agent的jenkins home映射到了docker内部。
启动后添加一个Java Web启动方式的节点,并且设置其工作目录为/home/jenkins
。添加后查看其状态,可以看到其secret字符串。替换上面的name和secret字符串为你的agent对应值,即可完成添加。
0 条评论