我的团队目前使用相当简单的分支/部署过程,如下所示:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Builds: │ DEV │ │ QA │ │ PROD │
└────────┘ └────┘ └──────┘
▲ ▲ ▲
│ │ │
┌────────┐ ┌────┐ ┌──────┐
Branches: │ master │ │ qa │ │ prod │
└────────┘ └────┘ └──────┘
每个环境都有其自己的分支(我们使用git)和使用该分支的自己的构建。当我们想要从一个环境升级到另一个环境(例如,从DEV升级到QA)时,我们将master
分支合并qa
并启动新的QA构建(然后将其自动部署到QA环境)。
我们正在考虑采用一种新的流程,该流程将取消拥有专门的分支机构并针对每个环境进行构建的流程。相反,单个发行版本将创建一个“部署包”,然后可以将其部署到任何环境中。我们正在想象一个典型的工作流程如下所示:
┌────────┐ ┌────┐ ┌──────┐
Environments: │ DEV │ ──► │ QA │ ──► │ PROD │
└────────┘ └────┘ └──────┘
▲
\
┌───────────────┐
Builds: │ release build │
└───────────────┘
▲
│
┌────────┐ ┌─────────┐
Branches: │ master │ │ release │
└────────┘ └─────────┘
从一种环境升级到另一种环境将不再由源代码控制处理;相反,我们只是采用已经构建的二进制文件(“部署程序包”),然后将其放到新环境中。
这个新系统将使我们能够将任何构建部署到任何环境,这具有多个优势。例如,在DEV和QA中测试PROD错误修复很简单。我们当前的系统无法提供一种不回滚分支的简便方法,这显然是我们希望避免的。
这个新系统的最大缺点是我们不再拥有一种自动的方式来跟踪哪种环境中的代码。如果需要在PROD中进行修复,则不再需要与当前生产代码库同步的专用分支。质量检查也是如此-如果我们希望快速更改质量检查而又不从中拖延正在进行的工作master
,我们将不再有一个分支来反映质量检查环境的当前状态。
我们如何跟踪每种环境中的代码?
我们正在考虑的一些选择:
- 利用git标签来跟踪哪个环境中的提交
- 将构建使用的git commit嵌入到每个部署包中