2016-08-01 75 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 –