对齐 frontend/backend CI 和 CD
Aligning frontend/backend CI and CD
我们有两个 git 回购协议:
- 前端(主要是 TypeScript)
- 后端(提供 HTTP API)
示例:
- 开发人员将代码推送到前端仓库。前端现在有 0.5 版
- CI 测试针对后端版本 1.1 的更改。
- 一切正常,所有测试都通过。
- 前端代码部署到生产系统
- 出现重大故障,因为生产后端仍然是 1.0 版本
如何避免这种情况?
更新
在包 "world" 中,您可以定义依赖项。例如 rpm/dpkg/pip/npm。在上面的 frontend/backend 场景中,您还需要定义一个依赖项:
Frontend v0.5 needs backend v1.1.
如果你想达到完全 CI/CD 那么 contract testing and/or functional testing 是绝对必须的。
系统是否遵循更严格的design by contract,明确的是,这是各部分之间的契约,是子系统如何通信的相互约定,例如,什么是API您的前端需要来自后端的响应。
例如,如果一个消费者需要一个特定 API 的新模式,或者如果一个生产者正在更新一个特定 API 的模式,正如您所描述的,事情将会崩溃.这就是每次更新任何子系统时都必须验证合同的原因。
如何做到这一点?
首先,您需要考虑您的开发工作流程。
- 有些人强制执行 consumer-driven contracts。这只是陈述了一个哲学立场,即提倡将 API 的消费者置于设计过程的核心。
- 其他一些人更喜欢让后端驱动。
- 在某些情况下,这是不可预测的,消费者或提供者可能需要在不同时刻推动变化,或者在某些微服务网格中,消费者是生产者,生产者是消费者。
您需要准备好用于 API 测试、功能测试、合同测试 的任何工具。 REST-Assured, and Runscope (that now belongs to Blazemeter, so you can leverage API monitoring, functional testing, and many other features). Also, I didn't use them, but you can look into pact.io and pactflow.io, and some people seem to have good results doing consumer-driven contract testing with Postman and in general continuous API testing with Postman with the help of newman
很正常,让我安心很多
最后,在您的 CICD 中实施测试。根据您的工作流程和可用工具,您需要
- 决定在哪里保存合同,这可以作为其中一个回购协议(即前端、后端)中的模式,或者在单独的回购协议中,仅用于 API 模式或测试描述,或者在工具中本身。
- 决定如何运行 测试。为此,由于您已经在 CI/CD 管道中进行了 运行ning 测试(我想至少 unit/integration),因此您只需要添加所需的步骤,以便在任何时候验证所有合同子系统已部署。因此,如果任何其他子系统不在所需版本中,它就不会投入生产,从而产生预期的模式。
- 每当其中一个子系统使用新需求时,首先更新您的架构。也就是说,在您的情况下,前端需要后端版本 1.1,因此当您在前端编写更改时,您已经知道有哪些更改,因此您可以更新测试中使用的模式。部署到任何环境时,只有在合约测试通过的环境中部署才会成功。也就是说,如果后端 1.1 已经存在,它可能在 sandbox/dev/QA 环境中工作,但如果在生产环境中不存在,CICD 将停止,因为合同测试不会通过。
我们有两个 git 回购协议:
- 前端(主要是 TypeScript)
- 后端(提供 HTTP API)
示例:
- 开发人员将代码推送到前端仓库。前端现在有 0.5 版
- CI 测试针对后端版本 1.1 的更改。
- 一切正常,所有测试都通过。
- 前端代码部署到生产系统
- 出现重大故障,因为生产后端仍然是 1.0 版本
如何避免这种情况?
更新
在包 "world" 中,您可以定义依赖项。例如 rpm/dpkg/pip/npm。在上面的 frontend/backend 场景中,您还需要定义一个依赖项:
Frontend v0.5 needs backend v1.1.
如果你想达到完全 CI/CD 那么 contract testing and/or functional testing 是绝对必须的。
系统是否遵循更严格的design by contract,明确的是,这是各部分之间的契约,是子系统如何通信的相互约定,例如,什么是API您的前端需要来自后端的响应。
例如,如果一个消费者需要一个特定 API 的新模式,或者如果一个生产者正在更新一个特定 API 的模式,正如您所描述的,事情将会崩溃.这就是每次更新任何子系统时都必须验证合同的原因。
如何做到这一点?
首先,您需要考虑您的开发工作流程。
- 有些人强制执行 consumer-driven contracts。这只是陈述了一个哲学立场,即提倡将 API 的消费者置于设计过程的核心。
- 其他一些人更喜欢让后端驱动。
- 在某些情况下,这是不可预测的,消费者或提供者可能需要在不同时刻推动变化,或者在某些微服务网格中,消费者是生产者,生产者是消费者。
您需要准备好用于 API 测试、功能测试、合同测试 的任何工具。 REST-Assured, and Runscope (that now belongs to Blazemeter, so you can leverage API monitoring, functional testing, and many other features). Also, I didn't use them, but you can look into pact.io and pactflow.io, and some people seem to have good results doing consumer-driven contract testing with Postman and in general continuous API testing with Postman with the help of newman
很正常,让我安心很多
最后,在您的 CICD 中实施测试。根据您的工作流程和可用工具,您需要
- 决定在哪里保存合同,这可以作为其中一个回购协议(即前端、后端)中的模式,或者在单独的回购协议中,仅用于 API 模式或测试描述,或者在工具中本身。
- 决定如何运行 测试。为此,由于您已经在 CI/CD 管道中进行了 运行ning 测试(我想至少 unit/integration),因此您只需要添加所需的步骤,以便在任何时候验证所有合同子系统已部署。因此,如果任何其他子系统不在所需版本中,它就不会投入生产,从而产生预期的模式。
- 每当其中一个子系统使用新需求时,首先更新您的架构。也就是说,在您的情况下,前端需要后端版本 1.1,因此当您在前端编写更改时,您已经知道有哪些更改,因此您可以更新测试中使用的模式。部署到任何环境时,只有在合约测试通过的环境中部署才会成功。也就是说,如果后端 1.1 已经存在,它可能在 sandbox/dev/QA 环境中工作,但如果在生产环境中不存在,CICD 将停止,因为合同测试不会通过。