Jenkins - 如何在下游获取和使用上游信息

时间:2016-08-29 13:48:24

标签: jenkins jenkins-plugins

执行名为“A”的上游作业。 A执行测试用例成功,即下游项目“B”。但是当从B发送邮件时,我们必须在邮件中包含上游项目详细信息(上游项目名称,构建号码)。因此,我们可以轻松地将测试运行与各自的上游作业进行映射/核心化。

在下游项目仪表板中,正在显示详细信息。

Started by upstream project Dev_RM_3.0_CI_Test build number 10
originally caused by:

我查了https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project。但是在下游找不到任何可以继承的东西。

使用以下详细信息创建示例作业,以显示当前作业详细信息。

echo $BUILD_NUMBER
echo $JOB_NAME
echo $BUILD_ID

但输出是

Building on master in workspace /var/lib/jenkins/workspace/env
[env] $ /bin/sh -xe /tmp/hudson970280339057643719.sh
+ echo 1
1
+ echo env
env
+ echo 1
1
Finished: SUCCESS
  1. 在下游工作中继承上游细节的任何帮助吗?
  2. 如何获取当前的工作细节?

6 个答案:

答案 0 :(得分:12)

您引用问题“Started by upstream project "Chained/1-First”内部版本号34“的消息可以在jenkins Cause中找到。

Jenkins将上游构建信息保留在其原因对象中。如果您正在使用构建DSL或管道,您可以在groovy中获得它。或者,您可以curl工作网址并使用jq获取原因

例如curl http://localhost:8080/job/Chained/job/2-Second/17/api/json

"_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun",
"actions": [{
  "_class": "hudson.model.CauseAction",
  "causes": [{
    "_class": "hudson.model.Cause$UpstreamCause",
    "shortDescription": "Started by upstream project \"Chained/1-First\" build number 34",
    "upstreamBuild": 34,
    "upstreamProject": "Chained/1-First",
    "upstreamUrl": "job/Chained/job/1-First/"
  }]
}

或者来自管道,例如:

node() {
    stage('downstream') {
        def upstream = currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause)
        echo upstream?.shortDescription
    }
}

您可以从Cause中获取大量信息,等待所有脚本批准或全局共享步骤。如果不同的原因触发此构建,您将获得null,例如commit或user。

答案 1 :(得分:10)

您可以通过构建参数将上游变量传递到下游作业,然后使用$ {MyParameter1}和$ {MyParameter2}等内容访问它们(在下游作业中)。

你需要:

  1. 将构建参数添加到下游作业。例如,一个名为" ParentJobName"。
  2. 的字符串参数
  3. 添加帖子构建"在其他项目上触发下游参数化构建"到上游工作。
  4. 添加"当前构建参数"或"预定义参数"到#2并传递你需要的任何东西。例如: ParentJobName=${JOB_NAME}
  5. 像访问其他构建变量一样访问参数。例如$ {ParentJobName}
  6. 你应该能够传递基本的东西。任何比这更复杂的东西,你可能最好使用像Copy Artifacts Plugin这样的插件来复制文件或在系统groovy步骤中使用Jenkins API来获取/修改上游构建等等。

答案 2 :(得分:1)

您可能需要安装某些插件,但是

def causes = currentBuild.getBuildCauses()

将返回一个对象的 ArrayList,这些对象很可能会提供必要的详细信息,例如 upstreamProject 表示完整的项目名称,upstreamBuild 表示内部版本号。然后,您可以轻松地关联上下游构建之间的结果。

来源:链接到上面 razboy 评论中的 pipeline-examples

答案 3 :(得分:0)

扩展@razboy的答案: 如果原因无法在沙盒中列入白名单,这是一种很好的方法。我忘记了Jenkins API并使用当前的构建控制台来查找有关触发器原因的字符串。您可以尝试从@razboy中获取API中的数据或获取当前控制台,如果您需要简单的东西,可以使用grep。 Jenkins API对于更复杂的逻辑更灵活。要获得API帮助,请将/ api附加到您的构建网址:<jenkins_url>/job/<buildUrl>/<buildNumber>/api

   def buildUrl = env.BUILD_URL
   sh "wget $buildUrl -O currentConsole.txt"
   statusCode = sh returnStatus: true,script: 'cat currentConsole.txt | grep -q "Started by upstream project"'
   boolean startedByUpstream= statusCode==0

答案 4 :(得分:0)

您可以简单地在下游作业中使用params.variableName来检索从上游参数作业传递的参数。您的下游作业不必一定是参数化作业。

答案 5 :(得分:0)

MeowRude的回答帮助了我。要重新获得它,请在上游作业中:

build job: 'mail-test', parameters: [[$class: 'StringParameterValue', name: 'VERSION_NUMBER', value: '1.0.0.0']]

在下游工作中:

echo "${params.VERSION_NUMBER}"