spring - 如何在 jenkins 中为 Spring Boot 微服务创建管道
问题描述
我在一个带有父项目的存储库中有一个带有 4 个微服务(Eureka 服务注册表、配置服务器、一个 Zuul 网关和一个用户服务)的 Spring Boot 项目,其中我有一个 docker-compose.yml,它读取微服务项目中的 Dockerfile 并使用“application-docker.yml”和“bootstrap-docker.yml”
我想做的是在 git 中提交后触发 jenkins 管道,以便在 Docker 中编译和部署微服务。最终,我希望有一个生产配置,可以在 Kubernetes 中部署图像,也许是 AWS。
现在,为了工作,微服务需要按顺序启动:
- 配置服务器
- 尤里卡服务注册中心
- 网关等。
最好的做法是什么?
如果每个微服务都有单独的存储库,我想我可以解决。假设 configserver 和 eureka 服务注册表已经启动并运行,部署单个微服务应该很容易,实际上它们永远不会改变。
如果我有一个存储库,并且我不断开发新的微服务,我是否需要为每个微服务提供单独的 jenkins 文件,或者我可以在父项目中拥有一个 jenkins 文件并使用 docker-compose?它是如何工作的?任何可以帮助的在线文章(找不到任何文章)。是否有意义?
或者我需要看看 Jenkins X 吗?
谢谢!
解决方案
我建议为每个微服务使用单独的存储库。您使用微服务来防止单体应用并拥有定义明确的小型服务;将它们按空间分开似乎也很合适,即将它们存储在单独的存储库中(例如,使其更容易重用)。
然后,您必须在每个 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
推荐阅读
- c++ - 通过 const 引用传递指针
- android - 当我清理我的应用程序时,android studio 服务不起作用
- node.js - 如何在 MongoDB 中插入列表并插入嵌套的嵌入列表
- c# - Azure Function 记录每个调用的方法并记录到 Azure Log Analytics 工作区
- python - 想在一个函数中查找年同比和季度计算
- node.js - 有没有办法识别快速服务器到服务器的请求来源
- postgresql - psql 命令问题与//(双斜杠)
- jquery - 无法使用 ajax GET 显示数据,因为 url 中有错误
- macos - 在任务中使用 Ansible 成为密码
- flutter - 如何在颤动中自定义表格日历标题