【问题标题】:how to create a pipeline in jenkins for spring boot microservices如何在 jenkins 中为 Spring Boot 微服务创建管道
【发布时间】:2019-02-25 15:48:57
【问题描述】:

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

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

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

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

最好的做法是什么?

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

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

或者我需要看看 Jenkins X 吗?

谢谢!

【问题讨论】:

    标签: spring spring-boot docker jenkins microservices


    【解决方案1】:

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

    然后您必须在每个 repo 中提供一个 Jenkinsfile。这些几乎是相同的。

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

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

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

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

    Docker-Compose 文件

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

    如果您想在每个服务发布后立即发布它,独立于其他服务,您需要从每个模块访问 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
    

    【讨论】:

    • 假设我有不同的存储库,docker-compose 将驻留在哪里?目前,它在多模块 Maven 父项目中。我从那里运行它,它将按顺序在 docker 上构建和部署微服务(使用 wait-for-it.sh)。
    • 我详细阐述了我之前的答案,希望对您有所帮助:)
    • 我假设 docker-compose 将只有微服务映像,如果依赖于这些,可能还有数据库或其他微服务。另外,为了确定..发布火车模块是指管道吗?谢谢!
    • 使用 release train 模块 我的意思是一个额外的 git 模块,它(或多或少)只包含相应管道的 Jenkinsfile、docker-compose 文件和某种方式确定您各自的 docker 图像的所需版本。这样,您就有了为每个微服务显式设置版本的开销,但您可以完全控制何时发布产品的哪个版本。
    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 2021-04-09
    • 2019-01-03
    • 2018-08-21
    • 2020-06-21
    • 2019-08-02
    • 2019-10-05
    • 1970-01-01
    相关资源
    最近更新 更多