Bun Monorepo中共享目录变更时的条件式CI/CD优化方案咨询
问题:Bun Monorepo 动态部署依赖共享库的应用
我们的Bun Monorepo结构如下:
root/ apps/ app1/ app2/ app3/ shared/ lib1/ lib2/ lib3/
通过GitHub Actions在release分支推送时构建部署app1至app3,每个应用依赖0个或多个shared/lib包。当前仅监听apps/**变更自动部署,shared/**变更需手动触发CI/CD,希望实现shared目录变更时动态部署相关应用。目前想到两种方案:
- 若
shared/**有变更则重新部署所有应用(暴力但可靠,成本较高) - 每次构建所有应用,但仅当版本有差异时部署(效率略高,需可靠哈希或对比工具)
请问是否存在其他可行方案?
补充信息
- 使用Bun workspaces和Typescript引用导入仓库内包
- 采用Bun构建每个应用
- .github/workflows/workflow.yml中的触发配置如下:
pull_request: branches: - main paths: - "apps/**" - "shared/**" push: branches: - main paths: - "apps/**" - "shared/**"
可行方案推荐
1. 基于依赖图谱的精准关联部署
利用Bun workspaces的依赖关系,结合Git变更记录,只构建部署依赖了变更共享库的应用:
- 在CI流程中,先通过
bun pm ls或自定义脚本遍历每个应用的package.json,生成应用-共享库的依赖图谱(比如记录app1依赖lib1、lib2,app2依赖lib2) - 用
git diff --name-only HEAD^ HEAD | grep shared/提取本次提交变更的共享库名称 - 匹配依赖图谱,筛选出依赖这些变更库的应用
- 仅对筛选出的应用执行构建部署流程
这种方案精准度最高,完全避免无效构建,CI成本最低。
2. 版本驱动的依赖更新部署
给每个shared/lib维护独立版本号,共享库变更时自动更新依赖它的应用的版本引用,通过GitHub Actions监听应用的依赖变更触发部署:
- 用
changesets或Bun自带的版本管理工具,在共享库变更时自动生成版本更新记录,并批量更新依赖该库的应用的package.json - GitHub Actions监听
apps/**/package.json的变更,自动触发对应应用的部署
该方案版本追溯性强,符合包管理规范,适合对版本管控有要求的场景,唯一的额外成本是维护版本号。
3. 矩阵策略+单应用变更检测
在GitHub Actions中定义应用矩阵,对每个应用单独做变更校验:
- 定义包含所有应用的矩阵:
matrix: { app: ['app1', 'app2', 'app3'] } - 对每个矩阵项,通过脚本判断两个条件:要么当前应用目录有变更,要么该应用依赖的共享库有变更(可通过
bun why <shared-lib>验证依赖关系) - 仅满足条件的应用执行构建部署
这种方案实现简单,不需要额外维护依赖图谱或版本号,适合小型monorepo场景。
内容的提问来源于stack exchange,提问作者John A
相关产品推荐
相关产品推荐

