2017-10-19 13 views
0

私の宣言的なJenkinsfileでは、いくつかの値を計算し、それらをmavenに渡そうとしています。それは簡単なように、私はそれを動作させることはできません。宣言的なJenkinsfileの動的変数はNPEにつながります

ここに私の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 

このバージョンでは、私は実用的なソリューションを得ることができる最も近いです。少なくとも、スクリプトブロックが実行され、エコーの値が正しいです:ログに私が参照してください。私は今、この例外を取得しています

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

、おそらくスクリプトブロックのコンテキストの外で変数を見つけることができないGROOVYに関連します:

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) 

パイプライン直下のグローバル環境セクションで変数を宣言し、 "env"を使用してそれらにアクセスしようとしました。この場合、スクリプトブロックは値を更新できないようです(=私はエコーの結果として1000と0を取得します)。

どうすればこの作品を作成できますか?

ボーナス質問:不思議なことに、変数は常に文字列として扱われるようです。変数を使用するたびにIntegerにキャストを追加しないと、機能しません(ポート変数は各繰り返しで拡張されます:1000、10001012、100010122343など)。変数を宣言して整数として使用できますか?

答えて

1

変数を設定したときに、変数にスコープの問題が表示されません。それらはscript{}ブロックの外で利用できるはずです。エラーメッセージは実際にスコープの問題を指していません。

正確なコードを貼り付け、エージェントの宣言を追加して、 "safebranch"の値を作りました。これは私が期待していたとおりに正確に実行されます(mvnコマンドは見つからない)。

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 

私もto Integer型強制のすべてを処分したし、それが正常に動作します。たぶん問題はあなたが投稿しなかったあなたのスクリプトの一部です。ここに私の正確なスクリプトです。それを接続してみてください、それが実行されるかどうかを確認:

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

私はあなたのバージョンを取り、徐々になど、すべての私の他のステップ、並列ブロックを、再度追加...そして今、それは働きます! :)何が問題を引き起こしていたのかは分かりませんが、あなたの書き直しはそれを修正しました。どうもありがとう。 – lbndev

関連する問題