设定
我有几个gitlab存储库,一般的设置包括一个master
分支、一个stage
(预发布)分支和一个dev
分支。
所有三个分支的推送权限都被禁用了。
工作流程是从dev
分支派生出任何热修复、错误修复和功能。当您满意发布版本时,您将向dev
提交合并请求。最终,当在dev
内准备好稳定版本时,将提交一个合并请求到stage
分支。最后,当您对预发布感到满意时,会为master
分支提交合并请求。
我配置了CI/CD,以便从master
和stage
分支自动执行测试、构建和部署,并自动生成CHANGELOG.md
文件。stage
分支部署到UAT s3 Bucket,而master
则部署到生产s3 Bucket。
部署是通过Semantic Versioning 2.0.0
处理的,它负责升级版本、生成变更日志和部署操作。
我有一个与上面描述类似的设置,只是它是一个monorepo,因此我使用Lerna
来处理发布(部署),使用{"conventionalCommits": true}
来复制Semantic Versioning 2.0.0
的行为。我在monorepo中使用独立版本控制。
Semantic Versioning 2.0.0
和Lerna
设置都强制master
分支始终落后于或等于stage
和dev
分支;而stage
分支始终落后于或等于dev
分支,就像一种级联效应。
dev
>= stage
>= master
问题
Lerna Publish
和Semantic Versioning
在发布/部署时对文件进行了几个更改。其中一些更改包括更新CHANGELOG.md
文件和在package.json
文件中升级版本。
Lerna
和Semantic Versioning
最终通过CI/CD将这些更改推送到它们所运行的分支。
dev
合并到stage
,则通过语义化版本控制或Lerna发布执行推入的新版本号和新日志将被推到stage
中。这将导致stage
分支超前于dev
分支,并导致所有从dev
分支进行的未来forks与stage
分支分离,这意味着下一次从dev
合并到stage
时,它不会像预期的那样是一个简单的快进合并,而且合并很可能会遇到冲突,这将防止任何未来的合并或可能使CI/CD失败。
我的解决方法
对于语义化版本控制:
- 我已禁用推送功能,以便不再提交和推送新更改的文件(仍然创建并推送标签)
- 我创建了一个脚本,将
CHANGELOG.md
文件转换为PDF并发送到我的团队电子邮件
这很好运作,因为语义化版本控制使用标签来确定更改的文件并决定如何增加版本。因此,虽然存储库内部的版本保持恒定在例如1.0.0
,但语义化版本控制足够智能,可以从最新标签开始递增版本,而不是从package.json
中的内容开始递增版本。
不幸的是,这对于Lerna并不成立,它仍然使用标签来确定更改的文件,但然后从package.json
内部的版本开始调整版本,这意味着通过不推送带有新版本的更新的package.json
,Lerna总是将我的版本从1.0.0
提高到1.0.1
、1.1.0
或2.0.0
。
所以我被Lerna卡住了。
问题
如何设置我的CI/CD以避免此问题?我知道我的repo结构很常见,尽管有无数的Lerna和语义化版本控制用户,但我没有找到任何人解决此问题,这告诉我,我显然错过了什么,因为它不是一个广泛存在的问题。
可能的解决方案
当我写这个问题时,我想到也许我应该只在dev
中递增版本号,然后从stage
和master
部署。这将防止stage
和master
超前于dev
,这是否是正确的方法?