小编som*_*one的帖子

在 CI/CD 中如何管理前端和后端之间的依赖关系?

我将描述我的设置以使问题不那么抽象,但它们似乎并不特定于我的情况。

语境

我们有 Python-Django 后端和 VueJS 前端,每个都在一个存储库中,使用 Portainer(使用堆栈)配置和部署 Gitlab-CI。每个存储库的生产分支中的提交遵循以下路径:

  1. 犯罪
  2. gitlab-ci 管道:
    1. 构建 docker 镜像
    2. 测试图像(前端针对部署的后端进行测试)
    3. 将图像标记为生产:最新
    4. 将图像推回 gitlab 注册表
    5. webhook portainer中对应的service(frontend/backend)来更新部署的镜像
  3. 搬运工:
    1. 拉图
    2. 部署

问题

部署同步

想象一下,我们在前端和后端都进行了重大更改,并且两者都将与以前的版本不兼容。因此必须同时部署新版本。

在我们当前的设置中,我们必须首先部署后端(什么会破坏已部署的前端),然后部署新的前端,修复生产,但有一个“停机”期。

测试的分支依赖

有时,当我们在前端开发分支 feature-1 时,必须针对后端的分支 feature-1 对其进行测试。

在我们当前的设置中,前端中的所有提交都针对部署的后端进行了测试(为了避免在 CI 中复制后端,仅使用生产 API 地址),在这种情况下会导致错误的测试结果。

后端集成测试

当提交到后端时,它可能会破坏前端。

目前后端没有针对前端进行测试(只有另一种方式)。

可能的解决方案

对于部署同步问题,我考虑创建另一个存储库,该存储库只有一个文件,指定应部署的前端和后端的版本。此存储库中的提交将导致 Portanier 的两个服务 webhooks 被“卷曲”以进行更新(后端和前端)。这并不能保证同步更新(在 Portainer 中可能会失败并且不会有回滚),但它会比当前设置更好。

我不确定这里应该用什么来指定版本:commit hash、git tag、branch、docker image version...最后一个可能避免了重建和测试图像,但我认为图像名称和版本是固定的Portainer 的堆栈定义,并且不容易自动更新。

对于分支依赖性测试,我考虑在每个存储库(前端和后端)中都有一个文件,指定要测试的后端/前端的哪个分支。但是每个存储库的 CI 必须复制整个部署环境(例如,运行一个新的后端和前端来测试每个前端提交)。这也将允许后端集成测试。由于我们使用的是 Docker,这并不是很复杂,但是每个 CI 管道都会花费额外的时间......此外,当第一个存储库(前端或后端)提交时,它会引用另一个中仍然不存在的分支存储库,并失败...

这些解决方案对我来说似乎很尴尬,特别是如果这些是 Docker 的 CI/CD 常见问题。当我们向组合中添加更多存储库时,它会变得更加丑陋。

备择方案?

感谢关注!

编辑:出于好奇,我当前的设置基于本文

continuous-integration continuous-deployment docker gitlab-ci portainer

8
推荐指数
1
解决办法
4102
查看次数