【问题标题】:Jenkinsfile - Agents questionsJenkinsfile - 代理问题
【发布时间】:2018-09-21 21:52:55
【问题描述】:

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

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

问题 1:

当我在 Jenkinsfile 的顶层声明代理时,这意味着它将用于以下所有阶段。那么有什么区别:

agent { label "docker" }

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

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

问题 2:

label 标签是如何工作的?我知道某处已经创建代理并使用标签我只是指向它 - 就像上面的示例一样:默认情况下我使用“docker”代理?这也意味着在steps {...} 期间,此代理将被 ma​​ven 代理覆盖?

问题 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 {
        ...
    }
}

我想使用带有 ma​​ven: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")
                }
            }
        }
    }
}

在这种情况下 agent any 是如何工作的?哪个代理可以执行 docker.build?

【问题讨论】:

    标签: docker jenkins jenkins-pipeline


    【解决方案1】:

    答案 1:

    agent { label "docker" }
    

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

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

    这将尝试拉取名称为 maven:3.x.x 的 docker 映像并启动容器并执行管道中提到的步骤。如果你使用MultiJob,这将在slave中执行,标签基于此配置:

    答案 2:

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

    答案 3:

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

    【讨论】:

      猜你喜欢
      • 2019-02-26
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多