【问题标题】:How to use an executor for each stage inside a declarative parallel step如何在声明性并行步骤中为每个阶段使用执行器
【发布时间】:2019-06-17 10:07:18
【问题描述】:

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

我得到的行为是 Jenkins 使用同一个执行程序来运行所有阶段。

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

在上面的例子中,我希望那个阶段(“First Job”)和(“Second Job”)使用它自己的执行器。但是 Jenkins 只使用一个执行器来运行两个阶段……它们使用相同的工作区也很重要。

如果我在每个阶段之后设置一个代理/节点,它们将在自己的执行程序中运行,但它也会创建一个新的工作区 (my-job@2)。


编辑

为了让自己清楚,我习惯与 executor 一起工作,以平衡不同奴隶之间的工作工作。我(根据经验)知道每个从站可以并行运行 4 个阶段。这些作业由 webhook 触发。

所以如果工作开始我会得到

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

【问题讨论】:

  • 代理的想法阻止你拥有相同的工作空间,如果他们在不同的机器上,这很明显,对吧?当它们在同一台机器上时还不明显,但它是不同的文件夹,所以实际上你必须确保使用安装在同一台机器上的代理以及使用dir 以确保它们会拾取/重用相同在里面工作的目录
  • 我将添加更多信息以使自己清楚,但我相信我所期望的行为不受支持。

标签: jenkins jenkins-declarative-pipeline


【解决方案1】:

首先,您需要 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 阶段,请小心。您总是必须为每个新阶段设置代理。如果你不这样做,管道将无法工作。

【讨论】:

  • 我相信我说得不够清楚。他们需要在同一个代理和工作区上执行。我相信不支持我期望的行为(每个阶段都使用它自己的执行程序),而是在同一个工作区上运行。
  • 可以让一个代理执行多个阶段。此外,可以在同一个工作区中执行此操作,但我想这可能会由于锁定文件等而引起一些麻烦。编辑:我补充了我的答案。两个阶段都在同一个工作区和同一个代理上执行。
  • 感谢您的帮助,但我之前尝试过 customWorkspace,但不起作用。 Jenkins 将尝试创建一个 @2 文件夹。我得到以下信息:在 /Users/mobile/jenkins/teste 中运行和在 /Users/mobile/jenkins/teste@2 中运行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2019-03-13
  • 2016-06-12
相关资源
最近更新 更多