我正在通过 python 脚本从“服务器 A”中的作业(父作业)触发“服务器 B”中的作业(子作业)。我有 2-3 个家长工作。所以我想知道哪个父作业触发了子作业。我如何知道哪个父作业触发了子作业?
我可以将父作业名称传递给子作业名称吗?或者我可以直接从子工作中获得父母姓名吗?(环境变量/使用python脚本)
我正在通过 python 脚本从“服务器 A”中的作业(父作业)触发“服务器 B”中的作业(子作业)。我有 2-3 个家长工作。所以我想知道哪个父作业触发了子作业。我如何知道哪个父作业触发了子作业?
我可以将父作业名称传递给子作业名称吗?或者我可以直接从子工作中获得父母姓名吗?(环境变量/使用python脚本)
每个构建都有一个环境变量JOB_NAME。您可以将此作为字符串参数传递给您的子作业。
/env-vars.html 中提供了以下描述:
JOB_NAME
此构建的项目名称,例如“foo”或“foo/bar”。(要从 Bourne shell 脚本中删除文件夹路径,请尝试:${JOB_NAME##*/})
如 OltzU 所述,将作业名称作为环境变量传递可能是可行的方法,但这取决于您如何触发子作业。如果您使用构建后步骤直接从父作业触发子作业,则可以使用参数化远程构建插件之类的东西来传递作业名称。如果您在父作业中使用脚本来触发子作业,则可以将作业名称作为参数字符串。
如果您无法将触发作业作为参数传递,您可以使用 Groovy 以编程方式获取构建触发器。Groovy 确实是唯一与 Jenkins api 完全集成的语言,所以如果你想使用另一种语言(python),你会被困在使用 rest api 或 jenkins cli 中,它们可以给你的东西都是有限的(例如据我所知,两者都不能给你触发工作)。
如果您想使用 groovy 来获取触发器作业,您将需要Groovy 插件,您将在子作业中将其作为构建步骤运行。这是获取触发构建的上游作业链的代码片段。您可能需要根据使用的触发器类型修改代码。
def getUpstreamProjectTriggers(causes) {
def upstreamCauses = []
for (cause in causes) {
if (cause.class.toString().contains("UpstreamCause")) {
upstreamCauses.add(cause.getUpstreamProject())
}
}
return upstreamCauses
}
getUpstreamProjectTriggers(build.getCauses())
从这里开始,如果您想在 Python 脚本中使用触发作业,则需要使用 groovy 在环境变量中设置触发作业。这个SO 线程提供了更多信息,或者您可以跳到我在该线程中的答案,看看我是如何做到的。
在子Jenkinsfile 中,此 Groovy 代码将获取触发作业的名称:
String getTriggeringProjectName() {
if (currentBuild.upstreamBuilds) {
return currentBuild.upstreamBuilds[0].projectName
} else {
return ""
}
}
currentBuild.upstreamBuilds
是RunWrapper对象的列表
您可以为您的子作业使用附加参数。