簡體   English   中英

如何在 Jenkins 中永久使用 Groovy PostBuild 更新全局環境變量並在其他后續構建中使用它?

[英]How can I update a global Environment Variable using Groovy PostBuild in Jenkins permanently and use it in other subsequent builds?

我有一個要求,我只想在以前的類似事件關閉時才創建一個 Service Now 事件。 我正在使用 Jenkins 自由式工作。 我采取的方法如下:-

  1. 創建全局環境變量以存儲事件編號並設置默認值。
  2. 在上游作業中檢查事件的 state 並將 state 傳遞給下游作業。
  3. 在下游工作中,如果事件仍然存在,則什么也不做。 如果它已關閉/已解決,請創建另一個帶有一些已定義描述的事件。
  4. 使用當前事件編號更新全局環境變量。 並永久保存。
  5. 檢查更新事件編號的 state(通過訪問全局環境變量),然后在后續構建中遵循相同的過程。

到目前為止,我已經通過使用各種插件實現了第 3 步。 為了實現第 4 步,我正在使用 groovy 構建后插件,這樣我就可以永久更新全局環境變量,以便在我的下一個構建中可用,這樣我就可以在創建新的之前檢查事件的狀態. 我想出了一個代碼,但它似乎並沒有永久更新變量(通過在后續構建中打印變量來驗證)。 根據我的要求,該腳本還有其他部分,但 SNOW_INC 是我想要永久更新的全局變量,直到下一次構建。

import groovy.json.JsonSlurper
import hudson.model.*

def workspace = manager.build.getEnvVars()["WORKSPACE"]
def console = manager.listener.logger.&println

build = Thread.currentThread().executable
String jobName = build.project.getName()
job = Hudson.instance.getJob(jobName)
my_env_var = job.getLastBuild().getEnvironment()["SNOW_INC"]
console(my_env_var)

try{
def inputFile = new File(workspace, 'response.json')
if (inputFile != null){
JsonSlurper slurper = new JsonSlurper()
parsedJson = slurper.parse(inputFile)
String number= parsedJson.result.number
console("${number}")

System.setProperty("hudson.model.ParametersAction.safeParameters", "INC_NUMBER")

manager.build.addAction(
        new ParametersAction(
            new StringParameterValue("INC_NUMBER", "${number}")
        )
    )

manager.build.addAction(
        new ParametersAction(
            new StringParameterValue("SNOW_INC", "${number}")
        )
    )
console("Environment Variable set")
}
} catch (Exception e){
println("response.json file was not ")
}

任何幫助,將不勝感激!

無論如何,幾天后找到了解決方案。 因此,為了修改可在任何作業或任何構建中使用的全局環境變量,如下所示(如前所述,在 Groovy Postbuild 中使用):

nodes = Jenkins.getInstance().getGlobalNodeProperties()
nodes.getAll(hudson.slaves.EnvironmentVariablesNodeProperty.class)
if ( nodes.size() != 1 ) {
    console("error: unexpected number of environment variable containers: "
        + nodes.size()
        + " expected: 1")
} else {
    envVars= nodes.get(0).getEnvVars()
    envVars.put("SNOW_INC", "${number}")
    Jenkins.getInstance().save()
    
}

因此,在創建新事件的任何運行之后,我將使用更新后的編號更新環境變量“SNOW_INC”。 然后在另一個工作中使用它來根據場景驗證該事件是否開放。 奇跡般有效!

暫無
暫無

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

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