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

dur*_*dur 6 jenkins docker jenkins-pipeline

我在詹金斯内部编写了一个声明式管道。该管道应在远程Docker服务器上的Docker容器中运行。

我阅读了定制执行环境

定制执行环境

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

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

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

我读过使用远程Docker服务器

使用远程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 */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这行得通,但它使用脚本管道。

我还阅读了指定Docker标签

指定Docker标签

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

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

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

hak*_*iri 4

我认为你在这里混合了一些东西。关于代理的文档部分,代理部分用于标识您的阶段应在其上运行的节点,以及特殊的配置和信息。

Docker 标签反过来提供了应该从镜像内部运行的信息。

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

agent {
    docker {
        image 'maven:3-alpine'
        label 'docker-special'
    }
}
Run Code Online (Sandbox Code Playgroud)

docker 标签上的文档部分

泊坞窗

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

至于您的特定用例。

jenkins文档的这一部分提到了 sidecar 模式/高级用法,他们立即切换到脚本化。

所以是的,正如我所提到的,这在声明式中不可用。声明式的唯一出路是将外部服务器标记为具有特定标签的 jenkins 节点。