Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >在CI/CD中,如何管理前端和后端之间的依赖关系?

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

Stack Overflow用户
提问于 2018-11-21 04:27:24
回答 2查看 6.1K关注 0票数 10

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

上下文

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

  1. 提交
  2. gitlab-ci管道:
    1. 建立码头形象
    2. 测试映像(前端根据部署的后端进行测试)
    3. 标记图像作为产品:最新的
    4. 将图像推回gitlab注册表
    5. webhook门户程序中相应的服务(前端/后端),以更新已部署的映像

  1. 端口:
    1. 拉像
    2. 部署

问题

部署同步

假设我们正在对前端和后端进行重大更改,这两者都将与以前的版本不兼容。因此,新版本必须同时部署。

在当前的设置中,我们必须首先部署后端(将破坏已部署的前端),然后部署新的前端,修复生产,但要使用“下行”期。

测试的分支依赖关系

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

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

后端集成测试

当对后端执行提交时,它可能会破坏前端。

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

可能的解决办法

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

我不确定在这里应该使用什么来指定版本:提交散列、git标记、分支、docker映像版本.最后一种方法可能避免了重建和测试映像,但我认为图像名称和版本在维护者的堆栈定义中是固定的,并且不容易自动更新。

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

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

其他选择?

谢谢大家的关注!

(编辑:出于好奇,我现在的设置是基于这个文章)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-21 06:45:42

部署同步 假设我们正在对前端和后端进行重大更改,这两者都将与以前的版本不兼容。因此,新版本必须同时部署。 在当前的设置中,我们必须首先部署后端(将破坏已部署的前端),然后部署新的前端,修复生产,但要使用“下行”期。

我不是一个门户用户,但也许您可以依赖某个docker-compose.yml文件来收集后端和前端的版本?在这种情况下,它们可以同时更新,…

事实上,根据端口/端口#1963这个文档页面的说法,portainer似乎同时支持坞构建和群堆栈。

此外,如这个博客中所记录的那样,坞群提供了一些特性,可以在不停机的情况下执行服务升级,但我不知道在门户程序中可以在多大程度上配置这些功能。

可能的解决办法 我不确定在这里应该使用什么来指定版本:提交散列、git标记、分支、docker映像版本.最后一种方法可能避免了重建和测试映像,但我认为图像名称和版本在维护者的堆栈定义中是固定的,并且不容易自动更新。

虽然提交散列是精确的标识符,但它们可能不方便识别不兼容的版本。因此,您可能希望使用Git后端回购上的标记(和/或分支)来依赖语义版本化

然后,您可以相应地标记相应的Docker图像,并在需要时引入一些同义标记。例如,假设后端已经随版本1.0.0, 1.0.1, 1.1.0, 1.1.1, 1.2.0, 1.2.1, 1.2.2发布,标准实践包括标记Docker映像,如下所示:

  • project/backend:2.0.2 = project/backend:2.0 = project/backend:2
  • project/backend:2.0.1
  • project/backend:2.0.0
  • project/backend:1.1.1 = project/backend:1.1 = project/backend:1
  • project/backend:1.1.0
  • project/backend:1.0.1 = project/backend:1.0
  • project/backend:1.0.0

(如有需要,删除旧图像)

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

好的,但我想您的方法是相当标准的(前端取决于后端,而不是相反)。

无论如何,我记得,即使被测试的系统是前端,实现单元测试(与集成测试相比,开发和运行这些测试成本更低)也是值得的,以便在触发必要的集成测试之前,管道中的第一阶段能够快速运行这些单元测试。

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

这可能不够灵活:通常,CI/CD假设集成测试是使用专用后端实例("dev“服务器或"prod”服务器)运行的,如果所有集成测试和系统测试都通过,则映像被部署到“prod”服务器(和监视服务器,等等)。

我从您的文章中看到,您使用的是GitLab CI,它有一些本地码头支援,所以这可能很容易实现。

