如何在 jenkinsfile 中一次循环 4 个 20 个项目的 运行

How to run for loop in batch of 4 for 20 items at once in jenkinsfile

我必须在 groovy 中 运行 for 循环处理 40 个项目,但我希望 运行 它并行处理 4 个项目,然后是下一批,依此类推。我知道 jenkinsfile 中的并行部署,但它会同时触发所有 40 个。

          def i = 0
          mslist.collate(4).each{
               build job: 'deploy', parameters: [string(name: 'PROJECT', value: "${it[i]}"), string(name: 'ENVIRONMENT', value: params.ENVIRONMENT)]
               i=i+1
}

我的更新代码:

stages {
    stage ('Parallel Deployments') {
      steps {
        script {
          def m = rc.ic()
          m = m.collect { "${it}" }
          println "$m"
          m.collate(4).each{
              def deployments = [:]
              batch.each {
                deployments[it] = {
                   build job: 'jb', parameters: [string(name: 'pt', value: it), string(name: 'pl', value: params.gh), string(name: 'dc', value: params.nb)]
                }   
              
            }  
            parallel deployments
          }
        deployments["failFast"] = false
        }
    }
  } 
 }

您可以这样做:

def items = (1..40).collect { "item-${it}" }
items.collate(4).each { List batch -> 
  // batch is now a list of 4 items, do something with it here
}

使用 groovy Iterable.collate 方法将项目拆分为四个项目的批次并循环遍历批次。

如果您真的想像使用多线程那样“并行”执行此操作,那就是另一个问题了。

可以这样做:

node {
    def items = (1..40).collect { "item-${it}" }
    items.collate(4).each { List batch -> 
        def n=[:]
        
        batch.each {
            n[it] = {
                stage(it) {
                    build job: 'x', parameters: [ string( name: "it", value : it) ]      
                }    
            }
        }
        
      parallel n
    }
}

工作:x Jenkinsfile 内容

node {
    echo "Hello from Pipeline x"
    print params
}

这将同时调用 4 个作业 运行。确保在 Jenkins 上配置了超过 4 个执行程序。