Несколько агентов в конвейере Jenkins, но используют один агент для определенных этапов - PullRequest
0 голосов
/ 31 января 2020

У меня есть этот 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 build" выполняется на самом агенте, как и ожидалось. Затем он доходит до стадии «инициализации». Это сборка нового контейнера docker (сборка docker (мой Dockerfile, который я указал в разделе агента для этого этапа). Этот этап завершается внутри этого контейнера. Затем он переходит к этапу "WorkspaceDev" - тогда ОПЯТЬ перестраивает контейнер с docker build.

Я хочу использовать тот же контейнер, созданный на этапе «Инициализация»

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Я думаю, что метка не имеет смысла (поэтому она игнорируется), когда вы используете 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"
        }

    }

}
}
0 голосов
/ 31 января 2020

Не можете ли вы использовать agent { label 'NODE_LABEL' }?
Ваш вопрос не очень понятен, но, похоже, вы определяете глобального агента в верхней части вашего Jenkinsfile. Если этап, который вы пытаетесь запустить на другом агенте, это этап "Docker build", вам просто нужно указать агент, как на других этапах.

Существует документация агента: https://jenkins.io/doc/book/pipeline/syntax/#agent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...