【发布时间】:2018-02-23 03:09:24
【问题描述】:
TL;DR 有没有办法将代码导入到Jenkinsfile 从本地 存储库(load 步骤除外)?
为什么?
我已经体验到,对于复杂的构建,Jenkinsfile 会变得有点笨重且不太易于维护。
既然构建工作是代码,那么拥有与其他代码相同的方法会很棒。
也就是说,我想把它分成更小(更易于维护)的单元并单元测试它们。
我尝试了什么
-
shared libraries:允许将我们的 Jenkins 流水线逻辑划分为单独模块中的较小文件,甚至对其进行单元测试。
但是,它们需要位于不同的存储库中,并且(如果不在 GitHub 上)必须配置到 Jenkins 中。 -
loadStep:允许从存储库加载 groovy 脚本。
但是,这些文件必须是脚本而不是“完整”的 groovy 类,因此很难拥有多个相互依赖的文件或类。例如继承是不可能的。
此外,这些文件在 Jenkins 作业上执行 replay 时不会显示,这使得它们难以开发和调试。
我的问题
- 有没有办法(或解决方法)在与
Jenkinsfile相同的存储库中创建共享库并将此库导入Jenkinsfile? - 或者还有其他我还没有尝试过的方法吗?
示例目录结构
类似于为shared libs 描述的目录结构我希望在单个存储库中拥有以下内容。
(root)
+- someModule
| +- ...
+- jenkins # Classes/Scripts used by Jenkins in a separate module
| +- src # Groovy source files
| +- org
| +- foo
| +- Bar.groovy # for org.foo.Bar class
| +- test # Groovy test files
| +- org
| +- foo
| +- BarTest.groovy # Test for org.foo.Bar class
| +- pom.xml or build.groovy # Build for local library
+- Jenkinsfile # Build "someModule", uses classes from "jenkins" module
【问题讨论】:
-
"共享库...需要在不同的存储库中,并且(如果不在 GitHub 上)必须配置到 Jenkins 中。"为什么这是个问题?共享库是跨管道重用代码的标准方式,您可以拥有纯 groovy 代码,用 Spock 对其进行测试,它对我很有效。
-
@Boris 我的用例实际上不是在项目之间共享它,而是将一个
Jenkinfile分成更小的(更易于维护)的单元并在在一个项目中对它们进行单元测试 ,即Jenkinsfile的“下一个”。 -
如果你愿意,你可以将你的 Jenkinsfile 和你的共享库放在同一个 repo 中,然后导入它。我已经这样做了,您仍然需要在 Jenkins 中配置共享库(我也不明白为什么会出现问题)。
-
@Boris 配置共享库只是一个不必要的配置步骤。不是每个人都对他的 Jenkins 实例拥有管理权限。另见icoanel's answer
-
另一种情况是当您想在不污染公共和共享存储库的情况下测试此功能。
标签: jenkins groovy shared-libraries jenkins-pipeline