如何在 Jenkinsfile 中定义和迭代地图
How to define and iterate over map in Jenkinsfile
我对 groovy 的了解并没有超出我对 Jenkinsfiles 的了解。我试图弄清楚是否有可能在 Jenkinsfile 中定义一个地图,然后可以以 "for loop" 的方式应用。
我有这些变量:
mymap = {
"k1": "v1"
"k2": "v2"
"k3": "v3"
}
我的 Jenkinsfile 中有一个 stage
,如下所示:
stage('Build Image') {
withCredentials([[<the credentials>]) {
sh "make build KEY={k1,k2,k3} VALUE='{v1,v2,v3}'"
}
有没有办法为 mymap
中的每个配对制作一个 Build Image
阶段?我尝试过的方法都没有成功。
您可以像这样遍历地图:
def map = [Io: 1, Europa: 2, Ganymed: 3]
for (element in map) {
echo "${element.key} ${element.value}"
}
我不知道阶段的动态计数是否有用。也许你可以使用并行节点,但我不知道这是否可行。
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]
}
}
还有另一种简单的方法可以将 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)
自 2017 年 5 月 30 日起,您可以在没有解决方法的情况下迭代地图。
您需要将 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}"
}
我对 groovy 的了解并没有超出我对 Jenkinsfiles 的了解。我试图弄清楚是否有可能在 Jenkinsfile 中定义一个地图,然后可以以 "for loop" 的方式应用。
我有这些变量:
mymap = {
"k1": "v1"
"k2": "v2"
"k3": "v3"
}
我的 Jenkinsfile 中有一个 stage
,如下所示:
stage('Build Image') {
withCredentials([[<the credentials>]) {
sh "make build KEY={k1,k2,k3} VALUE='{v1,v2,v3}'"
}
有没有办法为 mymap
中的每个配对制作一个 Build Image
阶段?我尝试过的方法都没有成功。
您可以像这样遍历地图:
def map = [Io: 1, Europa: 2, Ganymed: 3]
for (element in map) {
echo "${element.key} ${element.value}"
}
我不知道阶段的动态计数是否有用。也许你可以使用并行节点,但我不知道这是否可行。
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]
}
}
还有另一种简单的方法可以将 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)
自 2017 年 5 月 30 日起,您可以在没有解决方法的情况下迭代地图。
您需要将 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}"
}