问题描述
想知道在创建可重用构件时,最干净的分支策略是什么。用户有三个环境:集成环境、暂存环境和生产环境。用户希望在部署的构件中重用它们。例如,应该将功能分支合并到主分支,然后构建并部署到集成环境吗?还是有其他策略可以在发布和源代码管理之间建立一对一的映射关系?用户还提到,当合并到主分支时,会触发构建过程,生成一个构件。这个构件应该部署到所有环境中以确保一致性。在这种情况下,最好从集成环境开始这个过程吗?这样一来,在验证之前,主分支中可能存在未经测试的代码。使用集成分支,将其部署到集成环境,然后合并到主分支并使用该构件进行暂存和生产环境的部署是否更好?还是这样做只会增加重复测试的需求?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在创建可重用构件时,最干净的分支策略是使用连续部署中使用的策略:一个单一/主要的集成分支,也是发布分支。根据《你的分支模型是什么?》中的描述,这是最简单/最干净的分支策略:
Commits can go all the way to production from one trunk/master, if the automated build says the commit was good. It’s the turbo-switch for TBD, where no humans can hold up a release by taking their sweet time testing it and giving a belated seal of approval. Github, Etsy, Netflix (and many more startups) are all here.
在这种策略中,您将在所有环境中使用主分支的持续集成构件。当然,前提是这些构件能够构建并通过相应的质量验证。
需要注意的是,在这种策略中,没有长期存在的功能分支,以消除/减少集成延迟和成本。实际上,您可以消除开发中的分支合并操作。
方案2
使用脚本或工具来管理构件的启动顺序可能会增加复杂性,并且需要确保构件在各个环境中的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制构件的运行顺序。您可以使用docker run
命令来手动控制构件的启动顺序,或者使用一些第三方工具来管理构件的依赖关系。
以下是一个简单的bash脚本示例,可以在集成环境启动后启动暂存环境和生产环境:
#!/bin/bash
# 启动集成环境
docker run -d --name integration your_image_integration
# 等待集成环境完全启动
while ! docker exec integration echo "Integration environment is ready"; do
sleep 1
done
# 启动暂存环境
docker run -d --name staging your_image_staging
# 等待暂存环境完全启动
while ! docker exec staging echo "Staging environment is ready"; do
sleep 1
done
# 启动生产环境
docker run -d --name production your_image_production
# 等待生产环境完全启动
while ! docker exec production echo "Production environment is ready"; do
sleep 1
done
在这个示例中,我们首先使用docker run
命令启动集成环境,并将其命名为integration
。然后,使用一个循环来等待集成环境完全启动(这里是通过在容器内运行echo
命令来测试)。一旦集成环境就绪,我们再使用docker run
命令启动暂存环境,并将其命名为staging
。同样,我们使用一个循环来等待暂存环境完全启动。最后,我们使用docker run
命令启动生产环境,并将其命名为production
。同样,我们使用一个循环来等待生产环境完全启动。
请注意,这只是一个示例,您可以根据实际情况进行调整和修改。