本文“定义共享库”不是“如何编写共享库”,而是:如何配置 Jenkins 来加载某个共享库,以便在 Jenkinsfile 中引用。
共享库的组成
共享库由三部分组成:(1)共享库名称;(2)源码取回方式;(3)可选的版本
共享库名称(Name)
共享库名称是共享库的简短标识,每个共享库都具有自己的名字。在 Jenkinsfile 中,将通过该名称引用特定的共享库。
源码取回方式(Retrieval method)
共享库保存在单独的仓库中,在执行之前需要先通过 SCM 取回。指定 SCM 的最佳方法是使用 SCM Plugin,那些插件经过专门更新以支持“用于检出任意命名版本的”新 API(使用 Modern SCM 选项)。目前 GIT 和 SVN 支持该模式。
如果你使用的 SCM Plugin 尚未集成,可以选择 Legacy SCM 选项,并选择所提供的任何内容。在这种情况下,需要在 SCM Plugin 的配置中包含$ {library.yourLibName.version},以便在检出时 SCM Plugin 将扩展此变量以选择所需的版本。例如对于 Subversion 插件,可以将存储库 URL 设置为svnserver/project/${library.yourLibName.version},然后使用trunk或branches/dev或tags/1.0等版本。
可选的版本(Default version)
从仓库中取回共享库时,可以指出特定版本。”可选的版本“可以是能够被 SCM 识别的任何东西(比如 GIT 的分支,标签,提交等等)。你也可以声明脚本是否需要明确要求该库,或在默认情况下是否存在。此外如果在 Jenkins 配置中指定某个版本,可以防止脚本使用其他版本。
全局的共享库
在何处配置:Manage Jenkins » Configure System » Global Pipeline Libraries。
可以在多出定义共享库,取决以使用场景。
该共享库是全局的,在系统中的任何 Pipeline 可以使用该库中实现的功能。
这些库被视为可信的,他们可以运行在 Java、Groovy、Jenkin 内部 API、Jenkins 插件、第三方库中的任何方法。可以使用该特性将不安全的 API 封装在高级的包装器中,以便在任何 Pipeline 中使用。任何可以推送代码到该共享库的成员可以获得访问 Jenkins 的无限权限。需要 Overall/RunScripts 权限来配置这些共享库,通常管理员具有该权限。
文件夹层级的共享库
在何处配置:在特定项目中进行配置。
创建的任何文件夹都可以具有与之关联的共享库。此机制允许将特定库的范围限定为文件夹或子文件夹内的所有 Pipeline。
基于 Folder(文件夹)的库不被视为“受信任”,它们在 Groovy Sandbox 中运行,就像典型的 Pipeline 一样。
自动的共享库
其他插件可能会添加“定义动态定义库的”方法。例如 GitHub Branch Source 插件提供了一个 GitHub Organization Folder 项,该项允许脚本使用不受信任的库,例如 github.com/someorg/somerepo,无需任何其他配置。在这种情况下,从 master 分支加载指定的 GitHub 存储库,使用匿名检出。
参考文献
Extending with Shared Libraries