2016-10-28 14 views
2

これは私の状況です:私のプロジェクトの1つは、サブバージョンリポジトリの異なる場所にあるフロントエンドとバックエンドとしておおまかな複数のサブプロジェクトで構成されています。なぜこのJenkins Pipelineコードは成功しないのですか?

私は既にチェックアウトのために適切にパラメータ化され、関数にcheckoutプラグインを抽出:

def svn(String url, String dir = '.') { 
    checkout([ 
     $class: 'SubversionSCM', 
     locations: [[ 
      remote: url, 
      credentialsId: '...' 
      local: dir, 
     ]], 
     workspaceUpdater: [$class: 'UpdateUpdater'] 
    ]) 
} 

そのように、私は(簡体字)この手段によって、チェックアウトを行うことができた:

stage "1. Build" 

parallel (
    "Backend": { node { 
     svn('https://svn.acme.com/Backend/trunk') 
     sh 'gradle build' 
    }}, 

    "Frontend": { node { 
     svn('https://svn.acme.com/Frontend/trunk') 
     sh 'gradle build' 
    }} 
) 

私はスタックトレースから推測できる限り、チェンジセットXMLファイルで問題を抱えているジェンキンスに非常に似ています。

私もプロジェクト名とそのsvn urlの両方を再利用したいので、マップ上で繰り返し実行して、連続してチェックアウトし、次の並列ビルド専用ステージの最初のステージでファイルを隠すだけです:

stage "1. Checkout" 

node { 
    [ 
     'Backend': 'https://svn.acme.com/Backend/trunk', 
     'Frontend': 'https://svn.acme.com/Frontend/trunk', 
    ].each { name, url -> 
     // Checkout in subdirectory 
     svn(url, name) 
     // Unstash by project name 
     dir(name) { stash name } 
    } 
} 

stage "2. Build" 
// ... 

はどういうわけかジェンキンスパイプラインはこれをサポートしていないので、私はシンプルなため、ループの代わりに使用:java.io.NotSerializableException: java.util.LinkedHashMap$Entry:同様に動作し、例外を除いて、ビルドを終了していない

node { 
    def projects = [ 
     'Backend': '..' 
     // ... 
    ] 

    for (project in projects) { 
     def name = project.getKey() 
     def url = project.getValue() 

     svn(url, name) 
     dir(name) { stash name } 
    } 

    project = projects = name = url = null 
} 

。ご覧のとおり、すべてのプロパティをnullに設定しています。なぜなら、どこかを読んでいるため、この動作が妨げられるからです。この問題を解決して、ここで何が起こっているのかを説明できますか?

ありがとうございます!

答えて

0

私はそれがループ内のための知られているジェンキンスのバグだと思う:

https://issues.jenkins-ci.org/browse/JENKINS-27421

しかし、既知のバグが.eachスタイルにもありますがそう

https://issues.jenkins-ci.org/browse/JENKINS-26481

ループ現在、Jenkins Pipelinesのマップを反復処理できないようです。私は回避策として、リストを作成し、「古典的なループ」スタイルでそれを反復することをお勧め:

def myList = ["Backend|https://svn.acme.com/Backend/trunk", "Frontend|https://svn.acme.com/Frontend/trunk"] 

for (i = 0; i < myList.size(); i++) { 
    //get current list item : myList[i] and split at pipe | ->escape pipe with \\ 
    def (name, url) = myList[i].tokenize('\\|') 
    //do operations 
    svn(url, name) 
    dir(name) { stash name } 
} 
+0

ジェンキンスパイプラインスクリプトエラーをデバッグすることは不可能であると思われるので、これは、非常に迷惑です。しかし、ありがとう! – Jazzschmidt

関連する問題