5

我正在通过 python 脚本从“服务器 A”中的作业(父作业)触发“服务器 B”中的作业(子作业)。我有 2-3 个家长工作。所以我想知道哪个父作业触发了子作业。我如何知道哪个父作业触发了子作业?

我可以将父作业名称传递给子作业名称吗?或者我可以直接从子工作中获得父母姓名吗?(环境变量/使用python脚本)

4

4 回答 4

5

每个构建都有一个环境变量JOB_NAME。您可以将此作为字符串参数传递给您的子作业。

/env-vars.html 中提供了以下描述:

JOB_NAME

此构建的项目名称,例如“foo”或“foo/bar”。(要从 Bourne shell 脚本中删除文件夹路径,请尝试:${JOB_NAME##*/})

于 2016-05-12T10:30:46.907 回答
2

如 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 线程提供了更多信息,或者您可以跳到我在该线程中的答案,看看我是如何做到的。

于 2016-05-12T12:37:49.497 回答
2

在子Jenkinsfile 中,此 Groovy 代码将获取触发作业的名称:

String getTriggeringProjectName() {
    if (currentBuild.upstreamBuilds) {
        return currentBuild.upstreamBuilds[0].projectName
    } else {
        return ""
    }
}

currentBuild.upstreamBuildsRunWrapper对象的列表

于 2020-10-13T22:29:54.953 回答
0

您可以为您的子作业使用附加参数。

于 2016-05-12T09:20:48.207 回答