我在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服务器上进行构建?
答案 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套接字(和您的代理工作区),否则您将无法从代理容器内部做很多事情。