Jenkins管道中有多个代理,但在某些阶段使用一个代理

时间:2020-01-31 13:25:19

标签: docker jenkins jenkins-pipeline

我有这个Jenkinsfile:

#!groovy
pipeline
{
options {
    buildDiscarder(logRotator(numToKeepStr: '10'))
}

agent {

    label 'docker && new'

}

stages
{

    stage('Docker build')

    {
        when {
            branch 'dev'
        }

        steps
        {                 


            sh "echo ${env.BUILD_NUMBER}"
            sh "./scripts/push.sh Docker http://xxxxx.xxxx ${env.BUILD_NUMBER} ${env.GIT_BRANCH}"
            sh "echo ${env.BUILD_NUMBER}"
            sh "echo ${env.GIT_BRANCH}"

        }
    }

    stage("Initialise") 
    {

        agent {
            dockerfile {
            filename 'Dockerfile'
            label 'docker && new'
            args '--entrypoint ""'
            }
        }

         steps {

                sh "terraform init -input=false"
        }


    }

    stage("WorkspaceDev") {

        agent {
            dockerfile {
            filename 'Dockerfile'
            label 'docker && new'
            args '--entrypoint ""'
            }
        }

        when {
            branch 'dev'
        }

        steps {

                sh "terraform workspace select dev || terraform workspace new dev"
        }

    }

}
}

它从我的Dockerfile构建一个容器,但是运行此作业时,它正在创建一个新的Docker容器以运行称为WorkspaceDev的下一阶段。我需要在第一阶段使用单独的代理,然后在所有其他阶段使用dockerfile代理

如何使用为初始化阶段构建的相同容器?

问题:

运行此管道时,“ Docker构建”阶段将按预期在代理本身上执行。 然后进入“初始化”阶段。这将构建一个新的Docker容器(docker构建(我在此阶段的代理部分中指定的我的Dockerfile)。此阶段在此容器内完成。 接下来进入“ WorkspaceDev”阶段,然后再次使用docker build重建容器。

我想使用在“初始化”阶段构建的相同容器

2 个答案:

答案 0 :(得分:0)

您不能使用agent { label 'NODE_LABEL' }吗?
您的问题不是很清楚,但似乎您在Jenkinsfile的上部定义了一个全局代理。如果您要在其他代理上运行的阶段是“ Docker build”阶段,则只需像在其他阶段中一样指定代理即可。

有座席文档: https://jenkins.io/doc/book/pipeline/syntax/#agent

答案 1 :(得分:0)

我认为当您使用Dockerfile-agent时,标签没有任何意义(因此将被忽略),因此它会为每个阶段创建一个新容器。

因此,请尝试以下操作:

#!groovy
pipeline
{
options {
    buildDiscarder(logRotator(numToKeepStr: '10'))
}

agent {
   dockerfile {
      filename 'Dockerfile'
      args '--entrypoint ""'
   }
}

stages
{

    stage('Docker build')

    {
        agent {
            dockerfile {
            filename 'Dockerfile'
            args '--entrypoint ""'
            }
        }
        when {
            branch 'dev'
        }

        steps
        {                 


            sh "echo ${env.BUILD_NUMBER}"
            sh "./scripts/push.sh Docker http://xxxxx.xxxx ${env.BUILD_NUMBER} ${env.GIT_BRANCH}"
            sh "echo ${env.BUILD_NUMBER}"
            sh "echo ${env.GIT_BRANCH}"

        }
    }

    stage("Initialise") 
    {


         steps {

                sh "terraform init -input=false"
        }


    }

    stage("WorkspaceDev") {

        when {
            branch 'dev'
        }

        steps {

                sh "terraform workspace select dev || terraform workspace new dev"
        }

    }

}
}