如何使用Jenkins声明式管道在远程Docker服务器上构建?

时间:2019-02-27 16:54:24

标签: docker jenkins jenkins-pipeline

我在Jenkins中编写了一个声明性管道。该管道应在远程Docker服务器上的Docker容器中运行。

我读了Customizing the execution environment

  

自定义执行环境

     

Pipeline旨在轻松地将Docker映像用作单个Stage或整个Pipeline的执行环境。这意味着用户可以定义其管道所需的工具,而无需手动配置代理。几乎任何可以打包在Docker容器中的工具。只需对Jenkinsfile进行少量编辑即可轻松使用。

pipeline {
    agent {
        docker { image 'node:7-alpine' }
    }
    stages {
        stage('Test') {
            steps {
                sh 'node --version'
            }
        }
    }
}

它可以工作,但是它使用Jenkins服务器作为Docker服务器。

我读了Using a remote Docker server

  

使用远程Docker服务器

     

默认情况下,Docker Pipeline插件将与本地Docker守护进程通信,该守护进程通常通过/var/run/docker.sock访问。

     

要选择非默认的Docker服务器(例如Docker Swarm),应使用withServer()方法。

     

通过以下方式将URI和在Jenkins中预先配置的Docker服务器证书认证的凭据ID传递给方法:

node {
    checkout scm

    docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') {
        docker.image('mysql:5').withRun('-p 3306:3306') {
            /* do things */
        }
    }
}

,这可行,但是它使用脚本管道。

我也读过Specifying a Docker Label

  

指定Docker标签

     

默认情况下,管道假定所有已配置的代理都能够运行基于Docker的管道。对于具有macOS,Windows或其他代理程序且无法运行Docker守护程序的Jenkins环境,此默认设置可能会出现问题。管道在“管理Jenkins”页面和“文件夹”级别提供了一个全局选项,用于指定用于运行基于Docker的管道的代理(按标签)。

,但是使用标签将需要一个完整的Jenkins从属服务器(安装了sshd)和一个Jenkins用户,并且一直在线,而Jenkins的主机将安装从属库。仅使用声明性管道而不是脚本化管道听起来有点沉重。

我如何在具有声明性管道的远程Docker服务器上进行构建?

2 个答案:

答案 0 :(得分:2)

我认为您在这里混入了一些东西。关于documentation's part about the agent,代理程序部分用于标识您的阶段应在其上运行的节点,以及特殊的配置和信息。

Docker标记依次提供应从映像内部运行的信息。

除非您将其设置为带有某些特殊标签的Jenkins节点(例如“ docker-special”),否则它不会为您连接外部docker服务器留下任何空间。然后,您可以像做一样简单的事情

agent {
    docker {
        image 'maven:3-alpine'
        label 'docker-special'
    }
}

泊坞窗标签上的文档部分

  

docker

     

使用给定的容器执行管道或阶段,该容器将是   在预配置为接受的节点上动态配置   基于Docker的管道,或在与可选定义的节点匹配的节点上   标签参数。

关于您的特定用例。

詹金斯documentation的这一部分提到了sidecar模式/高级用法,它们立即切换为脚本化。

是的,正如我已经提到的那样,声明式中没有此功能。进行声明的唯一方法是将外部服务器标记为带有特定标签的jenkins节点。

答案 1 :(得分:0)

您不需要“完整的Jenkins从属服务器”-您只需要一台运行Docker并通过x509客户端身份验证通过TCP / TLS为Docker套接字提供服务的计算机;不要提供未经身份验证和未加密的服务,否则您将在安全边界上开一个行星般的洞(这是学习openssl的机会!;)

为进行声明,您可以在agent标记内使用“节点”,并使用与标签相关联的docker容器(具有Jenkins所需的一切)来配置模板。

pipeline {
    agent {
        node {
            label 'docker-agent'
        }
    }
    ...

您需要安装docker套接字(和您的代理工作区),否则您将无法从代理容器内部做很多事情。