2016-05-13 10 views
3

私は、次のユースケースがあります。ジェンキンスパイプライン:再使用、ワークスペースの外部ジェンキンスパイプラインのスクリプトを読み込む

  1. チェックアウト/、特定のGitのリビジョンを引く書かれたパイプラインスクリプトを使用して
    (私はので、これを必要とします私はそのリビジョンから動的に改訂)

  2. を取得し、以前のファイル

  3. このファイルは、ファイルに依存しているでしょうが、チェックアウトの間に位置ジェンキンス・パイプライン・ファイルをロード同じチェックアウトしたリビジョン
    から(したがって、同じワークスペースから)

問題:ロードされたジェンキンス・パイプライン・ファイルは、新しいワークスペースで実行されます。しかしそれは空です。私は同じ古いワークスペースで実行するには、そのファイルが必要です。

nodeキーワードは、ドキュメントに記載されているように、ワークスペースを作成するため、恐らく周囲の理由であると考えていました。しかし、nodeの外側にロードしようとしたとき、ジェンキンスは「サンドボックスを離れる」ためにこれを許可しませんでした。

注:jenkins-pipeline-fileが見つかり、実際に実行されます。問題は実行中にです。


サンプルコードを見てください:

インライン化パイプラインスクリプト

node('master') { 
    def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt' 

    checkout poll:false, 
    scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]], 
    doGenerateSubmoduleConfigurations:false, 
    extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[], 
    userRemoteConfigs:[[credentialsId:'...', url:'...']]] 

    load 'further-script-logic.jenkins' 
} 

ファイル:さらに-スクリプトlogic.jenkins

node('master') { 
    // make use of certain files 
    // assumption: pwd() is the *same* workspace which were checked-out before 
    // problem: it's not, it's a new empty workspace 
} 

答えて

2

回避策の種類は、described hereあります。

  1. あなたはクロージャ(ラムダ)を返すようにというスクリプトを書き換える必要があり、呼び出し元スクリプト
  2. の終わりに{...}()中括弧を使用する必要が
    {-> /* former code */ }

この方法では、実行されたスクリプトにプログラムフローの制御を「放棄」しません。代わりに、返されたクロージャーを使用し、 "自分で呼び出します"。これにより、Jenkinsはさらに作業領域を作成できなくなります。

この解決法が複数のノードを呼び出し元スクリプトおよび/または呼び出されたスクリプトで宣言できるようにすることは悲しいことです。

私はこれらの変更をサンプルコードに組み込みました。
"<--- CHANGE"でマークされた行を探します。

インラインパイプラインのスクリプトファイル

node('master') { 
    def latestBuildableRevision = readFile '/my/LATEST-BUILDABLE-REVISION.txt' 

    checkout poll:false, 
    scm:[$class:'GitSCM', branches:[[name:latestBuildableRevision]], 
    doGenerateSubmoduleConfigurations:false, 
    extensions:[[$class: 'CleanBeforeCheckout']], submoduleCfg:[], 
    userRemoteConfigs:[[credentialsId:'...', url:'...']]] 

    load 'further-script-logic.jenkins' 
}() // <--- CHANGE 1 

:さらに-スクリプトlogic.jenkins

{-> // <--- CHANGE 2 
    node('master') { 
    // ..... 
    } 
} 
+0

グレート!そして、スクリプトDOと呼ばれる複数のノードが動作します! :) – Iviator

+0

この「機能」は信じられないほど発見するのが難しい...私はそれを見つけたが、文書化する必要があることを誇りに思っている。パイプラインごとに複数のエグゼキュータを産んだら、あなたが私に尋ねるとばかげてばかげている。チェックボックス機能 "連​​鎖スクリプト実行"またはそれらの行に沿ったものである必要があります – sloven

関連する問題