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

问题描述 投票:0回答:7

执行名为“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. 如何获取当前职位详细信息?
jenkins jenkins-plugins
7个回答
32
投票

例如,您提到问题“

Started by upstream project "Chained/1-First
”构建号 34”的消息可在 jenkins Cause 中找到。

Jenkins 将上游构建信息保留在其原因对象中。如果您正在使用构建 DSL 或 Pipelines,您可能会在 groovy 中获得它。或者,您可以

curl
工作网址并使用
jq
获取 Cause

例如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。


12
投票

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

您需要:

  1. 向下游作业添加构建参数。 例如,名为“ParentJobName”的字符串参数。
  2. 向上游作业添加后期构建“触发其他项目上的下游参数化构建”。
  3. 将“当前构建参数”或“预定义参数”等内容添加到#2 中,并传入您需要的任何内容。例如:
    ParentJobName=${JOB_NAME}
  4. 像访问其他构建变量一样访问参数。例如${ParentJobName}

你应该能够通过这种方式传递基本的东西。 任何比这更复杂的事情,你可能会更好地使用像 Copy Artifacts Plugin 这样的插件来复制文件,或者在系统常规步骤中使用 Jenkins API 来获取/修改上游构建等。


2
投票

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


2
投票

您可能必须安装某些插件,但是

def causes = currentBuild.getBuildCauses()

将返回一个对象的 ArrayList,这些对象很可能会提供必要的详细信息,例如

upstreamProject
表示完整的项目名称,
upstreamBuild
表示内部版本号。然后您可以轻松关联上游和下游构建之间的结果。

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


1
投票

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

<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

1
投票

MeowRude的回答对我有帮助。回顾一下,在上游工作中:

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

在下游工作中:

echo "${params.VERSION_NUMBER}"

0
投票

要检索所有

upstreamJobs
,您可以使用
getUpstreamBuilds()
中的
currentBuild
方法。此函数返回除最后一个之外的所有
UpstreamBuilds
。请参阅 Jenkins 文档:RunWrapper.getUpstreamBuilds()

https://stackoverflow.com/a/78663413/12241186

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.