詹金斯未能建立下游工作

Posted

技术标签:

【中文标题】詹金斯未能建立下游工作【英文标题】: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 项目不支持作为构建步骤输入,但这似乎违反直觉,并且对我来说是一个障碍。任何人都可以确认是否确实如此?

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

谢谢

【问题讨论】:

我在这里处理几乎相同的问题。不幸的是,我能找到的关于这个主题的唯一其他材料是 4 月的另一篇 *** 帖子:***.com/questions/43337070/… 【参考方案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 的项目”错误,即使管道已经知道该分支。

以上是关于詹金斯未能建立下游工作的主要内容,如果未能解决你的问题,请参考以下文章

如何为詹金斯管道声明方法定义工作区体积

多个工作插件多次运行工作 - 詹金斯

在詹金斯上安排工作过夜

詹金斯工作的 Ansible 提示

詹金斯 - 让繁重的工作等待一定数量的执行者可用

如何创建相当于詹金斯管道的竹子工作