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?
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