如何在软件发布计划中自动化语义化版本与变更日志
摘要:本文引入两个工具commitizen和standard-version来实现语义化版本与变更日志的自动化,提升规范化程度,减少人工干预。
随着DevOps方法与实践的普及,越来越多的企业开始使用持续部署流水线来提升软件持续交付的效率与质量。然而,我们发现在发布计划中,我们通常会面临如何为软件版本打标签以及如何准备发布变更日志等方面的挑战。在版本发布过程中,不少企业仍会在手动为软件版本打标签,准备发布变更日志等方面会进行大量繁琐、重复的工作,投入了很大的人力成本,而且无法集成到持续交付流水线的自动化流程中。
本文引入两个工具commitizen和standard-version来实现语义化版本与变更日志的自动化,提升规范化程度,减少人工干预产生的问题。
1、规范代码提交说明
为了使代码提交说明更有意义,同时也可以让团队其他成员更轻松地了解代码变更的原因、目的与影响范围,因此在团队中对代码提交说明进行轻量级约定显得非常有必要。所谓git commit message规范即通过提交说明中的特定关键字来描述代码变更的范畴等,例如特性新增、缺陷修复、文档变更等。
为此,我们选择Conventional Commits作为人与机器之间协同工作的规范,为自动化软件版本奠定基础。Conventional Commits是许多NPM包使用的非常常见的规范。该规范提供了一组简单的规则来创建显式提交历史。该规范在提交说明中描述了features、fixes等,与SemVer相匹配。
提交说明的结构如下所示,详情请参考链接Conventional Commints:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
为了在团队中落实代码提交说明规范,不可避免地需要成熟的工具来支持。目前,在自动约束提交信息这方面已经有很多成熟的工具了,python语言工具,PHP语言工具,以及本文介绍的基于Node.js语言的工具——commitizen,开发者可以直接将它安装在自己的工作机中,在代码提交时直接使用。此外,对于一些流行的IDE,有许多提交兼容插件,比如VSCode和visual studio。在安装commitizen后,并在代码仓库中安装changelog适配模块后,就可以使用git cz命令来代替git commit,进行代码提交说明的规范化提交。
2、标准化版本号与变更日志
为了标准化版本号,大家可以先了解一下SemVer,主要规定了版本号如何表示,如何增加,如何进行比较,不同的版本号意味着什么。我们通过commitizen工具已经实现了代码提交说明的规范化,接下来我们使用standard-version完成如下工作:
• 检索代码仓库当前的版本;
• 根据规范化的提交信息更改版本;
• 根据规范化的提交信息生成变更日志;
• 创建一个新的提交,包含新版本和更新了的变更日志;
• 用这个新版本号创建一个tag标签。
开发团队对阶段性开发进行第一次发布
较小的功能修复引起的小版本+1(1.0.0->1.0.1)发布
3、在华为云DevCloud上发布版本
当开发者在本地完成代码开发后,可以使用commitizen与stardard-version规范化代码提交说明,并形成changelog与版本号,然后将代码推送至DevCloud的代码仓库中,触发DevCloud流水线,完成软件发布。
3.1 配置流水线
首先,配置DevCloud流水线的触发器,使代码提交自动触发流水线运行。
然后使用系统参数GIT_COMMIT将CommitID作为发布仓库路径。
3.2 本地代码推送到云端代码仓库
3.3 查看代码提交历史
3.4 查看发布仓库
每次代码提交后,触发流水线中的构建任务,生成软件包,自动归档在DevCloud发布仓库中。在发布仓库中,可以代码提交所对应的发布仓中的软件包。
图 代码仓库提交历史
图 软件发布库
至此,我们利用commitizen与standard-version工具实现了语义化版本与变更日志的自动化,在一定程度上提升了软件发布的效率。然而深入思考,我们会发现standard-version的工作仍然存在手工操作。我们也探讨了利用华为云DevCloud流水线将此工作进一步自动化的可行性。遗憾的是,目前华为云DevCloud不支持向用户代码库提交变更的能力。我们希望华为云DevCloud可以进一步评估向用户代码库提交变更的能力。那么在当前限制下,是不是就没有可能自动化了呢?路是存在的,只是有点复杂,感兴趣的开发者,可以参考博文“如何在华为云DevCloud流水线中运行OWASP ZAP安全测试”。