首页 > 解决方案 > 如何在 jenkins 中为 Spring Boot 微服务创建管道

问题描述

我在一个带有父项目的存储库中有一个带有 4 个微服务(Eureka 服务注册表、配置服务器、一个 Zuul 网关和一个用户服务)的 Spring Boot 项目,其中我有一个 docker-compose.yml,它读取微服务项目中的 Dockerfile 并使用“application-docker.yml”和“bootstrap-docker.yml”

我想做的是在 git 中提交后触发 jenkins 管道,以便在 Docker 中编译和部署微服务。最终,我希望有一个生产配置,可以在 Kubernetes 中部署图像,也许是 AWS。

现在,为了工作,微服务需要按顺序启动:

  1. 配置服务器
  2. 尤里卡服务注册中心
  3. 网关等。

最好的做法是什么?

如果每个微服务都有单独的存储库,我想我可以解决。假设 configserver 和 eureka 服务注册表已经启动并运行,部署单个微服务应该很容易,实际上它们永远不会改变。

如果我有一个存储库,并且我不断开发新的微服务,我是否需要为每个微服务提供单独的 jenkins 文件,或者我可以在父项目中拥有一个 jenkins 文件并使用 docker-compose?它是如何工作的?任何可以帮助的在线文章(找不到任何文章)。是否有意义?

或者我需要看看 Jenkins X 吗?

谢谢!

标签: springspring-bootdockerjenkinsmicroservices

解决方案


我建议为每个微服务使用单独的存储库。您使用微服务来防止单体应用并拥有定义明确的小型服务;将它们按空间分开似乎也很合适,即将它们存储在单独的存储库中(例如,使其更容易重用)。

然后,您必须在每个 repo 中提供一个 Jenkinsfile。这些大部分是相同的。

如果您想要快速的发布周期,您可以在发布时自动部署单个服务。或者,您可以使用额外的发布序列模块来处理完整部署。在这两种情况下,我都会使用 docker-compose 文件来处理服务之间的互连。您可以通过使用 'depends_on、links、volumes_from 和 network_mode: "service:..."' 来强制执行正确的顺序。如需完整参考,请参阅docker 文档

如果你想保留你的单一存储库,你的 Jenkinsfile(s) 必须非常hacky,我想......在每次提交之后,你要么

  • 构建所有模块 --> 整体行为

  • 以某种方式确定哪些模块已更改(例如查看 git 日志)-> 与多个模块的行为相同但非常hacky

Docker-Compose 文件

如果您想在特定时间点发布所有模块,您可以使用发布列车模块,其中 docker-compose.yml 位于 Jenkinsfile 旁边。然后,当您想发布您的应用程序时,您可以启动这个 Jenkins 作业。

如果您想在每个服务发布后立即发布它,独立于其他服务,您需要从每个模块访问 docker-compose.yml。您可以手动执行此操作(因为文件不会经常更改)或创建一个 docker 模块,在您的所有服务中用作 git-submodule。

我们为此使用了一个通用的 docker-compose.yml,其中每个版本都被一个变量替换:

example-service:
  image: example.service:${EXAMPLE_SERVICE_VERSION}

然后在 jenkins 中启动该特定服务,我们使用命令

export EXAMPLE_SERVICE_VERSION=1.1.1
docker-compose -p example-project -f docker-compose.yml up -d example-service

推荐阅读