如何在声明性并行步骤的每个阶段使用执行程序

时间:2019-01-23 18:38:30

标签: jenkins jenkins-declarative-pipeline

我正在尝试在声明性管道中改编一些旧的多职业。 我希望声明式管道中并行步骤的每个阶段都使用自己的执行程序。

我得到的行为是詹金斯正在使用同一执行程序来运行所有阶段。

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
                      }
                  }
            }
        }
    }
}

在上面的示例中,我希望该阶段(“第一份工作”)和(“第二份工作”)使用它自己的执行程序。但是Jenkins仅使用一个执行程序来运行两个阶段……它们使用相同的工作区也很重要。

如果我在每个阶段之后设置一个代理/节点,它们将在其自己的执行器中运行,但它还将创建一个新的工作区(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 :(得分:0)

首先,您需要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

如果要添加第三阶段或第四阶段,请小心。您始终必须为每个新阶段设置代理。如果不这样做,管道将无法正常工作。