2017-02-21 83 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