有几个提示:

  • 假设后端已在非向后兼容版本中进行了修改,并且相应的Docker映像在注册表中可用(例如,GitLab CI)。然后,您可以在前端配置中更改该映像的规范(例如,在project/backend:1 CI conffile中将project/backend:2替换为project/backend:2左右)。
  • 您的后端可能实现为REST,在这种情况下,您还可能希望在URL中添加一个版本前缀,以便当您从project/backend:1切换到project/backend:2 (不兼容的更改)时,如果需要,可以同时将两个版本部署到URL https://example.com/api/v1/…https://example.com/api/v2/…

此外,除了只有两个CI/CD的repos (后端分别测试,并根据后端的相关版本进行了前端测试)之外,您建议的解决方案也可以考虑:

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

您可以稍微修改此方法,以避免出现这样的部署失败:您可以在第三个repo中添加一些CI设置,它将只包含一个docker-compose.yml文件,并将集成测试从前端CI移动到“组合”CI…。

(FYI这种方法类似于这个DigitalOcean教程中建议的方法,在这种方法中,集成测试是通过一些docker-compose.test.yml文件实现的。)

票数 4
EN

Stack Overflow用户

发布于 2019-01-06 08:25:30

测试的分支依赖关系 有时,当我们在前端开发分支特性-1时,必须>根据后端的分支特性-1进行测试。 在我们当前的设置中,前端中的所有提交都是针对已部署的后端进行测试的(为了避免在CI中复制后端,只使用生产API地址),在这种情况下会产生错误的测试结果。

后端集成测试 当对后端执行提交时,它可能会破坏前端。 目前,后端没有针对前端进行测试(只有另一种方式)。

在我目前的公司中,前端(FE)和后端(BE)的Django分别位于一个存储库中。我们正在跟踪基于主干的开发。我们还使用gitlab进行CI/CD。我把你在这里提到的都说出来了,一点也不觉得尴尬。

环境与这个分支模型之间的关系.

|Branches|example|environment|

硕士级硕士级

_释放-V*_

标签:

|Tag|example|environment|

|v< >.<小>.<修补程序>V1.1.10生产

一旦创建了分支/标记或提交到定义的分支,gitlab将触发自动构建/部署。

前端必须在后端进行测试。我们用特征分支来完成这个任务。

特性/<分支-摘要>

开发人员需要确保FE和BE上都存在相同的特性分支名称。

为每个前端/后端生成一个URL,用于每个部署,类似于用于前端的-fe.<域>.com,用于后端的-be.<域>.com

在FE/BE repos中都有一个特性/我的任务。FE是mytask.< domain,BE是mytask..com

您可以使用docker编写,但在我的示例中,我们的应用程序是使用helm部署到kubernetes的。进一步说,我的FE和BE有一个由traefik管理的k8s入口。DNS记录(对于每个URL)是在(由k8s DNS控制器创建)中自动创建的,后端使用的是每次创建或更改特性分支时创建的DB和Redis。按照特征分支命名的惯例,FE知道如何连接到BE,而BE知道如何使用自己的DB和Redis。

头盔升级-安装${RELEASE_NAME} .

RELEASE_NAME是从特性/<分支摘要>(不超过63个字符)中提取的。

另外,您可以考虑初始化用于特性分支部署的数据。在我的情况下

*)开发人员将设法填充数据(可能在k8s中以init容器的形式运行脚本)。如果开发人员将提交到同一个特性分支,这将触发重新部署,所有DB / Redis的数据都将被重新输入。开发人员可能需要重新填充数据,QC可能需要从这个特性开始重新启动他们的测试。

*)避免在k8s和gitlab存储库中创建过多的资源。我在gitlab中设置了一个删除函数,以便删除BE/FE存储库中的一个特性分支,这将分别触发k8s中的部署删除。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53412038

