Jenkinsfile-代理商问题

时间:2018-09-21 12:42:53

标签: docker jenkins jenkins-pipeline

对于以下示例,我有两个问题:

pipeline {
    agent { label "docker" }
    stages {
        stage('Build') {
            agent {
                docker {
                    image 'maven:3.5.0-jdk-8'
                }
            }
            steps {
                ...
            }
        }
    }
}

问题1:

当我在Jenkinsfile的顶层声明agent时,这意味着它将用于以下所有阶段。那么之间的区别是什么?

agent { label "docker" }

agent {
    docker {
        image 'maven:3.5.0-jdk-8'
    }
}

第一个将使用docker代理,第二个将使用maven映像作为可执行环境的docker代理?标签“ docker”代理是在哪里配置/安装的?

问题2:

标签标签如何工作?我知道某个地方已经创建了代理程序,并使用标签指向了它,就像上面的示例一样:默认情况下,我使用“ docker”代理程序?这还意味着在steps {...}期间,此代理将被 maven 代理覆盖吗?

问题3:

以下示例的最后一个问题:

pipeline {

    agent {
       docker {
            image 'maven:3-alpine'
            args '-v ... -e ...'
       }
    }

    stages {
        stage('Maven Build') {
            steps {
                sh '...'
            }
        }
        stage('Docker push') {
            agent { 
                docker 'openjdk:8-jdk-alpine' 
            } 
            steps {
                script {
                    docker.build("my-image")
                }
            }
        }
    }
    post {
        ...
    }
}

我想使用带有 maven:3-alpine 映像的docker容器构建第一阶段。在构建过程中,将显示以下错误:

...tmp/durable-54b54bdc/script.sh: line 1: docker: not found

所以我修改了这个示例,这是工作结果:

pipeline {

    agent any

    stages {
        stage('Docker push') {
            steps {
                script {
                    docker.build("my-image")
                }
            }
        }
    }
}

在这种情况下,任何代理商如何工作?哪个代理可以执行docker.build?

1 个答案:

答案 0 :(得分:0)

答案1:

agent { label "docker" }

这将尝试查找标签为docker的代理,并在该代理中执行步骤。

agent {
    docker {
        image 'maven:3.5.0-jdk-8'
    }
}

这将尝试提取名称为maven:3.x.x的docker映像并启动容器并执行管道中提到的步骤。如果您使用的是MultiJob,则会根据以下配置在带有标签的从站中执行:

enter image description here

答案2:

在管道的顶级定义agent可确保将执行程序分配给标记为docker的代理。据我所知,我假设将在标记为docker的代理中创建docker容器,并且将在该容器内执行步骤。

答案3:

原因可能是,您可能尚未配置Docker Label(请参见上图)。该任务可能已在未安装docker的主服务器中执行。其他一项工作的原因可能是因为该作业是在安装了docker的代理中执行的。