【问题标题】:jenkins fails on building a downstream job詹金斯未能建立下游工作
【发布时间】:2018-03-10 08:01:30
【问题描述】:

我正在尝试像这样从当前工作中触发下游工作

pipeline {
  stages {
    stage('foo') {
      steps{
        build job: 'my-job', propagate: true, wait: true
      }
     }
  }
}

目的是等待作业结果并根据该结果失败或成功。 Jenkins 总是以消息 Waiting for non-job items is not supported 失败。上面提到的作业没有任何参数,并且像我的其他作业一样定义,使用多分支管道插件。

我能想到的只是这种类型的 jenkins 项目不支持作为构建步骤输入,但这似乎违反直觉,并且对我来说是一个障碍。任何人都可以确认是否确实如此?

如果是这样,任何人都可以提出任何解决方法吗?

谢谢

【问题讨论】:

标签: jenkins continuous-integration continuous-deployment


【解决方案1】:

这看起来像 JENKINS-45443,其中包含评论

Pipeline 不支持上游/下游作业系统,部分原因是技术限制,部分原因是没有静态作业配置可以实现这一点,除非检查最近的构建元数据。

但它也提供了解决方法:

只要解决方案仍在进行中,我会在此处提供我们的解决方法。它基于rtp (Rich Text Publisher) plugin,您应该安装它才能使其工作:

在我们的 Jenkinsfile 结束并触发作业后,我们等待它完成。在这种情况下,build() 返回用于运行下游作业的对象。我们从中获取信息。

警告:getAbsoluteUrl() 函数是一个关键函数。使用它需要您自担风险!

def startedBld = build(
    job: YOUR_DOWNSTREAM_JOB,
    wait: true, // VERY IMPORTANT, otherwise build () does not return expected object
    propagate: true
)

// Publish the started build information in the Build result
def text = '<h2>Downstream jobs</h2>Started job <a href="' + startedBld.rawBuild.getAbsoluteUrl () + '">' + startedBld.rawBuild.toString () + '</a>'
rtp (nullAction: '1',parserName: 'HTML', stableText: text)

本期为JENKINS-29913的一部分,已开两年:

目前DependencyGraph 仅限于AbstractProject,使得工作流无法参与上游/下游关系(在需要作业链接的情况下,例如由于安全限制)。

它引用 RFE(增强请求)JENKINS-37718,基于另一个(未答复)Stack Overflow question。

【讨论】:

    【解决方案2】:

    实际上,我通过更加关注构建步骤的定义来解决这个问题。由于我的所有下游作业都定义为多分支管道作业,因此它们的结构类似于文件夹,文件夹中的每个项目代表一个单独的作业。因此调用下游作业的正确方法不是build job: 'my-job', propagate: true, wait: true,而是build job: "my-job/my-branch-name", propagate: true, wait: true。

    此外,与问题无关但与手头的问题相关,请确保您在 jenkins 机器上始终至少有一个空闲的执行程序,因为等待语法将消耗一个线程用于等待作业,一个线程用于工作正在等待,你很容易发现自己处于资源匮乏的境地。

    希望对你有帮助

    【讨论】:

    • 所以我提到的错误在这里不适用?无论如何 +1。
    • 如果下游多分支管道还没有分支设置,这将如何工作?在这种情况下,我会收到此错误:ERROR: No item named my-job/new-branch found.
    • 如果构建没有发现任何分支但它显然不会工作。因此,在尝试从上游构建之前,请确保下游多分支作业具有您尝试调用的分支发现/构建。
    • @colti 我遇到了同样的问题,但这是因为我的工作处于同一水平。在引用这样的工作后:../my-job/branch 它工作了。
    • 一般来说,正确的方法是什么?我尝试了build "my-job/${env.BRANCH_NAME}",但失败并出现“未找到名为 X 的项目”错误,即使管道已经知道该分支。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-13
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多