簡體   English   中英

帶有未定義變量的Jenkins Pipeline / Groovy Script

[英]Jenkins Pipeline / Groovy Script with undefined variables

我正在嘗試將我的大型多配置Jenkins作業轉換為管道語法,因此除其他外,我可以將它分成多個節點並將我的多個階段合並為一個作業。 這是我遇到麻煩的部分:

def build_test_configs = [:]
def compilers = ['gnu', 'icc']
def configs = ['debug', 'default', 'opt']

for (int i = 0; i < configs.size(); i++) {
    for (int j = 0; j < compilers.size(); j++) {
        def node_name = ""
        if ("${compilers[j]}" == "gnu") {
            node_name = "node001"
        } else {
            node_name = "node002"
        }
        build_test_configs["${node_name} ${configs[i]}"] = {
            node ("${node_name}") {
                stage("Build Test ${node_name} ${compilers[j]} ${configs[i]}") {
                    unstash "${node_name}-tarball"
                    sh "$HOME/software/jenkins_scripts/nightly.sh ${configs[i]} ${compilers[j]} yes $WORKSPACE"
                }
            }
        }
    }
}

parallel build_test_configs

我的問題是${compilers[j]$configs[i]是未定義的,當我到達我試圖在第13行建立build_test_configs字典的build_test_configs時。看來第8行的檢查是工作得很好。

更新

我本身沒有錯誤消息。 該腳本不會產生任何運行時錯誤。 意外的輸出是階段的名稱是:

  • 構建測試node001 null null
  • 構建測試node001 null null
  • 構建測試node002 null null

而且nightly.sh腳本也會傳遞null參數。

我認為這是預期的行為:Jenkins Pipeline腳本是用Groovy編寫的,但實際執行的是對它的轉換(他們使用的術語是“繼續傳遞樣式轉換”)。 例如,某些部分將在主節點上運行,某些部分在從節點上運行。

這涉及到很多神奇的東西,但在我們的層面上,這意味着我們必須使用我們使用的語法和構造中的約束。

請參閱本文的“基礎知識”段落

要了解管道行為,您必須了解有關其執行方式的幾點。

  1. 除了步驟本身之外,所有的Pipeline邏輯,Groovy條件,循環等都在master上執行。 無論簡單還是復雜! 甚至在節點塊內!
  2. 步驟可以使用執行程序在適當的地方進行工作,但每個步驟也有一個小的主控開銷。
  3. 管道代碼編寫為Groovy,但執行模型在編譯時從根本上轉換為Continuation Passing Style(CPS)。
  4. 這種轉換為Pipelines提供了有價值的安全性和持久性保證,但它帶來了權衡:步驟可以調用Java並快速有效地執行,但Groovy的運行速度比正常情況慢得多。 Groovy邏輯需要更多的內存,因為基於對象的語法/塊樹保留在內存中。
  5. 管道持續存在程序及其狀態經常能夠在主機故障中存活。

另請參閱JENKINS-41335討論腳本中變量的支持。

編輯:嗯,是的,正如評論中所指出的,新的聲明性模型允許定義一個環境 ,其變量將以您需要的方式傳遞...不知道如何在沒有JENKINS-41335的情況下在腳本管道中執行此操作似乎進一步的演變現在將在宣告土地上發生:/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM