Maven 在另一个存储库中使用 lib 构建微服务
Maven build microservice with lib in another repository
我们在单独的 git 存储库中有 spring 个微服务。这些微服务使用共享库,它也是独立的存储库。这个库在 pom.xml 中的依赖项中用作工件。
你能告诉我如何配置 jenkins 以首先使用该库构建任何微服务吗?这个库应该作为构建任何微服务的先决条件来构建,但我不知道如何管理它。
应该用maven还是jenkins来处理?谢谢指教。
我假设您正在为 CI/CD 使用 jenkins 管道。因此,在任何情况下,您都必须创建两个 jenkins 管道,第一个用于构建您的库,第二个用于构建您的微服务。
我的做法:
1) 将代码提交到库
2) 触发了库构建并生成了新的工件版本。
3) 生成的 lib 工件的复制版本
4) 在服务中更改 pom 文件并提交。
5) 正在使用新的库版本构建微服务。
这种方法不是完全自动化的,但非常简单。由于您很少更改库,因此手动设置库版本非常好。
我尝试自动化的方式和我们需要解决的问题:
运行 在服务构建之前构建库。
我们将在每次提交到 lib git 存储库时触发 lib 构建。所以你不必再次构建它。
获取库触发构建版本并使用新版本更新微服务 pom 文件
在 lib 构建期间,您可以将 lib 版本号附加到 jenkins 构建信息(例如构建显示名称)。然后在微服务构建期间提取此信息。获得编号后,您可以更新 pom 文件并开始构建。
我看到的唯一优点是您不需要手动设置库版本。它将从 lib 作业结果中提取。
缺点:
- 复杂的构建
无法控制构建版本更新(它将一直拉取最新版本,除非您创建某种机制来决定是否要保留现有的 lib 版本 -> 更复杂的构建)
本地构建的问题,因为 GIT 中的版本和 jar 的实际版本不同(因为你在 jenkins 作业期间动态更新它,除非你将提交版本更新从 jenkins 更改 -> complicted build).
如果您在开发阶段使用公共库的 SNAPSHOT 版本,则无需为库中的每个更改持续使用公共库版本更新微服务 pom。 Maven 每次都可以根据时间戳从远程存储库中检索最新版本的 SNAPSHOT(例如 -U
命令行选项,或者默认情况下每天一次)。在创建发布分支时,删除 SNAPSHOT 并使用公共库的发布版本更新微服务 pom。
(不直接回答问题,只提供指导)
您确实需要将您提到的每个组件都视为具有自己生命周期的独立工件。这包括共享库。
Maven 和 Jenkins 分别在不同的级别管理构建过程。两者都用于确保构建过程中的完整性和一致性。
在 Jenkins 中构建您的共享库,作为一个 maven 工件,带有 pom 和版本,smae 作为您的微服务。您可以开发为 SNAPSHOT,但您需要将其部署到工件存储库(Artifactory, Nexus 3, or 2 (if just maven), etc.), ultimately with a solid release version (semantic versioning,而不是 SNAPSHOT)。您也可以在管道中执行所有这些操作,最终目标是发布到工件存储库,而不是 PROd。
您的每个微服务都应该使用库的已知版本(solid ver.#),就像您使用任何其他第三方库一样。
开发、测试并发布(到您的工件存储库)您构建的共享库。然后增加微服务中的显式依赖。
在 Jenkins 中完成所有构建。这取决于您有多少想要使用 maven-release-plugin, Nexus 3 webhooks, and Jenkins pipelines 实现自动化。等等
您不太可能在每次发布新共享库时同时重建和重新部署所有微服务 - 听起来太单一了。如果您在部署的工件(尤其是生产工件)中没有共享库的显式版本,您将给自己设置一个蜘蛛网泥潭并更新微服务。
您可以设置一个新作业,该作业在发布增量共享库时触发,将所有消费者准备为 SNAPSHOT,提高引用依赖性,将其提交给各种 git 回购协议,然后反过来触发新的管道执行来构建微服务。这完全取决于您的系统的复杂程度和规模、更新和发布的频率以及您可以使用的工具和资源。 YMMV.
我们在单独的 git 存储库中有 spring 个微服务。这些微服务使用共享库,它也是独立的存储库。这个库在 pom.xml 中的依赖项中用作工件。 你能告诉我如何配置 jenkins 以首先使用该库构建任何微服务吗?这个库应该作为构建任何微服务的先决条件来构建,但我不知道如何管理它。
应该用maven还是jenkins来处理?谢谢指教。
我假设您正在为 CI/CD 使用 jenkins 管道。因此,在任何情况下,您都必须创建两个 jenkins 管道,第一个用于构建您的库,第二个用于构建您的微服务。
我的做法:
1) 将代码提交到库
2) 触发了库构建并生成了新的工件版本。
3) 生成的 lib 工件的复制版本
4) 在服务中更改 pom 文件并提交。
5) 正在使用新的库版本构建微服务。
这种方法不是完全自动化的,但非常简单。由于您很少更改库,因此手动设置库版本非常好。
我尝试自动化的方式和我们需要解决的问题:
运行 在服务构建之前构建库。
我们将在每次提交到 lib git 存储库时触发 lib 构建。所以你不必再次构建它。
获取库触发构建版本并使用新版本更新微服务 pom 文件
在 lib 构建期间,您可以将 lib 版本号附加到 jenkins 构建信息(例如构建显示名称)。然后在微服务构建期间提取此信息。获得编号后,您可以更新 pom 文件并开始构建。
我看到的唯一优点是您不需要手动设置库版本。它将从 lib 作业结果中提取。
缺点:
- 复杂的构建
无法控制构建版本更新(它将一直拉取最新版本,除非您创建某种机制来决定是否要保留现有的 lib 版本 -> 更复杂的构建)
本地构建的问题,因为 GIT 中的版本和 jar 的实际版本不同(因为你在 jenkins 作业期间动态更新它,除非你将提交版本更新从 jenkins 更改 -> complicted build).
如果您在开发阶段使用公共库的 SNAPSHOT 版本,则无需为库中的每个更改持续使用公共库版本更新微服务 pom。 Maven 每次都可以根据时间戳从远程存储库中检索最新版本的 SNAPSHOT(例如 -U
命令行选项,或者默认情况下每天一次)。在创建发布分支时,删除 SNAPSHOT 并使用公共库的发布版本更新微服务 pom。
(不直接回答问题,只提供指导)
您确实需要将您提到的每个组件都视为具有自己生命周期的独立工件。这包括共享库。
Maven 和 Jenkins 分别在不同的级别管理构建过程。两者都用于确保构建过程中的完整性和一致性。
在 Jenkins 中构建您的共享库,作为一个 maven 工件,带有 pom 和版本,smae 作为您的微服务。您可以开发为 SNAPSHOT,但您需要将其部署到工件存储库(Artifactory, Nexus 3, or 2 (if just maven), etc.), ultimately with a solid release version (semantic versioning,而不是 SNAPSHOT)。您也可以在管道中执行所有这些操作,最终目标是发布到工件存储库,而不是 PROd。
您的每个微服务都应该使用库的已知版本(solid ver.#),就像您使用任何其他第三方库一样。
开发、测试并发布(到您的工件存储库)您构建的共享库。然后增加微服务中的显式依赖。
在 Jenkins 中完成所有构建。这取决于您有多少想要使用 maven-release-plugin, Nexus 3 webhooks, and Jenkins pipelines 实现自动化。等等
您不太可能在每次发布新共享库时同时重建和重新部署所有微服务 - 听起来太单一了。如果您在部署的工件(尤其是生产工件)中没有共享库的显式版本,您将给自己设置一个蜘蛛网泥潭并更新微服务。
您可以设置一个新作业,该作业在发布增量共享库时触发,将所有消费者准备为 SNAPSHOT,提高引用依赖性,将其提交给各种 git 回购协议,然后反过来触发新的管道执行来构建微服务。这完全取决于您的系统的复杂程度和规模、更新和发布的频率以及您可以使用的工具和资源。 YMMV.