设置
我有几个 gitlab 存储库,其中一般设置涉及拥有一个master
分支、一个stage
(预发布)分支和一个dev
分支。
所有 3 个分支都禁用了推送权限。
工作流程是从dev
分支中派生任何热修复、错误修复和功能。当您对发布感到满意时,您将提交合并请求到dev
. 最终,当内部准备好稳定的构建时dev
;将为stage
分支提交合并请求。最后,当您对预发布感到满意时,您将为master
分支提交合并请求。
我配置了 CI/CD,以便通过自动生成文件从master
和分支自动执行测试、构建和部署。分支部署到 UAT s3 存储桶并部署到生产 s3 存储桶。stage
CHANGELOG.md
stage
master
部署是通过Semantic Versioning 2.0.0
它来处理的,它负责更新版本、生成变更日志和部署。
我有一个与上面刚刚描述的类似的设置,除了它是一个 monorepo,所以我Lerna
用来处理发布(部署)与{"conventionalCommits": true}
复制Semantic Versioning 2.0.0
的行为。我在 monorepo 中使用独立的版本控制。
theSemantic Versioning 2.0.0
和Lerna
setup 都强制master
分支总是在 and 分支之后或等于stage
anddev
分支;并且stage
分支总是落后或等于dev
分支,有点像级联效应。
dev
>= stage
>=master
问题
在发布/部署Lerna Publish
时Semantic Versioning
对文件进行多项更改。其中一些更改包括更新CHANGELOG.md
文件和增加文件内部的版本package.json
。
Lerna 和语义版本控制最终都将这些更改推送到通过 CI/CD 运行它们的分支。
这意味着如果我从dev
to合并stage
,stage 将通过语义版本控制或 Lerna Publish 执行将增加的版本号和新的变更日志推入其中。这将导致stage
分支领先于dev
分支,并导致分支中的所有未来分叉与dev
分支分离,这stage
意味着下次我从它合并时dev
不会像预期的那样stage
是一个简单的fast-forward
合并,并且合并很可能会遇到冲突,这将阻止任何未来的合并或可能使 CI/CD 失败。
我的解决方法
对于语义版本控制:
- 我已禁用推送功能,以便不再提交和推送新的、更改的文件(仍然创建和推送标签)
- 我创建了一个脚本,将
CHANGELOG.md
文件转换为 PDF 并将其发送到我的团队电子邮件
这很有效,因为语义版本控制使用标签来确定更改的文件并决定如何更新版本。因此,尽管 repo 中的版本保持不变,1.0.0
例如,语义版本控制足够聪明,可以从最新标签而不是从package.json
不幸的是,这不适用于 Lerna,它仍然使用标签来确定更改的文件,但随后会从内部版本颠簸,package.json
这意味着通过不package.json
使用新版本推送更新,Lerna 总是将我从1.0.0
、或1.0.1
1.1.0
2.0.0
所以我被勒娜难住了。
问题
我应该如何设置我的 CI/CD 以避免该问题?我知道我的 repo 的结构很常见,尽管 Lerna 和 Semantic Versioning 的无数用户告诉我,我显然错过了一些东西,因为它不是一个广泛传播的问题,但我还没有找到任何人解决这个问题。
可能的解决方案
在我写这个问题时,我突然想到也许我应该只插入版本dev
然后从stage
and部署master
。这将防止stage
并master
永远领先于dev
,这是正确的方法吗?