2017-10-19 29 views
0

Dans mon Jenkinsfile déclaratif, j'essaie de calculer certaines valeurs et de les passer ensuite à maven. Aussi facile que cela puisse paraître, je ne peux pas le faire fonctionner.La variable dynamique du Jenkinsfile déclaratif conduit à NPE

est ici la partie pertinente de mon Jenkinsfile:

def port = 1000 as Integer 
def mocksport = 0 as Integer 
def safebranch='unknown' 

pipeline { 
    stages { 
    stage('Compile'){ 
     steps { 
      script { 
       safebranch=env.BRANCH_NAME.toLowerCase().replaceAll("[-_/]", ""); 
       for (int i=0; i<safebranch.length(); i++) { 
       port = (port as Integer) + (Character.getNumericValue(safebranch.charAt(i)) as Integer); 
       } 
       port = (port as Integer) % 99 + 9000; 
       mocksport = (port as Integer) + 1; 
       echo "Application will be deployed on port ${port}" 
       echo "Mocks will be deployed on port ${mocksport}"​​​​​​​​​​​​​ 
      } 
      sh "mvn clean install -Dmaven.test.failure.ignore=true -T 1C -Drancher.port=${port} -Drancher.mocks.port=${mocksport} -Drancher.tag=${safebranch}​" 
     } 
     } 
    } // stages 
} // pipeline 

Cette version est le plus proche que je pouvais arriver à une solution de travail. Au moins le bloc de script est exécuté et les valeurs résonnaient sont correctes: dans le journal que je vois:

[Pipeline] [Compile] echo 
[Compile] Application will be deployed on port 9065 
[Pipeline] [Compile] echo 
[Compile] Mocks will be deployed on port 9066 

Je reçois maintenant cette exception, probablement liée à groovy étant incapable de trouver les variables en dehors du contexte du bloc de script :

java.lang.NullPointerException: Cannot get property '​​​​​​​​​​​​​' on null object 
    at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:60) 
    at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:174) 
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:456) 
    at org.kohsuke.groovy.sandbox.impl.Checker$6.call(Checker.java:284) 
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:286) 
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:29) 
    at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20) 

J'ai essayé de déclarer les variables dans une section d'environnement global directement sous pipeline, et y accéder en utilisant le "env". préfixe, mais dans ce cas, il semble que le bloc de script ne soit pas autorisé à mettre à jour les valeurs (= j'obtiens 1000 et 0 comme résultat de l'écho).

Comment est-ce que je peux faire ce travail? Question bonus: étrangement, les variables semblent toujours être traitées comme des chaînes de caractères. Si je n'ajoute pas la distribution à Integer à chaque utilisation de variable, cela ne fonctionne pas (la variable de port se développe à chaque itération: 1000, 10001012, 100010122343, etc ...). Puis-je déclarer et utiliser la variable en entier?

Répondre

1

Je ne vois pas de problème de portée avec vos variables telles que vous les avez configurées. Ils devraient être disponibles en dehors du bloc script{}. Le message d'erreur ne pointe pas vraiment vers un problème de portée. J'ai pris le code exact que vous avez collé, ajouté une déclaration d'agent et créé une valeur pour "safebranch" et il s'exécute exactement comme je l'aurais souhaité (avec la commande mvn non trouvée, bien sûr).

Running shell script 
+ mvn clean install -Dmaven.test.failure.ignore=true -T 1C -Drancher.port=9011 -Drancher.mocks.port=9012 -Drancher.tag=BRANCH 
/home/jenkins/jenkins/workspace/[email protected]/durable-6849aecb/script.sh: 2: /home/jenkins/jenkins/workspace/[email protected]/durable-6849aecb/script.sh: mvn: not found 

Je se débarrassa de toutes les contraintes de type to Integer et il fonctionne très bien. Peut-être que le problème est en partie dans votre script que vous n'avez pas publié. Voici mon script exact. Essayez de le brancher et voyez s'il fonctionne:

def port = 1000 
def mocksport = 0 
def safebranch='unknown' 

pipeline { 
    agent any 
    stages { 
    stage('Compile'){ 
     steps { 
      script { 
       safebranch="BRANCH" 
       for (int i=0; i<safebranch.length(); i++) { 
       port = (port) + (Character.getNumericValue(safebranch.charAt(i))); 
       } 
       port = (port) % 99 + 9000; 
       mocksport = (port) + 1; 
       echo "Application will be deployed on port ${port}" 
       echo "Mocks will be deployed on port ${mocksport}" 
      } 
      sh "mvn clean install -Dmaven.test.failure.ignore=true -T 1C -Drancher.port=${port} -Drancher.mocks.port=${mocksport} -Drancher.tag=${safebranch}" 
     } 
     } 
    } // stages 
} // pipeline 
+0

J'ai pris votre version et ajouté progressivement toutes mes autres étapes, blocs parallèles, etc ... et maintenant ça marche! :) Aucune idée de ce qui causait le problème, mais votre réécriture l'a corrigé. Merci beaucoup. – lbndev