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

ulydmbyx  于 2022-11-28  发布在  Jenkins
关注(0)|答案(7)|浏览(444)

正在执行名为“A”的上游作业。在A成功时,执行下游项目“B”的测试用例。但是,在从B发送邮件时,我们必须在邮件中合并上游项目详细信息(上游项目名称、内部版本号)。因此,我们可以轻松地将测试运行与相应的上游作业Map/关联。
在下游项目 Jmeter 盘中,显示以下详细信息。

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.是否有助于在下游作业中继承上游详细信息?
1.如何获取当前作业详细信息?

jmo0nnb3

jmo0nnb31#

例如,您提到的问题“Started by upstream project "Chained/1-First“build number 34”的消息在jenkins Cause中提供。
Jenkins将上游构建信息保存在它的cause对象中。如果您使用构建DSL或管道,您可以在groovy中获得它。或者,您可以使用curl作业url并使用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中得到一堆信息,等待所有的脚本批准或全局共享步骤。如果不同的原因触发了这个构建,例如提交或用户,你将得到一个空值。

mjqavswn

mjqavswn2#

您可以通过构建参数将上游变量传递给下游作业,然后可以使用${MyParameter1}和${MyParameter2}等方法访问它们(在下游作业中)。
您需要:
1.将生成参数添加到下游作业。例如,名为"ParentJobName"的字符串参数。
1.将建置后的“触发其他项目的下游参数化组建”加入至上游作业。
1.将"Current Build parameters"或"Predefined parameters"之类的内容添加到#2中,并传入您需要的任何内容。例如:ParentJobName=${JOB_NAME}
1.像访问其他构建变量一样访问参数。例如,${ParentJobName}
你应该能够通过这种方式传递基本的东西。任何比这更复杂的东西,你可能会更好地使用像复制工件插件这样的插件来复制文件,或者在系统groovy步骤中使用Jenkins API来获得/修改上游构建,等等。

yvt65v4c

yvt65v4c3#

您只需在下游作业中使用params.variableName即可检索从上游参数作业传递的参数。下游作业不一定是参数化作业。

hjzp0vay

hjzp0vay4#

扩展@razboy回答:这是一个很好的方法,如果原因不能在沙箱白名单。我忘记了Jenkins API,并使用当前的构建控制台来寻找有关触发原因的字符串。您可以尝试从API获取数据作为@razboy或获得当前的控制台,如果您需要简单的东西,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
uhry853o

uhry853o5#

MeowRude的回答帮了我一个大忙。

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

而在下游作业:

echo "${params.VERSION_NUMBER}"
balp4ylt

balp4ylt6#

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

def causes = currentBuild.getBuildCauses()

将返回对象的ArrayList,这些对象最有可能提供必要的详细信息,例如,upstreamProject表示完整的项目名称,upstreamBuild表示内部版本号。然后,您可以轻松地在上游和下游内部版本之间关联结果。
来源:razboy评论中pipeline-examples的链接

bmp9r5qi

bmp9r5qi7#

您可以使用“参数化触发器插件”https://plugins.jenkins.io/parameterized-trigger/它甚至可以远程触发构建。

相关问题