多模块GitHub项目:仅触发子模块GitHub Actions及单独打tag问询
多模块GitHub项目的Action构建与模块版本管理方案
我有一个多模块GitHub项目,项目结构如下:
main-project: build.sbt module1: build.sbt src/main/scala/.... module2: build.sbt src/main/scala/....
已经编写了基于GitHub Actions的发布脚本,会在推送tag时触发,现在需要解决两个问题:
- 推送tag时触发Workflow,但仅发布module1的变更;
- 是否存在仅为module1打git tag的方法?
一、推送tag时仅发布module1的变更
方法1:用tag命名规则过滤+指定模块发布
给module1的tag加专属前缀,比如module1-v1.0.0或者m1-v0.2.1,一眼就能区分是哪个模块的版本。然后在GitHub Actions配置里,只监听这类tag的推送:
on: push: tags: - 'module1-v*' - 'm1-v*' # 可选的简化命名
之后在构建步骤里,只执行module1的发布命令即可,sbt项目可以这么写:
sbt "module1/publish"
方法2:通过代码变更范围判断发布
如果不想限制tag命名,也可以在Workflow里先检查当前tag对应的提交是否只有module1目录的文件有变更:
- 拉取代码后,用git命令对比变更范围:
# 获取当前tag的上一个关联tag(首次发布时该命令返回空,不影响后续判断) PREV_TAG=$(git describe --abbrev=0 --tags ${GITHUB_REF_NAME}^ 2>/dev/null || echo "") # 提取变更涉及的顶级目录(即模块名) CHANGED_MODULES=$(git diff --name-only $PREV_TAG ${GITHUB_REF_NAME} | cut -d'/' -f1 | uniq)
- 接下来判断:如果
CHANGED_MODULES仅包含module1,就执行发布;否则直接跳过或者输出提示日志即可。
二、仅为module1打git tag的可行方式
Git本身没有「给单个模块打tag」的功能,因为tag是绑定整个仓库的提交记录的,但可以通过两种方式实现类似效果:
1. 使用模块专属的tag命名
就是前面提到的给module1的版本tag加前缀,比如module1-v1.0.0。虽然tag还是属于整个仓库,但通过命名可以明确区分模块版本,再配合Actions的过滤规则,就能实现推送这类tag时仅发布module1的效果。
2. 拆分为git submodule(可选)
如果module1的独立性很强,可以把它拆成独立的git submodule,这样就能给这个子模块单独打tag、推送版本。不过这种方式会改变项目结构,还需要调整sbt的模块引用方式,需要根据项目实际情况权衡是否采用。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

