我想使用docker来构建我的代码。并非所有jenkin奴隶都安装了docker,所以如果我只指定:
agent {
dockerfile true
}
消息"docker not found"
失败。我相信这是因为docker没有安装在相应的jenkins slave / master中。所以我的问题是:如何确保安装了docker的节点选择了这个jenkins作业?
如果我使用:
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 {
答案 0 :(得分:1)
您需要为已安装docker的代理程序安装公共标签,并在代理程序部分内为该管道使用该标签。在定义节点时,jenkins文档会为label
标记声明以下内容。
标签(或标签)用于将多个代理分组为一个逻辑 组。例如,如果您有多个Windows代理,并且您有一个 必须在Windows上运行的作业,然后您可以配置所有 Windows代理程序具有标签窗口,然后将该作业绑定到 这个标签。这将确保您的工作在您的一个上运行 Windows代理,但没有此标签的任何代理都没有。
标签不一定必须代表操作系统 中介;您也可以使用标签来记录CPU架构,或者 在代理上安装了某个工具。
多个标签必须用空格分隔。例如,窗户 docker会为代理分配两个标签:windows和docker。
标签可能包含任何非空格字符,但您应该避免使用 特殊字符,如以下任何一个:!& |<>(),和其他Jenkins一样 功能允许定义标签表达式,其中包含这些字符 可以使用。
在您的情况下,通过标记安装了Docker的节点来做同样的事情,例如`docker
至于您遇到的错误,提到了here
agent {
docker {
dockerfile true
label 'docker'
}
}
答案 1 :(得分:0)
使用两个agent
指令可以解决此问题:
agent none
用于整个管道,而docker agent
用于特定阶段。
您的jenkinsfile应该如下所示:
pipeline{
agent none
stages{
stage('stage_name'){
agent {
dockerfile{
label 'slave-label'
dir 'relative/location/of/Dockerfile'
}
}
...
}
}
}
答案 2 :(得分:0)
您可以在 label
块内提供一个额外的参数 docker
,如记录的 here。
码头工人
使用给定的容器执行管道或阶段,该容器将在预先配置为接受基于 Docker 的管道的节点上动态配置,或在匹配可选定义的 label
参数的节点上。
pipeline {
agent {
docker {
image 'node:14-alpine'
label 'docker-node'
}
}
stages {
...
}
}
如果您使用 dockerfile 而不是 docker,则类似。
pipeline {
agent {
dockerfile {
filename 'Dockerfile'
dir 'build'
label 'docker-node'
}
}
stages {
...
}
}