现在正在编写我的第6或第7个Jenkins脚本-我已经注意到它们共享一些代码(本质上只是一遍又一遍地使用相同的groovy子例程)。我不想继续这样做,而是想学习一些最佳实践。似乎"共享图书馆"都是该做的事。(或者当您只想共享groovy代码而不是脚本步骤等时,是否有更好的方法?)
这些脚本是更大的repo(包含整个项目的源代码,包括其他脚本)的一部分,存储在子文件夹Jenkins/Library
中,结构如下:
Jenkins/Library
+- vars
| common_code.groovy
只有一个vars
文件夹,没有src
。文档说
对于只定义全局变量(vars/)的共享库,或者只需要全局变量的Jenkinsfile,注释模式@Library('my-shared-library') _可能有助于保持代码简洁。实际上,没有注释不必要的import语句,而是注释了符号_。
所以我得出结论,我不需要src
文件夹,可以单独使用vars
。
该库可通过"Configure jenkins"获得。比;全局管道库将SourcePath设置为"/Jenkins/Library/
";和语句@Library('{name}') _
一起作为脚本的第一行。
然而,当尝试使用库时,我得到主题中显示的错误。有什么问题吗?(我已经搜索了周围,发现了这个问题的实例,但这似乎不适合我的问题-除非我误解了什么。)
要指定库的名称,您应该在jenkins设置中设置相同的名称:
名字.您为这个库选择的标识符,将在@Library中使用注释。环境变量库。this_name。版本将还要设置为为构建加载的版本(无论它来自这里的默认版本,或者来自@后面的注释分离器)。
在@Library()
里面的'{name}'
参数意味着你应该添加一个同名的库。因为它不像"${name}"
那样是一个变量,CC_10不是一个内置变量,没有定义。
如果你想设置你的库与你的jenkins管道相同的名字,你可以使用env.JOB_NAME
变量,或者检查所有的环境和预定义变量:
println env.getEnvironment()
或者只检查作业参数:
println params
现在一步一步的说明:
创建您的库,例如从Git SCM中创建,如图所示。
将库代码放到项目中,例如:
<project_root_folder>/vars/common_code.groovy
。您不需要额外的路径Jenkins/Library
。此外,你还将文件命名为'snake case'风格,这在groovy中并不常见:
var目录包含定义全局变量的脚本可从Pipeline访问。每个*的基本名称。Groovy文件应该是Groovy (~ Java)标识符,常规为
camelCased
。
你的文件在'camel case'
- 编写库代码:
// vars/commonCode.groovy
// Define your method
def call() {
// do some stuff
return 'Some message'
}
- 编写您的管道。脚本化管道示例:
#!/usr/bin/env groovy
// yourPipeline.groovy file in your project
@Library('jenkins-shared-library') _
// Get the message from the method in your library
def messageText = commonCode() as String
println messageText
如果你想定义一些全局变量,这个答案也可以帮助你。
PS:使用'vars'文件夹允许你从vars中加载所有内容在同一时间文件夹一次。如果您希望动态加载,请使用import fromsrc文件夹。