【问题标题】:Jenkins and Maven profilesJenkins 和 Maven 配置文件
【发布时间】:2016-07-11 06:21:48
【问题描述】:

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

我们最初计划为此目的使用 jenkins 和 sonarqube。让我从要求开始。

  • 目前该项目被细分为多个项目(不是模块)
  • 我们必须遵循这个构建结构,因为没有计划将其重新组织为单个多模块 maven 项目
  • 目前手动管理构建和依赖项

例如:项目被细分为 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 文档,我们正在考虑使用“参数化构建插件”和“扩展选择参数插件”的参数化构建,借助这些插件,我们能够参数化配置文件名称。但在每次构建之前,构建器等待配置文件参数。

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

    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).

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

谢谢, 圣

【问题讨论】:

    标签: java maven jenkins build devops


    【解决方案1】:

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

    在 Jenkins 中实现某个目标通常有多种方法,每种方法都有其优点和缺点。选择最合适的解决方案取决于具体要求和您的环境/设置。

    但是,您首先需要一些可以正常工作的东西,然后您可以对其进行改进。

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

    一切尽在一份工作中

    • 配置您的 subversion 存储库(可以有多个)以检出到您的工作区中
    • 启用轮询 SCM 触发器
    • 通过 Execute shell 构建步骤构建您的模块/项目。 (可以通过在 Execute shell 构建步骤上使用 Exit 1 将失败的构建传递给作业结果。)

    但是请记住,这将阻止基于每个项目/模块的高级功能,例如向开发人员发送邮件通知应归咎于此。或指标趋势,如警告或静态代码分析。

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

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

    • 使用构建步骤触发/调用其他项目上的构建来构建A,归档所需的工件
    • 使用构建步骤在其他项目上触发/调用构建带有一些参数tomcat来构建B tomcat版本,使用Copy Artifact PluginA复制jar
    • ...
    • 使用构建步骤在其他项目上触发/调用构建并带有一些参数tomcat来构建E tomcat版本。使用 Copy Artifact Plugin 复制所有需要的工件,如果需要工件,可以在此处指定参数,即 B tomcat 版本

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

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

    或者更优雅:在您的 svn 上使用 post-commit 钩子(参见 here,Post-comit 钩子部分)来通知 jenkins 更改。

    编辑: 对于未来,值得研究 Pipeline Plugindocumentation 以获得更复杂的构建,这是即将推出的 jenkins 2.0 版的引擎,请参阅 here

    【讨论】:

      【解决方案2】:

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

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

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

      对于D,我会先构建C,然后构建D

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

      【讨论】:

        【解决方案3】:

        编辑: Jenkins 2 已经发布,并且内置了对 pipelines 的支持。


        针对您的要求的几点建议:

        1. “如果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. “保持项目之间的依赖关系”

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

            这里有很多要解释的,所以最好自己阅读。你可以开始here

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

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

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

        3. 自动化参数化构建:“使用 tomcat 配置文件和 websphere 配置文件构建”

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

        额外提示:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2014-03-26
            • 2013-09-20
            • 1970-01-01
            • 1970-01-01
            • 2017-10-03
            • 2012-09-16
            • 1970-01-01
            • 2011-06-07
            • 2018-01-12
            相关资源
            最近更新 更多