groovy 声明性动态并行阶段

gwbalxhn  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(168)

我认为我在这里做了一些非正统的事情,但是为了方便起见,我想坚持声明性的**,同时**动态地生成并行步骤。
我找到了一种方法来做类似的事情,但是mixing both paradigms,它似乎不能很好地与BlueOcean UI一起工作(每个并行分支内的多个阶段不能正确显示)。
我最接近的是这样的东西:

def accounts() {
  return ["dynamic", "list"]
}

def parallelJobs() {
  jobs = []

  for (account in accounts()) {
    jobs[] = stage(account) {
      steps {
        echo "Step for $account"
      }
    }
  }

  return jobs
}

# this is inside a shared library, called by my Jenkinsfile, like what is described

# under "Defining Declarative Pipelines in Shared Libraries" in

# https://www.jenkins.io/blog/2017/09/25/declarative-1/

def call() {
  pipeline {
    stages {
      stage('Build all variations') {
        parallel parallelJobs()
      }
    }
  }
}

问题是Jenkins犯了这样的错误:

Expected a block for parallel @ line X, column Y.
           parallel parallelJobs()
           ^

因此,我想知道是否有一种方法可以将parallelJobs()返回的阶段列表转换为Jenkins所期望的块...

whlutmcx

whlutmcx1#

是的,你可以。你需要返回一个map的阶段。下面是一个有效的管道示例。

pipeline {
    agent any

    stages {
        stage('Parallel') {
            steps {
                script {
                    parallel parallelJobs()
                }
            }
        }
    }
}

def accounts() {
  return ["dynamic", "list"]
}

def parallelJobs() {
  jobs = [:]

  for (account in accounts()) {
    jobs[account] = { stage(account) {
       echo "Step for $account"
     }
    }
  }
  return jobs
}

相关问题