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

m0rkklqb  于 2023-08-03  发布在  Jenkins
关注(0)|答案(4)|浏览(134)

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

nmpmafwu

nmpmafwu1#

使用两个agent指令可以解决这个问题:
agent none用于整个流水线,而docker agent用于特定阶段。
你的jenkinsfile应该看起来像这样:

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

字符串

zed5wv10

zed5wv102#

您可以在docker块中提供一个额外的参数label,如此处所述。

docker

使用给定的容器执行Pipeline或stage,该容器将在预先配置为接受基于Docker的Pipeline的节点上或在匹配可选定义的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 {
        ...
    }
}

uqjltbpv

uqjltbpv3#

你可以用下面的一个例子。(根据需要修改)

agent {
    // Equivalent to "docker build -f Dockerfile.build --build-arg version=1.0.2 ./build/
    dockerfile {
        filename 'Dockerfile.build'
        dir 'build'
        label 'my-defined-label'
        additionalBuildArgs  '--build-arg version=1.0.2'
        args '-v /tmp:/tmp'
    }
}

字符串

klr1opcd

klr1opcd4#

你需要给予安装了docker的代理一个通用标签,并在管道的代理部分使用该标签。在定义节点时,jenkins文档对label标记做了如下说明。
标签(或标记)用于将多个代理分组到一个逻辑组中。例如,如果您有多个Windows代理,并且有一个作业必须在Windows上运行,则可以将所有Windows代理配置为具有标签窗口,然后将该作业绑定到此标签。这将确保您的作业在其中一个Windows代理上运行,而不是在没有此标签的任何代理上运行。
标签不一定必须表示代理上的操作系统;您还可以使用标签来说明CPU体系结构,或者在代理上安装了某个工具。
多个标签必须用空格分隔。例如,Windows Docker会为代理分配两个标签:Windows和Docker
标签可以包含任何非空格字符,但应避免使用以下任何特殊字符:!&|<>(),因为其他Jenkins功能允许定义标签表达式,其中可以使用这些字符。
在您的示例中,也可以通过使用公共标签(如`docker)标记已安装docker的节点来执行相同操作
至于您遇到的错误,这里提到了修复方法

agent {
    docker {
        dockerfile true
        label 'docker'
    }
}

字符串

相关问题