如何在不破坏 Pact 合同的情况下向提供者和消费者代码添加新功能?
How to add new features to the provider & consumer code without breaking the Pact contract?
管道
我正在努力使我的管道尽可能接近 pact nirvana,减去部署测试,因为我仍在使用该技术。
注意,我使用的是 broker 的开源版本,而不是 pactflow。
提供商管道
- 建设
- 测试
- 根据最新的生产标记消费者协议进行验证(最新的提供者版本为 git sha,标记为 git 分支)
- 如果最新标记的 production consumer mocks 已通过针对最新提供者版本的验证,请使用 can-i-deploy 检查契约矩阵。
- 部署
- 在 pact broker 中将最近部署的提供程序版本标记为生产版本
消费者管道
- 建设
- 测试并发布到代理(最新的消费者版本为 git sha,标记为 git 分支)
- webhook 针对生产标记的提供程序对提供程序管道中新发布的消费者版本执行验证
- 使用 can-i-deploy 检查 broker 中的 pact matrix 以确定最新的 consumer mocks 是否已通过最新标记的 production provider
的验证
- 部署
- 在 pact broker 中将最近部署的消费者版本标记为生产版本
问题
当我尝试构建新功能时,这会崩溃。
假设我创建了一个更改,通过更改提供者对非常不同的事物的响应(想象它是消费者的新功能)来打破消费者和提供者之间的契约。这显然在管道内的验证步骤失败,因为我们正在根据生产标记的消费者检查它。
然后我们更改消费者模拟(和代码)以使用这个新响应。然后我们推送到启动 CI 的 repo 并在验证步骤失败,因为我们正在针对生产标记提供程序(不是具有功能分支名称的最新标记)进行测试。
我们显然总是希望针对生产标记的对应项(与 can-i-deploy 相同)进行验证,以防我在消费者或提供者代码库中意外创建重大更改。
所以我们遇到了 22 条军规问题;我们如何在不破坏推荐管道的情况下添加消费者和提供者代码都需要修改的新功能?
https://docs.pact.io/faq#how-can-i-make-a-breaking-change-to-a-provider
如果您需要对提供程序进行重大更改,您可以使用扩展和收缩模式在多步过程中完成。
将新的 fields/endpoints 添加到提供程序并进行部署。
更新消费者以使用新的 fields/endpoints,然后部署。
从提供程序中删除旧的 fields/endpoints 并部署。
在流程的每一步,所有合约测试都保持绿色。消费者驱动的合同很好地支持这种模式,因为供应商很容易确定 if/when 所有消费者都通过在本地开发环境中删除旧字段来放弃使用旧字段,并且 运行 契约验证测试。
管道
我正在努力使我的管道尽可能接近 pact nirvana,减去部署测试,因为我仍在使用该技术。
注意,我使用的是 broker 的开源版本,而不是 pactflow。
提供商管道
- 建设
- 测试
- 根据最新的生产标记消费者协议进行验证(最新的提供者版本为 git sha,标记为 git 分支)
- 如果最新标记的 production consumer mocks 已通过针对最新提供者版本的验证,请使用 can-i-deploy 检查契约矩阵。
- 部署
- 在 pact broker 中将最近部署的提供程序版本标记为生产版本
消费者管道
- 建设
- 测试并发布到代理(最新的消费者版本为 git sha,标记为 git 分支)
- webhook 针对生产标记的提供程序对提供程序管道中新发布的消费者版本执行验证
- 使用 can-i-deploy 检查 broker 中的 pact matrix 以确定最新的 consumer mocks 是否已通过最新标记的 production provider 的验证
- 部署
- 在 pact broker 中将最近部署的消费者版本标记为生产版本
问题
当我尝试构建新功能时,这会崩溃。
假设我创建了一个更改,通过更改提供者对非常不同的事物的响应(想象它是消费者的新功能)来打破消费者和提供者之间的契约。这显然在管道内的验证步骤失败,因为我们正在根据生产标记的消费者检查它。
然后我们更改消费者模拟(和代码)以使用这个新响应。然后我们推送到启动 CI 的 repo 并在验证步骤失败,因为我们正在针对生产标记提供程序(不是具有功能分支名称的最新标记)进行测试。
我们显然总是希望针对生产标记的对应项(与 can-i-deploy 相同)进行验证,以防我在消费者或提供者代码库中意外创建重大更改。
所以我们遇到了 22 条军规问题;我们如何在不破坏推荐管道的情况下添加消费者和提供者代码都需要修改的新功能?
https://docs.pact.io/faq#how-can-i-make-a-breaking-change-to-a-provider
如果您需要对提供程序进行重大更改,您可以使用扩展和收缩模式在多步过程中完成。
将新的 fields/endpoints 添加到提供程序并进行部署。 更新消费者以使用新的 fields/endpoints,然后部署。 从提供程序中删除旧的 fields/endpoints 并部署。 在流程的每一步,所有合约测试都保持绿色。消费者驱动的合同很好地支持这种模式,因为供应商很容易确定 if/when 所有消费者都通过在本地开发环境中删除旧字段来放弃使用旧字段,并且 运行 契约验证测试。