我知道可以使用Multijob Plugin
将值从父作业传递到子作业是否可以将变量从子作业传递给父作业?
答案 0 :(得分:4)
是的,做了一点工作。如果JobParent调用jobChild并且您希望将variableChild1(您可能在jobChild作业中创建)在jobParent作业中可见,则执行以下简单步骤。
在子作业中,创建一个包含其中所有变量的文件(变量=值)对。让我们称之为child或downstream_job或jobChild_envs.txt
现在,一旦jobParent完成调用jobChild(我猜你正在调用Trigger另一个项目或构建其他项目步骤等),下一步就是使用"从另一个项目/工作中复制工件&# 34; (在Jenkins中复制Artifact插件)。 PS:您需要单击复选框以FLATTEN文件(请参阅下面的jobParent图像)。 https://wiki.jenkins-ci.org/display/JENKINS/Copy+Artifact+Plugin
使用此插件,您可以将jobChild工作区中的文件/文件夹放入定义/基础工作空间位置的jobParent工作区。
在jobParent中,您将注入环境变量(在BUILD步骤中)。 https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin
此时,如果jobChild作业创建了一个带有ex:
变量的.txt文件variableChild1=valueChild1
在其中,然后它对父/ upstrem作业jobParent可用/可见。
有关详细信息,请参阅图像,然后在最后运行作业以查看输出。
和
答案 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")
与来回传递文件相比,我更喜欢这种方法,因为它允许通过多个工作节点进行扩展并并行执行多个作业。