复制
相关文章
TraceRoute 查询(ping 经过 的路由)网站
查询 ip 经过了哪些路由(用来挑选国外服务器) https://tools.ipip.net/traceroute.php
卓越笔记
2023/02/18
1.4K0
TraceRoute 查询(ping 经过 的路由)网站
【微服务】微服务间通信的最佳实践
一个好的 API 架构对于有效处理微服务之间的通信很重要。不要害怕创建新的微服务,并尽可能地尝试解耦功能。例如,与其创建一个通知服务,不如尝试为电子邮件通知、SMS 通知和移动推送通知创建单独的微服务。 在这里,我假设您有一个 API 网关来管理请求、处理到负载平衡服务器的路由并限制未经授权的访问。 通讯类型 同步协议:HTTP 是一种同步协议。客户端发送请求并等待服务的响应。这与客户端代码执行无关,它可以是同步的(线程被阻塞)或异步的(线程未被阻塞,并且响应最终会到达回调)。这里的重点是协议(HTTP/H
架构师研究会
2022/03/08
1.1K0
一个类似backbone路由的纯净route ( 前端路由 客户端路由 backbone路由 )
大家用backbone、angular,可能都习惯了内置的路由,这两个框架的路由都是非常优秀的,强大而简单。 客户端(浏览器)路由原理其实比较简单,其实就是监听hash的变化。 在之前的架构探讨中,说到director.js这个路由类库不好使,那么,在这一篇,我们尝试自行实现一个简洁而且非常好使的路由类库。 原理先介绍,无非几个步骤: 建立配置表(字符串路径和函数的映射) 监听路由(onhashchange) 处理路由变化,跟配置表的路径做匹配 路径转化为正则表达式 正则exec,匹配+抽取参数 其中难点
用户1258909
2018/07/03
1.1K0
新一代传输协议QUIC——HTTP/3新在哪儿?
近期被重点研究的HTTP-over-QUIC的新协议现在已经正式改名为HTTP/3。IETF中的QUIC工作组致力于创建QUIC传输协议。QUIC是通过UDP完成的TCP替换。QUIC最初是谷歌提出并研究的一个进行一个协议,后更名为“HTTP/2-encrypted-over-UDP”协议。
用户1324186
2018/12/13
1.8K0
新一代传输协议QUIC——HTTP/3新在哪儿?
OpenEMR 日历搜索中经过身份验证的 SQL 注入
Trovent Security GmbH 在搜索中发现了一个 SQL 注入漏洞 日历模块的功能。参数“provider_id”是可注入的。 攻击者需要一个有效的用户帐户才能访问日历模块 Web应用程序。可以从数据库的所有表中读取数据。
Khan安全团队
2021/12/16
5100
Dart服务器端 mojito包 原
就像它的名字一样,Mojito主要是糖和其他成分的混合物。 Mojito故意在几个shelf包上非常薄,并专注于构建应用程序的整体体验。
南郭先生
2018/08/14
1.6K0
Blazor 中的路由和路由模板
过去的 ASP.NET Web 窗体和现代 Web 明显区别在于 Web 服务器入口是否存在路由组件。在 Web 窗体中,绝大多数 Web 终结点都是物理文件资源,直接通过其页面路径调用。
Edison.Ma
2019/08/16
8.4K0
Hadoop搭建,上传文件时出现错误,没有到主机的路由
解决方案: (1)从namenode主机ping其它slaves节点的主机名(注意是slaves节点的主机名),如果ping不通,原因可能是namenode节点的/etc/hosts 未配置主机名与IP地址的映射关系,补全主机名与IP地址的映射关系。 (2)从datanode主机ping master节点的主机名(注意也是节点的主机名),如果ping不通,原因可能是datenode节点的/etc/hosts 未配置主机名与IP地址的映射关系,补全主机名与IP地址的映射关系。 (3)查看各机器节点的防火墙是否关闭(或者设置防火墙开启,但对我们的指定端口开放,最好是关闭防火墙)
hankleo
2020/09/17
2.6K0
【译】我是如何学习任意前端框架的
每次你决定学习前端框架时,你定会反复听到这些术语(组件,路由和管理状态/状态管理)。
Jimmy_is_jimmy
2019/07/31
3.6K0
【微服务模式】MS大使模式
创建代表消费者服务或应用程序发送网络请求的辅助服务。大使服务可以被认为是与客户端位于同一位置的进程外代理。
架构师研究会
2022/09/26
3880
【微服务模式】MS大使模式
Node.js-具有示例API的基于角色的授权教程
1.从https://github.com/cornflourblue/node-role-based-authorization-api下载或克隆教程项目代码 2.通过从项目根文件夹(package.json所在的位置)中的命令行运行npm install来安装所有必需的npm软件包。 3.通过从项目根文件夹中的命令行运行npm start来启动api,您应该看到消息 Server listening on port 4000。您可以使用诸如Postman之类的应用程序直接测试api,也可以使用下面的单个页面的示例应用程序来测试它。
ccf19881030
2020/08/11
5.7K0
猫头鹰的深夜翻译:API网关的重要性
在非技术术语中,“网关或门是进入一个由墙围住的封闭空间的入口点。”同理,API网关是指位于防火墙或互联网后面 的服务的入口点。在微服务的世界中,网关坐镇于API前面,直接面向客户并进行反向代理。
眯眯眼的猫头鹰
2019/03/13
9000
猫头鹰的深夜翻译:API网关的重要性
DartVM服务器开发(第八天)--http服务端框架
Aqueduct是一个HTTP Web服务器框架,用于构建用Dart编写的REST应用程序。
rhyme_lph
2018/09/13
2.7K0
DartVM服务器开发(第八天)--http服务端框架
逆天了,你知道什么是CSRF 攻击吗?如何防范?
跨站点请求伪造 (CSRF) 攻击允许攻击者伪造请求并将其作为登录用户提交到 Web 应用程序,CSRF 利用 HTML 元素通过请求发送环境凭据(如 cookie)这一事实,甚至是跨域的。
网络技术联盟站
2023/03/13
2K0
逆天了,你知道什么是CSRF 攻击吗?如何防范?
Spring Websocket 中文文档 (spring5)
这部分参考文档包括对Servlet堆栈的支持,包括原始WebSocket交互的WebSocket消息传递,通过SockJS的WebSocket仿真,以及通过STOMP作为WebSocket上的子协议的pub-sub消息传递。
gemron的空间
2019/11/04
12.5K1
路由拦截和路由守卫
在vue中,为确保用户登录,使用路由拦截器或者路由守卫判断登录状态,并判断和处理情况。
肥晨
2023/02/16
1.5K0
Spring WebFlux 教程:如何构建一个简单的响应应式 Web 应用程序
反应式系统是采用反应式架构模式设计的系统,该模式优先考虑使用松散耦合、灵活和可扩展的组件。它们在设计时还考虑了故障解决方案,以确保即使一个系统出现故障,大部分系统仍能运行。
用户4235284
2023/10/14
1.4K0
Spring WebFlux 教程:如何构建一个简单的响应应式 Web 应用程序
kong 简明介绍「建议收藏」
kong 官方文档: https://docs.konghq.com/getting-started-guide/2.4.x/overview/ https://docs.konghq.com/enterprise/2.4.x/admin-api/#service-object
全栈程序员站长
2022/09/13
2.1K0
有类路由和无类路由的区别
有类路由只会传送网络地址,不携带子网掩码,是以A、B、C类三个默认的掩码作为参考掩码。
网络技术联盟站
2021/11/05
2K0
点击加载更多

相似问题

设计经过身份验证的路由

32

无法添加经过身份验证的路由来响应路由器管理

12

向路由添加身份验证

336

向以前的rest路由发送响应

10

如何通过isAuthenticated让经过身份验证的组件路由到受保护的路由?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档