如何异步 Jenkins 并行阶段?

问题描述 投票:0回答:1

Jenkins 可以运行并行阶段,并且它们可以同时执行且彼此独立。如何在另一个并行管道中完成另一个阶段后启动一个阶段?

例如,有两条并行的管道。阶段 B 在阶段 A 之后开始。阶段 C 必须在阶段 B 之后运行。

-------stage A--------stage C---------------------
--------------stage B-----------------------------

请向我展示一个声明式管道示例。谢谢。

jenkins jenkins-pipeline jenkins-groovy
1个回答
0
投票

例如,有两条并行的管道。阶段 B 在阶段 A 之后开始。阶段 C 必须在阶段 B 之后运行。

你描述的是顺序执行,而不是并行执行。我假设您的意思是在阶段 A 已经运行时可以触发阶段 B。

如何在另一个并行管道中完成另一个阶段后启动一个阶段?

简而言之 - 你不能。 特定管道的所有阶段仅在该管道内处理。

您可以使用阶段 C 中的

waitForBuild
步骤来模拟整个管道(而不是阶段)。但这会导致浪费执行器轮询构建状态:

// Pipeline1 located in your/project/folder
pipeline {
  agent any
  stages {
    stage('A') {
      steps {
        println 'I am stage $STAGE_NAME'
      }
    }
    stage('C') {
      steps {
        waitForBuild: 'your/project/folder/Pipeline1'
        println 'I am stage $STAGE_NAME'
      }
    }
  }
}
// Pipeline2 located in your/project/folder
pipeline {
  agent any
  stages {
    stage('B') {
      steps {
        println 'I am stage $STAGE_NAME'
      }
    }
  }
}

更好的选择可能是拆分 Pipeline1 并将阶段 C 移至 Pipeline3。这样您就可以使用

build
步骤:

// Pipeline1 located in your/project/folder
pipeline {
  agent any
  stages {
    stage('A') {
      steps {
        println 'I am stage $STAGE_NAME'
      }
    }
  }
}
// Pipeline2 located in your/project/folder
pipeline {
  agent any
  stages {
    stage('B') {
      steps {
        println 'I am stage $STAGE_NAME'
        build job: 'your/project/folder/Pipeline3',
          wait: false,
          propagate: false
      }
    }
  }
}
// Pipeline3 located in your/project/folder
pipeline {
  agent any
  stages {
    stage('C') {
      steps {
        println 'I am stage $STAGE_NAME'
      }
    }
  }
}

您还可以尝试使用锁定资源插件进行模拟,如https://stackoverflow.com/a/73059059/16417367中所述,但方式略有不同,以便执行器不会被

lock浪费
步骤。但这里的问题是阶段 B 和 C 将相互锁定,因此在已经运行的阶段 C 完成之前,您将无法运行包含阶段 B 的管道的另一个实例(如分支):

// Pipeline1 located in your/project/folder
pipeline {
  agent any
  stages {
    stage('A') {
      steps {
        println 'I am stage $STAGE_NAME'
      }
    }
    stage('C') {
      options {
        lock('my-lock')
      }
      steps {
        println 'I am stage $STAGE_NAME'
      }
    }
  }
}
// Pipeline2 located in your/project/folder
pipeline {
  agent any
  stages {
    stage('B') {
      options {
        lock('my-lock')
      }
      steps {
        println 'I am stage $STAGE_NAME'
      }
    }
  }
}

所以我的建议是重新设计管道以避免它们之间的依赖关系。在同一管道中并行运行某些阶段和按顺序运行某些阶段可能会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.