2016-08-01 38 views
19

我正在考慮最近使用Jenkins管道腳本,一個問題是,我不明白一個聰明的方式來創建內部可重用的utils代碼,想象一下,我有一個共同的功能helloworld這將是被大量的管道工作所使用,所以我希望創建一個utils.jar可以將它注入到作業類路徑中。創建可重用的詹金斯管道腳本

我發現詹金斯有與global library類似的概念,但我對此插件的擔憂:

既然是一個插件,所以我們需要安裝/通過詹金斯插件管理器升級,那麼它可能需要重新啓動應用更改,這不是我想看到的,因爲utils可能會更改,總是添加,我們希望它可以立即可用。

其次,它是官方jenkins共享lib,我不想(或他們不會適用我們)把私人代碼放入jenkins回購。

任何好主意?

+0

我不明白你的_Secondly .._句子。 – StephenKing

+0

答案在這裏應該清楚,但這個博客也可能是非常有用的:https://lvthillo.com/reusable-jenkins-pipeline-for-maven-jobs/ – DenCowboy

回答

26

Shared Librariesdocs)允許您使代碼可以被所有管道腳本訪問。你不必爲此創建一個插件,你不必重新啓動Jenkins。

E.g.這是調用該通用功能的my librarythis a Jenkinsfile


編輯(2017年2月): 庫可以通過Jenkins的內部GIT中服務器的 詹金斯用戶的主目錄內被訪問的,或通過其他方式部署(例如,經由廚師)到 workflow-lib/目錄。 (仍然可能,但非常不方便)。

全局庫可以通過以下方式進行配置:

  • 一個@Library('github.com/...')註釋在Jenkinsfile指向共享庫回購的URL。
  • 在Jenkins作業的文件夾級別配置。
  • 在詹金斯配置中配置爲全局庫,優點是代碼是可信,即不受腳本安全性的限制。

第一個和最後一個方法的組合將是一個沒有明確加載的共享庫,那麼只有在Jenkinsfile使用其名稱要求:@Library('mysharedlib')

+0

哈,非常好的解釋,如果是這樣的話,那麼這正是我想要的。 – Tim

+0

情況就是這樣:-)你可以在https://github.com/TYPO3-cookbooks/看看所有的回購站,他們都使用只包含對管道的調用的'Jenkinsfile'。 – StephenKing

+0

我會的確如此。 – Tim

1

這裏是我們目前使用的以重複使用Jenkinsfile代碼的解決方案:

node { 

    curl_cmd = "curl -H 'Accept: application/vnd.github.v3.raw' -H 'Authorization: token ${env.GITHUB_TOKEN}' https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t 
    sh "${curl_cmd}" 
    load 'Jenkinsfile.tmp' 

} 

我可能是有點難看,但它工作realiably並且除了它也使我們能夠將共享代碼之前或之後的一些存儲庫特定代碼。

+0

由於您的'Jenkinsfile.tmp'腳本似乎被簽出到Git倉庫,您可能只需使用基本的git/scm簽出步驟來加載腳本,而不是執行手動捲曲。 – Pom12

+0

如果這可以讓我從存儲庫中檢出單個文件,那就太棒了。但是,如果這將檢查整個存儲庫,它顯然不會是需要的東西,因爲這個回購可能非常大。 – sorin

+0

在這種情況下,另一種可能性可能是將您的'Jenkinsfile.tmp' Git回購作爲自由式Jenkins作業檢查,只是定期對您的Git回購進行輪詢,然後從其他工作區中加載您的Jenkins文件。 – Pom12

7

根據您計劃重複使用代碼的頻率,您還可以加載一個函數(或一組函數)作爲另一個管道的一部分。

{ 
    // ...your pipeline code... 

    git 'http://urlToYourGit/projectContainingYourScript' 
    pipeline = load 'global-functions.groovy' 
    pipeline.helloworld() // Call one of your defined function 

    // ...some other pipeline code... 
} 

相比StephenKing的一個這種解決方案可能顯得有點繁瑣,但我喜歡這個解決方案是我的全局函數都致力於爲Git和任何人都可以很容易地修改它們沒有(幾乎)所有詹金斯的知識,僅僅是Groovy的基礎知識。

在Groovy腳本中您的代碼是load,請確保在最後加上return this。這將允許您稍後撥打電話。否則,當您設置pipeline = load global-functions.groovy時,該變量將被設置爲null

+0

我們正在通過Chef自動從Github更新'$ JENKINS_HOME/workflow-lib /'目錄。你也可以通過Cron工作做到這一點。我也不喜歡Jenkins的內部僞git服務器。 – StephenKing

+1

記得在你的共享groovy腳本的末尾添加'return this'。看看這個答案http://stackoverflow.com/questions/37800195/how-do-you-load-a-groovy-file-and-execute-it –