如何在Jenkins上将值从子作业传递给父作业?

时间:2015-11-11 16:42:43

标签: jenkins

我知道可以使用Multijob Plugin

将值从父作业传递到子作业

是否可以将变量从子作业传递给父作业?

3 个答案:

答案 0 :(得分:4)

是的,做了一点工作。如果JobParent调用jobChild并且您希望将variableChild1(您可能在jobChild作业中创建)在jobParent作业中可见,则执行以下简单步骤。

  1. 在子作业中,创建一个包含其中所有变量的文件(变量=值)对。让我们称之为child或downstream_job或jobChild_envs.txt

  2. 现在,一旦jobParent完成调用jobChild(我猜你正在调用Trigger另一个项目或构建其他项目步骤等),下一步就是使用"从另一个项目/工作中复制工件&# 34; (在Jenkins中复制Artifact插件)。 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

  4. 此时,如果jobChild作业创建了一个带有ex:

    变量的.txt文件
    variableChild1=valueChild1
    

    在其中,然后它对父/ upstrem作业jobParent可用/可见。

    有关详细信息,请参阅图像,然后在最后运行作业以查看输出。

    enter image description here

    enter image description here

答案 1 :(得分:1)

在管道构建中,您可以按如下方式执行此操作。假设您要保存子构建的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
}

答案 2 :(得分:0)

几年后添加到这个答案中。我这样做的方法是使用一个 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")

与来回传递文件​​相比,我更喜欢这种方法,因为它允许通过多个工作节点进行扩展并并行执行多个作业。