2017-09-28 46 views
5

我想从我目前的工作,引发下游的工作,像这样詹金斯失败建设

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

的目的是为了等待工作结果和失败或成功,根据该结果下游的工作。詹金斯总是失败,信息Waiting for non-job items is not supported。上面提到的工作没有任何参数,并且使用多分支管道插件将其定义为其余工作。

我所能想到的是,这种类型的jenkins项目不被支持作为构建步骤输入,但这似乎违反直觉并会被证明是对我的阻挡。任何人都可以证实这是否确实如此?

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

谢谢

+1

我在这里处理几乎相同的问题。不幸的是,我可以在这个主题上找到唯一的其他材料是从四月份的另一个StackOverflow帖子:https://stackoverflow.com/questions/43337070/how-to-invoke-a-jenkins-pipeline-a-in-another-jenkins- pipeline-b –

回答

1

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

管道具有上游/下游的作业系统不支持,部分原因是由于技术的限制,部分原因是由于这样的事实:除了通过检查最近的构建元数据之外,没有任何静态作业配置可以实现这一点。

但它也提供了解决方法:

只要解决方案还在进行中,我在这里包括我们的解决方法。它基于rtp (Rich Text Publisher) plugin,您应该已经安装它以使其正常工作:

在我们的Jenkins文件的末尾,在触发作业之后,我们等待它完成。在这种情况下,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,使其无法工作流程参与上游/下游关系(在需要工作链的情况下,例如由于安全限制)。

它指基于另一个(未回答)Stack Overflow question的RFE(请求增强)JENKINS-37718

7

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

此外,与问题无关但与手头问题有关,请确保您始终在jenkins机器上始终有至少一个免费的执行程序,因为等待语法会占用一个线程用于等待作业,另一个用于等待的工作,你可以很容易地发现自己处于资源匮乏的情况。

希望这会有帮助

+0

那么我提到的错误在这里不适用?无论如何。 – VonC