作为DevOps的实践者,这么多年经历了很多持续交付有关的工作,似乎在我的印象中“软件配置管理(SCM)”这个概念大概是很多年前流行的,后面很少关注甚至提到这个概念。 最近碰到了一些有关“配置管理”的人和事情,让我重新回顾并思考“配置管理”和组织架构,和DevOps体系建设的关系。
老实说,不同的工作经历的人,对配置管理的理解和定位也各不相同。下面我从几个不同领域,大概阐述下我的理解。
在ITIL(IT Infrastructure Library,IT基础架构标准库)中,配置管理(Configuration Management)是一个关键组成部分,其定义涉及对IT服务中的配置项(Configuration Items, CI)进行识别、记录、控制和审核的过程。
具体来说,配置管理旨在确保配置项(如计算机系统、服务器和其他资产)的准确性和可靠性,以及在整个生命周期内与其需求、设计和操作信息保持一致。这是一个系统工程,用于建立和维护产品性能、功能和物理属性。配置管理的目标主要包括两个方面:
具体来说,配置管理是对基础结构和系统的所有实体(例如服务器,应用程序,存储,网络和所有托管服务)进行配置,监视,管理和维护的自动化
为了使配置管理系统运行,它需要某种形式的机制来存储其管理的信息。最初,这称为 配置管理数据库(CMDB);ITIL V3引入了配置管理系统(CMS)的概念来代替CMDB。CMDB提倡单个整体存储库的概念,而CMS提供了CMDB的概念化系统,这些系统共同作用以支持此治理过程的需求。
image.png
在DevOps实践中,配置管理通常与持续集成(CI)和持续部署(CD)等自动化流程相结合,以实现从代码提交到生产环境的快速、可靠和一致的部署。此外,自动化配置管理还促进了环境之间的一致性,无论是开发环境、测试环境还是生产环境,都能保持一致的设置。具体实践包括以下几个方面:
在CMMI(Capability Maturity Model Integration,能力成熟度模型集成)中,配置管理是一个重要的组成部分,用于确保软件产品及其开发过程和生命周期的完整性、一致性和可追溯性。
CMMI中的配置管理主要通过以下几个关键活动来实现:
image.png
CMMI中的配置管理强调了对软件产品及其开发过程的全面控制和管理,通过技术手段和行政手段来确保软件产品的质量和可维护性。
配置管理主要解决以下问题:
image.png
CMMI更多还是从宏观上,定义了如何更规范地开展研发活动,项目立项了,建立基线,代码仓库如何分配,代码/文档/问题如何管理,变更如何审批,怎么记录等等。不是CMMI专业人士,只是粗浅理解。
下图,是在网上找个某个项目管理软件关于配置管理的截图。现实中,估计会有很多组织,在用类型excel表格的形式,通过一些流程制度来管理这个活动。
CMMI是从宏观上提出了规范要求,但是似乎并没有告诉组织如何落地?另外,CMMI关于配置管理的思想还是建立在“集中式代码管理”基础上的,对于git为代表的“分布式代码管理”好像并不涉及,那么在实际执行中偏差就更大了。关于这一点,欢迎留言讨论。
在DevOps体系中,软件配置管理是“一切自动化”的基石(PS: 更接地气,直面问题)。总结概括就是:将一切纳入配置管理,遵循软件配置管理的 3 个基本原则:一切皆有版本;共享唯一受信源;标准化与自动化。
1)一切皆有版本,指的是:当需要更快地发布软件时,就需要对生产软件过程中的相关内容进行管理,这些内容不仅仅是源代码,配置文件,运行数据,还包括:测试工具包或测试用类库,测试相关的代码,测试数据,测试脚本等。
2)共享唯一受信源,指的是:整个组织需要管理研发团队的所有仓库:需求仓库,代码仓库,软件包仓库,所有团队成员都应该以这些仓库中的内容为基准,相互协作,以确保所有成员所获取的信息都是一致的。其中的软件包仓库,包括 3 种类型:临时产物仓库,正式发布包仓库,外部软件包私服仓库。
3)标准化与自动化,指的是:软件配置管理应该制订相应的标准与规范,例如:分支策略,分支命名,分支Tag命名,产品特性命名以及存放位置,源代码目录结构等。当研发团队成员都了解并遵守这些标准与规范后,不仅仅能够减少不必要的沟通成本,还能够将更多的日常事务性操作自动化,从而释放更多的人力资源,并大大降低手工操作带来的种种失误。
版本.jpg
总之,通过DevOps工具和实践,正确使用和实施配置管理可以保证控制,准确性,可追溯性,可恢复性,一致性,效率和版本控制。
可以用下面5个问题来验证检查研发团队是否对一切都做了版本管理:
研发团队也可以尝试挑战一下,检验软件配置管理是否做得足够好:
上面从各个维度介绍了配置管理的定义和实践,那么落地呢?这个是我写这篇文章的起因。我找了两个招聘启事,来阐述这个问题
传统的配置管理(CMMI),更多还是依赖于【人】去【守护】流程、规则。如果组织/团队规模不大,或者技术架构统一的一套,如果不具备平台自动化能力的情况下,靠【人】来通过【守护】还好说(PS: 前提是,大家都尊重流程和约定)。
如果团队众多,技术栈众多,靠人几乎是不可能了,即使借助一些工具,那真要看“配置管理工程师”的水平了。
估计也只有大点的公司,才有所谓的“配置管理工程师”这样的角色。那么这个角色放在哪个部门合适?
作为DevOps的实践者,我更倾向于弱化“配置管理”这个流程本身。往大了说,“配置管理”不就是你的研发全过程吗?从issue到代码,再到制品、环境,哪个环节离开了“变更”,配置管理的核心其实就是“控制变更”。
所以,围绕变更做文章(建规则,建工具)。简单说,我告诉团队某个issue需要回滚,能在短时间内(5分钟内)找个上个稳定版本(或者快速生成上个稳定版本),并快速部署到某个指定环境,基本“配置管理”就算做好了。否认,配置管理计划/变更都是一纸空文。
通过建立issue-code-artifact-environment
之间的关联规则,团队完全可以通过自动化手动实现“配置管理”的自我管理。