V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xyqhkr
V2EX  ›  程序员

关于微服务项目的 GitLab CI 如何写?

  •  
  •   xyqhkr · 2021-12-03 15:03:18 +08:00 · 1816 次点击
    这是一个创建于 847 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 Menorepo 项目(单仓库多目录微服务),希望使用 gitlab-ci 实现自动生成发布镜像。
    以前一个项目只有一个镜像的时候,直接一条流水线下来,生成镜像发布即可。
    现在这个 Menorepo 项目里,有十个微服务(后期有可能继续增加),每个微服务生成一个镜像。在本地调试的时候,使用的 Makefile 循环生成镜像,现在想要 gitlab-ci 自动生成,肯定不能写十个流水线,想要使用 ci 直接执行 make ,但是发布镜像使用的 kaniko ,该镜像中不支持 make 命令。这种微服务项目该怎么写 gitlab-ci ?
    17 条回复    2021-12-08 12:30:33 +08:00
    BeijingBaby
        1
    BeijingBaby  
       2021-12-03 15:04:25 +08:00
    不支持 make ,支持 sh 不 ?
    kiwi95
        2
    kiwi95  
       2021-12-03 15:06:43 +08:00 via Android
    都 mono repo 了为啥不用一个镜像,运行时做下区分,不同服务走不同逻辑就可以了
    defunct9
        3
    defunct9  
       2021-12-03 15:13:41 +08:00
    onedev
    xyqhkr
        4
    xyqhkr  
    OP
       2021-12-03 15:14:33 +08:00
    @kiwi95 这个问题不讨论,微服务化逐步拆分中。
    xyqhkr
        5
    xyqhkr  
    OP
       2021-12-03 15:14:54 +08:00
    @BeijingBaby 是个方法,
    clf
        6
    clf  
       2021-12-03 15:17:03 +08:00
    gitlab-runner 运行的环境下该怎么打包就怎么写呗。和镜像环境没关系,你可以外面( runner 所在环境)编译完后再打包到 docker 运行环境的镜像里。
    basefas
        7
    basefas  
       2021-12-03 15:29:06 +08:00
    规定 tag 规则,然后通过正则匹配 tag 触发
    agui2200
        8
    agui2200  
       2021-12-03 15:33:56 +08:00
    都是先编译完再传镜像啊,万一镜像有问题,你还有 build 结果,gitlab ci 不就支持多个阶段么
    leopod1995
        9
    leopod1995  
       2021-12-03 15:34:30 +08:00
    和 7#的原理一样, 根据 commmit 写正则匹配微服务执行构建就行
    SingeeKing
        10
    SingeeKing  
       2021-12-04 15:34:10 +08:00
    是 Mono Repo 而不是 meno
    xyqhkr
        11
    xyqhkr  
    OP
       2021-12-06 11:45:48 +08:00
    @clf 这个项目有十个微服务了,ci 里写十遍生成镜像,有点傻。并且每增加一个服务,都要在 ci 里增加一份流程。不太像合适的做法。
    xyqhkr
        12
    xyqhkr  
    OP
       2021-12-06 11:46:34 +08:00
    @basefas 这个是触发单个服务的更新,我主要是问的全量更新的时候,十个服务要在 ci 里写十遍吗?
    xyqhkr
        13
    xyqhkr  
    OP
       2021-12-06 11:46:53 +08:00
    @SingeeKing 感谢指正
    xyqhkr
        14
    xyqhkr  
    OP
       2021-12-06 11:47:39 +08:00
    @BeijingBaby 编译镜像使用的 kaniko executor ,不支持 sh
    clf
        15
    clf  
       2021-12-06 14:14:34 +08:00
    @xyqhkr #11 ci 脚本里自己读取一下服务,或者采用配置文件的方式决定发布哪些服务,然后执行打包就行了,又不需要把同样的东西复制十多个。
    另外,gitlab-ci 是可以监听代码变化决定触发的,你可以做到 A 服务相关代码变动,执行打包 A 服务 CI……监听到 release 分支创建了 version tag ,再全量打包到 release version tag 上。

    (一般情况下微服务项目更多的是单仓库单服务节点的模式)

    我看了一下 kaniko executor ,这玩意主要还是执行 Dockerfile 的打包逻辑,它是用来构建镜像的,不是必须要在里面编译代码,你可以在外部编译完后复制进容器里,也可以在容器里执行环境安装脚本后再编译。
    basefas
        16
    basefas  
       2021-12-07 09:29:57 +08:00
    @xyqhkr #12 全量一样,定一个一个 tag ,然后匹配,Gitlab 的话,应该只能这么用
    xyqhkr
        17
    xyqhkr  
    OP
       2021-12-08 12:30:33 +08:00
    @clf (一般情况下微服务项目更多的是单仓库单服务节点的模式) 这句话不太对哦。现在一般都是 Mono Repo 模式。

    我提 kaniko executor 是因为要在 ci 步骤里写 Dockerfile 打包步骤,编译阶段在这之前已经处理完成。你没提在这个阶段,如何实现全量打包 10 个微服务的问题。因为使用 kaniko executor 必须基于 kaniko 镜像,该镜像对 shell 支持不友好。除非我写 10 次 kaniko executor ,不然想不到 如何打包多个镜像。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2767 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 12:33 · PVG 20:33 · LAX 05:33 · JFK 08:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.