【问题标题】:Maven build microservice with lib in another repositoryMaven 在另一个存储库中使用 lib 构建微服务
【发布时间】:2020-03-08 06:25:59
【问题描述】:

我们在独立的 git 存储库中有 spring 微服务。这些微服务使用共享库,它也是独立的存储库。该库在 pom.xml 中用作依赖项中的工件。 你能告诉我如何配置 jenkins 以首先使用该库构建任何微服务吗?这个库应该作为构建任何微服务的先决条件而构建,但我不知道如何管理它。

我们应该在 maven 中还是在 jenkins 中处理它?谢谢你的建议。

【问题讨论】:

  • 为什么每次在任何服务之前都需要构建它?图书馆真的经常更换吗?
  • @IvanLymar 不太常见,但可能会发生变化,取决于服务。所以在我看来应该是先建的。过去我们将所有服务和库都放在一个 git 存储库中,所以我们需要在第一时间解决这个问题:/

标签: java maven jenkins microservices pom.xml


【解决方案1】:

我假设您正在为 CI/CD 使用 jenkins 管道。所以在任何情况下,您都必须创建两个 jenkins 管道,第一个用于构建您的库,第二个用于构建您的微服务。

我会怎么做:

1) 提交代码到库

2) 已触发库构建并生成了新的工件版本。

3) 生成的 lib 工件的复制版本

4) 更改服务中的 pom 文件并提交。

5) 正在使用新的 lib 版本构建微服务。

这种方法不是完全自动化的,但非常简单。由于您很少更改库,因此手动设置库版本非常好。

我尝试将其自动化的方式以及我们需要解决的问题:

  • 在服务构建之前运行 lib 构建。

    我们将为每次提交到 lib git repo 触发 lib build。所以你不必重新构建它。

  • 获取库触发的构建版本并使用新版本更新微服务 pom 文件

    在 lib 构建期间,您可以将 lib 版本号附加到 jenkins 构建信息(例如构建显示名称)。然后在微服务构建期间提取此信息。获得编号后,您可以更新您的 pom 文件并开始构建。

我看到的唯一优点是您不需要手动设置 lib 版本。它将从 lib 作业结果中提取。

缺点:

  • 复杂的构建
  • 无法控制构建版本更新(它会一直拉取最新版本,除非您创建某种机制来决定是否要保留现有的 lib 版本 -> 更复杂的构建)

    李>
  • 本地构建的问题,因为 GIT 中的版本和 jar 的实际版本不同(因为您在 jenkins 工作期间即时更新它,除非您将直接从 jenkins 提交版本更新更改 -> 复杂构建)。

【讨论】:

    【解决方案2】:

    如果您在开发阶段使用公用库的 SNAPSHOT 版本,则无需为库中的每次更改都使用公用库版本更新微服务 pom。 Maven 可以每次从远程存储库中根据时间戳检索最新版本的 SNAPSHOT(例如-U 命令行选项,或默认每天一次)。在创建发布分支时,移除 SNAPSHOT 并使用公共库的发布版本更新微服务 pom。

    【讨论】:

      【解决方案3】:

      (不直接回答问题,而是提供指导)

      您确实需要将您提到的每个组件都视为具有自己生命周期的独立工件。这包括共享库。

      Maven 和 Jenkins 分别在不同的级别管理构建过程。两者都用于确保构建过程的完整性和一致性。

      在 Jenkins 中构建您的共享库,作为 maven 工件,使用 pom 和版本,smae 作为您的微服务。您可以开发为 SNAPSHOT,但您需要将其部署到工件存储库(ArtifactoryNexus 3or 2 (if just maven) 等),最终使用可靠的发布版本(semantic versioning,而不是 SNAPSHOT)。您也可以在管道中完成所有这些工作,最终目标是发布到工件 repo,而不是 PRod。

      您的每个微服务都应该使用库的已知版本(solid ver. #),就像使用任何其他第三方库一样。

      开发、测试和发布(到您的工件存储库)您构建的共享库。然后在微服务中增加显式依赖。

      在 Jenkins 中进行所有构建。使用maven-release-pluginNexus 3 webhooksJenkins pipelines 实现自动化取决于您。等等

      您不太可能在新共享库的每个版本上同时重建和重新部署所有微服务 - 听起来太单一了。如果您在部署的工件(尤其是生产环境)中没有显式版本的共享库,您将为自己陷入蜘蛛网的泥潭并更新微服务。

      您可以设置一个在增量共享库发布时触发的新作业,将所有使用者准备为 SNAPSHOT,增加引用依赖,将其提交到各种 git 存储库,然后触发新管道执行以构建微服务。这一切都取决于您的系统有多么复杂和庞大,您更新和发布的频率以及您可以使用的工具和资源。 YMMV。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-05
        • 2019-09-11
        • 1970-01-01
        • 2018-10-25
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 2018-03-04
        相关资源
        最近更新 更多