簡體   English   中英

如何在 Jenkins 上將價值從孩子的工作傳遞給父母?

[英]How does it possible to pass value from child job to parent on Jenkins?

我知道可以使用Multijob Plugin將值從父作業傳遞到子作業

是否可以將變量從子作業傳遞給父作業?

是的,有點工作。 如果JobParent調用jobChild並且您希望將variableChild1(您可能在jobChild作業中創建)在jobParent作業中可見,則執行以下簡單步驟。

  1. 在子作業中,創建一個文件(變量=值)對,其中包含所有變量。 讓我們稱之為child或downstream_job或jobChild_envs.txt

  2. 現在,一旦jobParent完成調用jobChild(我猜你正在調用Trigger另一個項目或構建其他項目步驟等),下一步就是使用“從另一個項目/作業復制工件”(Jenkins中的復制工件插件)。 PS:您需要單擊復選框以FLATTEN文件(請參閱下面的jobParent圖像)。 https://wiki.jenkins-ci.org/display/JENKINS/Copy+Artifact+Plugin

    使用此插件,您將能夠從jobChild的工作空間獲取文件/文件夾到定義/基礎工作空間位置的jobParent工作空間。

  3. 在jobParent中,您將注入環境變量(在BUILD步驟中)。 https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin

此時,如果jobChild作業創建了一個帶有變量的.txt文件,例如:

variableChild1=valueChild1

在其中,它將對父/ upstrem作業jobParent可用/可見。

有關更多詳細信息,請參閱圖像並在最后運行作業以查看輸出。

在此輸入圖像描述

在此輸入圖像描述

在管道構建中,您可以按如下方式執行此操作。 假設您要保存子構建的URL並將其傳遞回父管道。

在你的孩子建立......

// write out some data about the job
def jobData = [job_url: "${BUILD_URL}"]
def jobDataText = groovy.json.JsonOutput.toJson(jobData)
writeFile file: "jobDataChild.json", text: jobDataText, encoding: 'UTF-8'

// archive the artifacts
archiveArtifacts artifacts: "jobDataChild.json", onlyIfSuccessful: false

你可以在父版本中檢索這個...

step ([$class: 'CopyArtifact', projectName: 'ChildJobName', filter: "jobDataChild.json", selector: [$class: 'LastCompletedBuildSelector'] ])
if (fileExists("jobDataChild.json")) {
    def jobData = readJSON file: "jobDataChild.json"
    def jobUrl = jobData.job_url
}

幾年后添加到這個答案。 我這樣做的方法是擁有一個 redis 實例,管道可以連接到該實例並來回傳遞數據。

sh "redis-cli -u $redis_url ping" // server is up
def redis_key = "$BUILD_TAG" // BUILD_TAG is always unique

build job: "child", propagate: true, wait: true, parameters: [
    string(name: "redis", value: "$redis_url;$redis_key"),
]

/******** in child job ***********/
def (redis_url, redis_key) = env.redis.tokenize(";")
sh"redis-cli -u $redis_url ping"  // we are connected on url

// lpush adds to an array in redis
sh"""
    redis-cli -u $redis_url lpush $redis_key "MY_DATA"
"""  

/******* in parent job after waiting for child job *****/
def data_from_child = sh(script: "redis-cli --raw -u $redis_url LRANGE $redis_key 0 -1", returnStdout: true)

data_from_child == "MY_DATA"? println("👍") : error("wow did not expect this")

我有點喜歡這種方法,而不是來回傳遞文件​​,因為它允許通過多個工作節點進行擴展並並行執行多個作業。

暫無
暫無

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

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