Jenkins 和 Maven 配置文件

Jenkins and Maven profiles

我们正在处理遗留项目,第一项任务是为其设置 DevOps。 重要的是我们对这个领域还很陌生。

我们计划最初使用 jenkins 和 sonarqube。先说要求吧。

例如:项目被细分为5个多模块的maven项目, 说 A、B、C、D 和 E

        1. A and C are completely independent and can be easly built
        2. B depends on the artifact generated by A (jar) and has multiple maven profiles (say tomcat and websphere, it is a webservice module)
        3. D depends on the artifact generated by C 
        4. E depends on A, B and D and has multiple maven profiles (say tomcat and websphere, it is a web project)

根据 jenkins 文档来处理这种情况,我们正在考虑使用“参数化构建插件”进行参数化构建,并且 "extended choice parameter plugin" 在这些插件的帮助下,我们能够参数化配置文件名称。但是在每个之前构建,构建器等待配置文件参数。

所以我们仍在寻找一个好的解决方案

    1. keep the dependency between projects an built the whole projects if there is any change in SCM (SVN). For that we are used "Build whenever a SNAPSHOT dependency is built" and "SCM polling option". Unfortunately this option seems not working in our case (we have given an interval of 5 min for scm polling but no build is happening based on test commits)

    2. Even though we are able to parameterize the profile, this seems as a manual step (is there an option to automate this part too, ie. build with tomcat profile and websphere profile should happen sequentially).

我们正在努力寻找满足所有这些核心需求的解决方案。任何指针将不胜感激。

谢谢, 三

我的 maven 知识有限,但是由于您还没有得到任何回复,我将尝试提供一些一般性建议。

在 Jenkins 中通常有多种方法可以达到某个目标,每种方法各有利弊。选择最合适的解决方案取决于具体要求和您的 environment/setup.

但是,您首先需要的是能正常工作的东西,然后再对其进行改进。

您可以通过以下方式快速获得结果

一份工作的一切

  • Configure your subversion repo (Multiple are possible) to be checked out into your workspace
  • Enable Poll SCM trigger
  • Build your modules/projects via Execute shell build steps. (Failed builds can be handed to the job result by using Exit 1 on a Execute shell Build step.)

但是请记住,这将阻止每个 project/module 的高级功能,例如向开发人员发送邮件通知。或指标趋势,如警告或静态代码分析。

以下解决方案更容易朝那个方向扩展。

围绕您的各种构建作业的包装作业

  • Use Build step Trigger/call builds on other projects to build A, archive needed artifacts
  • Use Build step Trigger/call builds on other projects with some parameter tomcatto build B tomcat version, use Copy Artifact Plugin to copy over jar from A
  • ...
  • Use Build step Trigger/call builds on other projects with some parameter tomcatto build E tomcat version. Use Copy Artifact Plugin to copy all needed artifacts, you can specify parameter there if you need artifact of i.e. B tomcat version

在此设置中,监控 svn 是一个问题,因为如果您从轮询 SCM 触发它,它会在您的包装器工作区中检出它,而您实际上不需要它检出,而是在您的构建作业中检出。

可能的解决方案:在包装器作业和您的构建作业之间共享工作区,这样构建作业中的重复签出将找到已经在正确修订版中的文件。然而,你*需要+确保下游作业在同一台机器上执行(有插件可以这样做)

或者更优雅:使用 post-commit hook(参见 here,第 Post-comit hook) svn 通知詹金斯变化。

编辑: 对于未来,Pipeline Plugin and its documentation for more complex builds, this is the engine for the upcoming jenkins version 2.0, see here.

值得关注

我会为 ABCDE 创建 5 个不同的工作。

正如你提到的 A 和 C 将是独立的工作,所以我会根据你的需要做 mvn clean install/pkg/verify。

对于 B,我会先构建 A,然后在构建中调用另一个 Maven 目标来构建 B

对于D,我会先构建C再构建D

最后,对于 E,我将调用顶级 mvn 目标 5 次 A、B、C、D,最后是 E

编辑: Jenkins 2 已发布并内置了对 pipelines.

的支持

针对您的要求的几点说明:

  1. "built the whole projects if there is any change in SCM"

    • 虽然 Poll SCM 通常需要较少的工作,但正确的方法是使用 SVN 挂钩。

      解决方法如下:

      • 首先启用 Trigger builds remotely 功能并在 Authentication Token 中输入一个随机令牌。
      • 这允许您使用 Jenkins REST 远程触发构建 API (http[s]://JENKINS_URL/job/BUILD_NAME/build?token=TOKEN)
      • 然后您创建一个 SVN 挂钩(一个在您提交时运行的脚本),它通过向 URL 发送请求来触发构建(使用 curl、wget、python,...).

        有很多关于如何创建 SVN 钩子的手册,这里是 first result on "SVN Hooks" from Google.

  2. "keep the dependency between projects"

    • 我会分别为每个项目创建不同的 Jenkins Job,然后确保构建按要求的顺序执行。
    • 我认为订购构建(依赖项)的最佳方式是使用 Pipeline Plugin(以前称为工作流插件)创建 Build Pipeline

      这里要解释的东西很多,还是自己看吧。你可以开始 here.

      还有其他(更简单的)解决方案,例如 Build Flow Plugin or Parameterized Trigger Plugin 可以帮助在构建之间创建依赖关系,但我认为 Pipeline 是最新的并且被认为是最佳实践(它绝对是最先进的解决方案)。

      不过,话虽如此,如果您觉得 Pipeline 对您来说太过分了,请选择其他选择。

    • 我建议确保每个构建都对同一个本地存储库执行 mvn install,并将工件部署到 Artifactory(希望你有一个)。

  3. 自动参数化构建:"build with tomcat profile and websphere profile"

    • 为此,您需要创建 parameterized builds
    • 这很容易做到,您只需在构建配置中检查 This build is parameterized 并添加一个 MVN_PROFILE string/choice 参数。
    • 之后,您可以使用上一个项目符号中提到的任何一个插件,使用不同的参数多次触发每个构建。

额外提示:

在解决这个问题时,考虑使用 Job Configuration History Plugin,它可以帮助查看和恢复对配置所做的更改。

祝你好运,希望对你有所帮助:)

我会考虑一些不同的方法来完全分离项目。 如果你能够创建你的内部工件,那么我会考虑在 Maven 中构建每个依赖项作为第三方库,就像你正在使用的任何其他外部库一样。 这样,每个这样的项目都可以单独构建并存储在工件中,当构建依赖项目时,它将只采用 pom 文件中提到的正确版本。 这样,您将对每个项目都有不同的构建过程,并且只会构建相关项目(相关 = 已更改)。