我想用docker来写代码。并不是所有的jenkin slaves都安装了docker,所以如果我只指定:
agent {
dockerfile true
}
字符串
失败,消息为"docker not found"
。我相信这是因为Docker没有安装在相应的Jenkins Slave/Master中。所以我的问题是我如何确保这个jenkins作业被安装了docker的节点选中?
如果我用途:
agent {
node {
label 'has-docker'
dockerfile true
}
}
型
我得到以下错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 2: Only one agent type is allowed per agent section @ line 2, column 5.
agent {
^
WorkflowScript: 2: No agent type specified. Must be one of [docker, dockerfile, label, any, none] @ line 2, column 5.
agent {
型
4条答案
按热度按时间nmpmafwu1#
使用两个
agent
指令可以解决这个问题:agent none
用于整个流水线,而dockeragent
用于特定阶段。你的jenkinsfile应该看起来像这样:
字符串
zed5wv102#
您可以在
docker
块中提供一个额外的参数label
,如此处所述。docker
使用给定的容器执行Pipeline或stage,该容器将在预先配置为接受基于Docker的Pipeline的节点上或在匹配可选定义的
label
参数的节点上动态提供。字符串
如果你使用dockerfile而不是docker,情况类似。
型
uqjltbpv3#
你可以用下面的一个例子。(根据需要修改)
字符串
klr1opcd4#
你需要给予安装了docker的代理一个通用标签,并在管道的代理部分使用该标签。在定义节点时,jenkins文档对
label
标记做了如下说明。标签(或标记)用于将多个代理分组到一个逻辑组中。例如,如果您有多个Windows代理,并且有一个作业必须在Windows上运行,则可以将所有Windows代理配置为具有标签窗口,然后将该作业绑定到此标签。这将确保您的作业在其中一个Windows代理上运行,而不是在没有此标签的任何代理上运行。
标签不一定必须表示代理上的操作系统;您还可以使用标签来说明CPU体系结构,或者在代理上安装了某个工具。
多个标签必须用空格分隔。例如,Windows Docker会为代理分配两个标签:Windows和Docker
标签可以包含任何非空格字符,但应避免使用以下任何特殊字符:!&|<>(),因为其他Jenkins功能允许定义标签表达式,其中可以使用这些字符。
在您的示例中,也可以通过使用公共标签(如`docker)标记已安装docker的节点来执行相同操作
至于您遇到的错误,这里提到了修复方法
字符串