如何指定已在文件中安装docker的节点类型?

如何指定已在文件中安装docker的节点类型?,docker,jenkins,jenkins-pipeline,Docker,Jenkins,Jenkins Pipeline,我想使用docker来构建我的代码。并非所有jenkin奴隶都安装了docker,因此如果我只指定: agent { dockerfile true } 它失败,并显示一条消息“docker not found”。我相信这是因为docker并没有安装在相应的jenkins从/主设备中,而jenkins从/主设备就是负责这项工作的。所以我的问题是:如何确保jenkins作业由安装了docker的节点选择 如果我使用: agent { node { label 'h

我想使用docker来构建我的代码。并非所有jenkin奴隶都安装了docker,因此如果我只指定:

agent {
      dockerfile true
}
它失败,并显示一条消息“docker not found”。我相信这是因为docker并没有安装在相应的jenkins从/主设备中,而jenkins从/主设备就是负责这项工作的。所以我的问题是:如何确保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 {

您需要为docker安装了通用标签的代理提供一个通用标签,并在管道的代理部分中使用该标签。jenkins文档在定义节点时为
标签
标记说明了以下内容

标签(或标签)用于将多个代理分组为一个逻辑代理 小组。例如,如果您有多个Windows代理,并且 必须在Windows上运行的作业,然后您可以配置所有 Windows代理具有Windows标签,然后将该作业绑定到 这个标签。这将确保您的作业在其中一台计算机上运行 Windows代理,但不在没有此标签的任何代理上

标签不一定必须表示计算机上的操作系统 代理人;您还可以使用标签来说明CPU体系结构,或者 代理上安装了某个工具

多个标签必须用空格分隔。例如,windows docker将为代理分配两个标签:windows和docker

标签可以包含任何非空格字符,但应避免 以下任何一种特殊字符:&|(),和其他詹金斯一样 功能允许定义标签表达式,其中包含这些字符 可以使用

在您的情况下,也可以通过使用常见标签(如“docker”)标记安装了docker的节点来执行相同的操作

至于您遇到的错误,我们提到了修复方法


使用两个
agent
指令可以解决此问题:

agent none
用于整个管道,docker
agent
用于特定阶段

您的文件应如下所示:

pipeline{
    agent none
    stages{
        stage('stage_name'){
            agent {
                dockerfile{
                label 'slave-label'
                dir 'relative/location/of/Dockerfile'
                }
            }
           ...
         }
    }
}

您可以在
docker
块内提供一个额外的参数
label
,如文档所述

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

如果您使用的是dockerfile而不是docker,则情况类似

pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile'
            dir 'build'
            label 'docker-node'
        }
    }
    stages {
        ...
    }
}

您不能在
docker
闭包中指定
dockerfile
,因此上述修复无法工作
pipeline {
    agent {
        docker {
            image 'node:14-alpine' 
            label 'docker-node'
        }
    }
    stages {
        ...
    }
}
pipeline {
    agent {
        dockerfile {
            filename 'Dockerfile'
            dir 'build'
            label 'docker-node'
        }
    }
    stages {
        ...
    }
}