jenkins - 如何在 Jenkins 管道中并行运行 for 循环的每次迭代?
问题描述
我有一个运行一些动作序列的管道作业(例如;构建 >> 运行 >> 报告)。我已经把这个序列放在一个 for 循环中,因为我可以获得一个参数,我应该重复相同的序列多少次。请找到我编写的示例代码。
for (int i = 0; i < <param_val>; ++i){
node{
stage('Build') {
build 'Build'
}
stage('Run') {
build 'Run'
}
stage('Reporting') {
build 'Reporting'
}
}
}
现在我的代码正在等待一个完整的序列发生,然后继续运行下一个序列。那很费时间。我有更多的从代理,可以并行运行序列。如何并行运行 for 循环的每次迭代?
我想到了一个解决方案:有一个具有实际序列的管道
node{
stage('Build') {
build 'Build'
}
stage('Run') {
build 'Run'
}
stage('Reporting') {
build 'Reporting'
}
}
有另一个带有 for 循环的管道,它将触发第一个管道等待:false:
for (int i = 0; i < <param_val>; ++i){
build(job: 'pipeline-1', wait: false)
}
这行得通吗?还是我们有更好的选择来对单管道做同样的事情?
解决方案
将代码放在循环中的闭包中:
def oneNode = { c ->
node {
build job: 'Build', parameters: [string(name: 'Component', value: c)]
build 'Run'
build 'Reporting'
}
}
然后制作一个你想要同时运行的所有闭包的地图:
def jobs = [:]
def components = params.Componets.split(",")
for (int i = 0; i < components.size(); ++i) {
def component = components[i].trim()
jobs[component] = {
oneNode(component)
}
}
最后使用parallel
生成地图的步骤:
stage('Build, run, report') {
<the code from the above steps>
parallel jobs
}
推荐阅读
- node.js - 有没有办法可以在 nodejs 和 postgresql 中解决这个问题?
- symfony - VichUploader 和 LiipImagine :调整大小并保存上传的图像
- plot - 我应该如何在netlogo的“监视器”中显示程序?
- javascript - 通过节点服务器插入数据时出错
- mysql - 通过 shell 脚本连接到 mysql 数据库服务器
- javascript - Phaser 2:如何使蒙版区域不可点击
- amazon-web-services - 在预签名 URL 到期时触发事件
- java - 在 Kotlin 中使用带有 @NotNull setter 和 @Nullable getter 的 Java 字段
- sonarqube - Java 1.8.0_221 的“SonarQube 需要 Java 11+ 才能运行”
- r - 使用 R 抓取应用程序评论:xpath 问题