如何指定在Jenkinsfile中安装了docker的节点类型?

时间:2018-04-24 08:24:45

标签: docker jenkins jenkins-pipeline

我想使用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 {

3 个答案:

答案 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 {
        ...
    }
}
相关问题