2016-05-13 150 views
3

我有以下的使用情況:詹金斯管道:重新使用加載外部詹金斯管道腳本時,工作區

  1. 結帳/拉開一定的Git版本,使用寫入流水線腳本
    (我需要這個,因爲我檢索動態修訂)

  2. 從那個版本,加載詹金斯流水線文件,位於中以前簽出的文件

  3. 該文件將依靠文件從相同的檢出版本
    (因此,從相同工作區)

問題:加載詹金斯-流水線文件獲取在工作區來執行。但它是空的。我需要該文件在相同的舊工作區中執行。

我想,也許這是因爲圍繞node,因爲node關鍵字創建工作區,如文檔中所述。但是當我試圖加載node之外時,Jenkins由於「離開沙箱」而不允許這樣做。

注意: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

太好了!而且,被調用腳本中的多個節點可以工作! :) – Iviator

+0

這個「功能」令人難以置信地難以發現......我欣喜若狂,我發現它,但需要更好的記錄,在每個管道中產生多個執行程序是一種荒謬的,幾乎是越野車,如果你問我,這需要是一個複選框功能「鏈接腳本執行」或沿着這些線 – sloven