web-dev-qa-db-fra.com

Comment définir et itérer sur la carte dans Jenkinsfile

Ma connaissance du groovy ne va pas bien au-delà du peu que je connais sur Jenkinsfiles. J'essaie de comprendre s'il est possible d'avoir une carte définie dans un fichier Jenkins qui peut ensuite être appliquée de manière "pour la boucle".

J'ai ces variables:

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

J'ai un stage dans mon fichier Jenkins qui ressemble à ceci:

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

Existe-t-il un moyen de faire un Build Image étape pour chacun des appariements dans mymap? Je n'ai pas eu de chance avec ce que j'ai essayé.

9
numb3rs1x

Il existe des exemples similaires soumis par les utilisateurs dans la documentation Jenkins.

Quelque chose comme ça devrait fonctionner:

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]
  }
}
5
Christopher Orr

Vous pouvez parcourir une carte comme celle-ci:

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

Je ne sais pas si un décompte dynamique des étapes est utile. Vous pourriez peut-être utiliser des nœuds parallèles, mais je ne sais pas si c'est possible.

3
Christopher

Il existe un autre moyen simple pour analyser un objet json en un objet groovy - Analyse et production de JSON

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

Depuis le 30 mai 2017, vous pouvez parcourir les cartes sans solution de contournement.
Vous devez mettre à niveau le plugin Pipeline: Groovy vers> = 2.33
Problème connexe: https://issues.jenkins-ci.org/browse/JENKINS-27421

Journal des modifications du plugin: 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}"
}
0
eff