Как использовать исполнителя для каждого этапа внутри декларативного параллельного шага - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь адаптировать несколько старых мультизадач в декларативном конвейере. Мне бы хотелось, чтобы на каждом этапе параллельного шага в декларативном конвейере использовался собственный исполнитель.

Мне показалось, что Дженкинс использует одного и того же исполнителя для выполнения всех этапов.

pipeline {

agent { label 'macmini'}
    stages() { 
        stage('SCM') {
            steps{
                //clone repo
            }
        }
        stage('Heavy build Stage'){

            parallel {

            stage ("First Job"){ 
                steps {  
                    //do some heavy work
                    sleep 100
                }
              }
              stage ("Second Job"){
                  steps {
                  //do some heavy work
                        sleep 100
                      }
                  }
            }
        }
    }
}

В приведенном выше примере я хочу, чтобы на этапе («Первое задание») и («Второе задание») использовался собственный исполнитель. Но Дженкинс использует только одного исполнителя для выполнения обоих этапов ... также важно, чтобы они использовали одно и то же рабочее пространство.

Если я установлю агент / узел после каждого этапа, они будут работать в своем собственном исполнителе, но это также создаст новое рабочее пространство (my-job @ 2).


Редактировать

Просто чтобы прояснить ситуацию, я привык работать с исполнителем, чтобы сбалансировать работу между моими разными рабами. Я знаю (опытным путем), что каждый раб может выполнять 4 этапа параллельно. Эти задания запускаются веб-крючком.

Так что, если работа начнется, я получу

slave 1
1. idle
2. idle
3. (Heavy Build Stage) #1
4. idle

Если сработают еще три задания, я получу следующий сценарий

slave 1
1. (Heavy Build Stage) #2
2. (Heavy Build Stage) #3
3. (Heavy Build Stage) #1
4. (Heavy Build Stage) #4

Это означает, что у меня 8 этапов работы (2 этапа параллельно * 4 сборки)

То, что я ищу, - это способ разделить каждую стадию, чтобы использовать собственного исполнителя, поэтому я могу получить следующий сценарий

Build Queue
1. job #3
2. job #4

slave 1
1. (Heavy Build Stage / Second Jo) #2
2. (Heavy Build Stage / First job) #2
3. (Heavy Build Stage / Second Job) #1
4. (Heavy Build Stage / First job) #1

Когда я пытаюсь решить проблему установки агента / узла после каждого этапа

stage("First Job"){
agent{ label SLAVE_NAME }
...
}

Это работает, но каждый этап выполняется в своем собственном рабочем пространстве (создает новую папку с @ 2), но я бы хотел, чтобы они выполнялись в одном рабочем пространстве.

У меня такое же поведение при использовании опции customWorkspace для каждого этапа

agent {
  node {
  label "macmini"
  customWorkspace 'teste'
 }
}

Логи показывают

Running in /Users/mobile/jenkins/teste
[Pipeline] {
[Pipeline] ws
Running in /Users/mobile/jenkins/teste@2

1 Ответ

0 голосов
/ 24 января 2019

Сначала вам нужно 2 агента. Каждый агент получает свой собственный ярлык («jenkinsagent1» и «jenkinsagent2» в приведенном ниже примере). Глобальный конвейер не предоставлен агенту. Каждый этап получает своего агента.

pipeline{

    agent none //this tells the pipeline that it is not executed by 1 agent

        stage('Is parallel executed on 2 agents') {
             parallel {

                 stage('foo'){
                       agent{
                          node { label'jenkinsagent1' //executed by this agent
                           customWorkspace 'myWorkspace/test' //use this workspace
                          } 
                       }
                       steps { // do something}
                  }

                  stage('bar'){
                       agent{
                          node { label 'jenkinsagent1' //execute on this agent
                        customWorkspace 'myWorkspace/test'} } //use this workspace
                       steps { // do something different} //executed by the other agent
                  } //closing stage bar
    } //closing parallel
// closing pipeline

Будьте осторожны, если хотите добавить 3-й или 4-й этап. Вы всегда должны установить агента для каждого нового этапа. Если вы этого не сделаете, конвейер не будет работать.

...