当涉及到从只包含一个python包的repo使用常规提交生成版本时,事情很容易,您只需要使用一个工具来循环所有repo提交并通过解析这些常规提交来计算版本(break-change=major, feat=minor, fix=patch),到目前为止一切顺利。
在包含多个需要跟踪不同版本的产品的单线程中会发生什么?让我给你举个例子,以python的azure sdk为例,你如何使用传统的提交&为这种类型的回购提供有效的工具?
我想提出一个明显可扩展的解决方案,例如,它可以在管道级别自动计算不同单线程产品的版本,而无需任何开发人员的交互。我想在这里澄清的一些要点是:
- 分支名称语义
- 常规提交语义(这是一个使用可选作用域来引用不同产品的好例子吗)
- 版本控制工具 管道
但无论如何,我的问题很简单,有没有什么最佳实践可以遵循?
下面是我们如何使用Reliza Hub (out工具)的示例:https://github.com/relizaio/rebom/blob/master/.github/workflows/github_actions.yml
的想法:
- 每次push都会为每个分支生成一个release,该release存储在工具中。
- 该工具还负责根据所选的模式生成下一个发布版本(当我们这样做时,这一步是可选的,因为您可以在这里使用不同的工具或方法)。
- 接下来,对于monorepo中的每个repo,您检查工具中最近一次成功提交,并将其与您拥有的实际提交进行比较,基本上是以下代码:
difflines=$(git diff $last_commit..$GITHUB_SHA ./ | wc -l)
if [ "$difflines" != "0" ]
then
dobuild=true
fi
- 如上所述,只有在这个特定目录(repo)有差异时才进行构建。
- 如果构建成功,将成功状态和其他所需的元数据记录回工具。
- 冲洗并重复每次代码推送。
可能有其他工具可以做到这一点,但关键是您需要一些外部存储来跟踪映射到相应提交的成功构建。有些人还尝试重载git标签来实现这一点,但这很少适用于单节点。