如何在Jenkinsfile中定义和迭代映射

时间:2017-03-13 18:22:34

标签: jenkins groovy jenkins-pipeline

我对groovy的了解并没有超出我对Jenkinsfiles的了解。我试图弄清楚是否可以在Jenkins文件中定义一个地图,然后可以在" for循环中使用#34;时尚。

我有这些变量:

mymap = {
    "k1": "v1"
    "k2": "v2"
    "k3": "v3" 
}

我的Jenkins文件中有stage,如下所示:

stage('Build Image') {
    withCredentials([[<the credentials>]) {
    sh "make build KEY={k1,k2,k3} VALUE='{v1,v2,v3}'"
}

有没有办法为Build Image中的每个配对设置mymap阶段?我对我所尝试过的事情没有任何好运。

4 个答案:

答案 0 :(得分:6)

Jenkins文档中有一些类似的user-submitted examples

这样的事情应该有效:

def data = [
  "k1": "v1",
  "k2": "v2",
  "k3": "v3",
]

// Create a compile job for each item in `data`
work = [:]
for (kv in mapToList(data)) {
  work[kv[0]] = createCompileJob(kv[0], kv[1])
}

// Execute each compile job in parallel
parallel work


def createCompileJob(k, v) {
  return {
    stage("Build image ${k}") { 
      // Allocate a node and workspace
      node {
        // withCredentials, etc.
        echo "sh make build KEY=${k} VALUE='${v}'"
      }
    }
  }
}

// Required due to JENKINS-27421
@NonCPS
List<List<?>> mapToList(Map map) {
  return map.collect { it ->
    [it.key, it.value]
  }
}

答案 1 :(得分:3)

您可以迭代这样的地图:

def map = [Io: 1, Europa: 2, Ganymed: 3]
for (element in map) {
    echo "${element.key} ${element.value}"
}

我不知道动态的阶段计数是否有用。也许你可以使用并行节点,但我不知道这是否可能。

答案 2 :(得分:2)

还有另一种简单的方法可以将json对象解析为groovy对象 - Parsing and producing JSON

import groovy.json.JsonSlurper
def jsonSlurper = new JsonSlurper()
def object = jsonSlurper.parseText('{ "myList": [4, 8, 15, 16, 23, 42] }')
println(object.myList)

答案 3 :(得分:1)

自2017年5月30日起,您可以迭代Google地图,而无需解决方法。
您需要将Pipeline:Groovy插件升级到> = 2.33
相关问题:https://issues.jenkins-ci.org/browse/JENKINS-27421

插件更改日志:https://plugins.jenkins.io/workflow-cps

mymap = {
    "k1": "v1"
    "k2": "v2"
    "k3": "v3" 
}

for(element in mymap) {
    sh "make build KEY=${element.key} VALUE=${element.value}"
}