我在两年前四年前 写过如何使用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对应值,即可完成添加。

分类: Linux

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。