0

在jenkins聲明式管道中,如何根據自定義的groovy/powershell方法設置環境變量的值?例如,如果我有如下的delcarative管道,我可以使用共享庫方法來設置此值嗎? 本質上,我試圖使用多分支聲明性管道jenkins作業,它有一個部署階段,但我需要確保開發分支部署到DEV,發佈分支部署到STG,但使用相同的管道。我的想法是創建一個基於自定義方法設置的環境變量(可能在共享庫中的Groovy中),並且該方法僅查看env.BRANCH的當前值,並且只需一點​​點邏輯即可設置值目標部署環境。這裏是我所設想在jenkins聲明式管道中,如何根據方法設置環境變量?

pipeline { 
environment { 
    DEPLOY_ENV = mapBranchToDeployEnvironment(${BRANCH}) 
} 

然後在我的部署階段,我將分兩個PowerShell中調用

bat "powershell .\\Deploy-Service -Environment ${DEPLOY_ENV}" 

bat "powershell .\\Deploy-ServiceProxy -Environment ${DEPLOY_ENV}" 

否則,怎麼都解決在使用相同的問題,人們目前使用此值的示例管道部署到不同的環境,同時在許多其他函數調用中使用變量? Jenkins建議如何將觸發構建的分支名稱映射到應該部署到的環境(如果有)? 根據我的理解,聲明式管道允許管道爲「多分支」,如果作業也部署,則它需要映射到部署環境。當所有全局jenkins管道環境變量對於每個作業/分支執行都是相同的值時,管道還會如何將多分支部署到多個環境?

在上面的場景中,管道變量'DEPLOY_ENV'是從作業設置的其他環境變量中派生出來的,並且通常在階段級別可用,但在此我們正在設置全局值以便我們可以跨階段使用它

更新:我的問題是,我沒有意識到它是多麼簡單,而是認爲我不得不將一個階段或腳本對象傳遞到一個常規共享庫函數中,實際上它就像創建一個共享庫,然後直接引用方法中的環境變量。簡單。謝謝。

回答

3

您可以完全按照您的建議進行操作。您應該使用var(一種新的DSL方法)創建jenkins shared library。這些可以被調用來分配給一個管道範圍的環境變量。你基本上是正確的。這裏有一個Jenkinsfile片段分配給一個環境變量:

environment { 
    DEPLOY_ENV = mapBranchToDeployEnvironment() 
} 

你不需要分支傳遞給mapBranchToDeployEnvironment DSL的方法,因爲你可以在方法訪問分支。在共享庫的vars/mapBranchToDeployEnvironment.groovy樣本內容是這樣的:

def call() { 
    echo "branch is: ${env.BRANCH_NAME}" 
    if (env.BRANCH_NAME == 'master') { 
    return 'prod' 
    } else { 
    return 'staging' 
    } 
} 

你可能不應該期望這是一個五分鐘的任務,但你會得到它。祝你好運!

+0

我已經試過了,但是,DSL方法需要將'this'作爲參數傳遞,並且傳遞參數可能會發生在上面提到的那條確切線上。你能舉一個例子說明你上面描述的DSL方法如何通過必要的論證? 「如果庫需要訪問全局變量,比如env,那麼這些變量應該明確地傳遞到庫類或者方法中」https://jenkins.io/doc/book/pipeline/shared-libraries/ – joey

+0

如果jenkins告訴事實是,這意味着參數需要在你上面提供的代碼片段中傳遞,對嗎? – joey

+0

如果你只使用一個var(https:// jenkins。io/doc/book/pipeline/shared-libraries/#definition-global-variables),你不需要傳遞'this'。我發現變量可以訪問Jenkins文件中可用的所有內容。如果你想讓var調用你在'src/com/blah/blah.groovy'中定義的類或方法,那麼你需要將'this'從var傳遞給類。但不要那樣做,除非你有更復雜的東西;只是使用一個變種。 :) – burnettk

相關問題