2017-02-21 85 views
5

我有很多的共享相同的基本CI的工作流程,我可以轻松地表达为声明管道不同的存储库的项目共用一个声明管道:如何跨多个项目

pipeline { 
    agent any 

    options { 
    buildDiscarder(logRotator(numToKeepStr: '20')) 
    } 

    stages { 
    stage('CI') { 
     steps { 
     echo 'Do CI' 
     } 
    } 

    stage('QA') { 
     steps { 
     echo 'Do QA' 
     } 
    } 
    } 

    post { 
    always { 
     junit allowEmptyResults: true, testResults: '**/target/surefire-reports/TEST-*.xml' 
     // etc... 
    } 

    failure { 
     echo 'Failure mail' 
     // etc 
    } 
    } 
} 

我想在我的所有项目中使用相同的声明式管道,并且能够在一个地方更改管道定义,并自动在所有项目中使用这些更改。

从本质上讲什么,我会在一个项目做; S Jenkinsfile是这样的:

loadPipelineFromScm 'repository', 'pipeline.groovy' 

我已经可以与共享库做到这一点,但后来我不能再使用声明管道功能。

有没有办法共享一个声明式跨多个存储库的流水线?

+0

你确定一个声明管道不能在共享库工作? [声明式管道:通知和共享库文档](https://jenkins.io/blog/2017/02/15/declarative-notifications/)似乎正在做这件事。你不能做类似的事吗? – herm

回答

0

我一直在为自己的工作处理同样的问题。我能想出是最好的解决方案包括:通用 Jenkinsfile在我的组织中的每个项目/回购:

node 
{ 
    checkout([$class: 'GitSCM', branches: [[name: env.DELIVERY_PIPELINE_BRANCH]], userRemoteConfigs: [[credentialsId: env.DELIVERY_PIPELINE_CREDENTIALS, url: env.DELIVERY_PIPELINE_URL]]]) 
    stash includes: '*.groovy', name: 'assets', useDefaultExcludes: false 
    load './Jenkinsfile.groovy' 
} 

我用的环境变量的情况下,事情需要改变,也许这甚至比更具活力的我示例电流(无论如何,这一切仍在开发中)。

然后,隐藏用于保存稍后使用的其余groovy脚本,并在声明式管道中将它们除去。

最后加载声明性流水线。不要混淆意见,基本上所有的行为都是正常的。

所以这不是你正在寻找的东西,我宁愿有能力从SCM首先拉出来。但是,嘿,它暂时对我来说已经足够好了。

1

尽管使用noober01的建议保留了视图,但声明性管道将无法正常工作。例如。 when子句将被忽略,因为pipeline元素预计是顶级的,这意味着它被解析为脚本管道。

见后面詹金斯球队拒绝了以下问题:loading external declarative pipelines issue