沙盒 Maven 建立在 Jenkins 之上

Sandboxed Maven builds on Jenkins

我正在尝试为以下难题找到解决方案。我有 java 个项目,由 maven 管理,需要一些本机依赖项才能工作(运行 单元和集成测试)。这些以 deb 包的形式提供,需要在 运行 构建之前安装。

我将 Jenkins 用于 CI。本机依赖项不能安装在 Jenkins 节点上,因为与其他构建冲突并且它们经常更改。我现在做的不是创建 Jenkins 作业类型 'maven',而是 'freestyle' 并使用 pbuilder 创建一个干净的沙箱,安装所有必要的东西并调用 maven 构建。

这工作得很好,但我失去了 Jenkins maven 的好东西,比如自动上游项目、依赖项更改时触发构建等。Jenkins 根本不知道 maven 在那里。

最后,我的问题。有没有一种方法可以同时实现两者,隔离构建以便安装的库不会影响其他构建并利用 Jenkins 的 'magic' 应用于 Maven 构建及其依赖项?

您可以将构建分为三个作业,这会触发下一个作业。

  1. 创建所需的环境
  2. 运行 maven 作业
  3. 清理

考虑 docker。在那里,您可以 运行 根据需要在隔离环境中进行处理。 Docker 以一种可以轻松与 Jenkins 通信的方式工作。

作为一个好处,您还可以使用该 docker 容器在与 运行 在 Jenkins 中相同的环境中 运行 本地构建。

即使是 Freestyle 工作也有 "Invoke top-level Maven targets"。您可以使用它来获得 "maven goodies",同时还可以 运行 其他构建步骤。

"use private Maven repository" 有一个选项可确保它将使用相对于工作区的 .m2/repository 文件夹位置。如果您需要分成多个作业,可以在这些作业之间使用 "Custom/shared workspace"。

即使在 Maven 风格的作业中,也有使用私有存储库的选项,这样一个作业就不会影响另一个作业。

问题可以通过使用分布式 Jenkins 构建来解决。从属代理可以配置为为每个构建提供干净的环境(例如通过 VM,docker,...)并在构建完成后将其拆除。这样 Jenkins 作业可以是 Maven 类型,并且预构建步骤所做的任何更改都不会影响其他作业。

可以找到更多信息 here