关于NX Monorepo下Azure流水线条件式触发项目发布的问询
实现NX Monorepo项目独立发布流水线(仅变更触发)
核心思路
基于NX的affected能力精准识别变更项目,结合CI平台的目录触发规则,为每个项目配置独立流水线,确保只有项目自身或其依赖的内部代码变更时,才执行发布流程。
具体实现步骤
1. 用NX识别变更项目
在CI环境中,通过nx affected命令获取纯文本格式的变更项目列表,这是判断是否执行发布的核心依据:
CHANGED_PROJECTS=$(nx affected:list --type=project --plain)
该命令会输出所有因自身代码变更、依赖库变更而需要重新构建/发布的项目。
2. 为单个项目配置独立流水线
针对每个项目,在CI配置中设置触发规则,监听项目源码目录及依赖的内部库目录(避免漏触发依赖变更场景)。以下是主流CI平台的示例:
GitHub Actions(项目流水线配置)
name: Publish my-project on: push: paths: - 'packages/my-project/**' # 项目自身源码目录 - 'libs/shared-utils/**' # 项目依赖的内部库目录 jobs: publish: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 registry-url: 'https://registry.npmjs.org/' - run: npm install - run: nx build my-project # 二次校验项目是否在变更列表,再执行发布 - run: | CHANGED_PROJECTS=$(nx affected:list --type=project --plain) if echo "$CHANGED_PROJECTS" | grep -q "^my-project$"; then npm publish dist/packages/my-project fi env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
GitLab CI(项目流水线配置)
publish-my-project: stage: publish only: changes: - packages/my-project/** - libs/shared-utils/** script: - npm install - nx build my-project - | CHANGED_PROJECTS=$(nx affected:list --type=project --plain) if echo "$CHANGED_PROJECTS" | grep -q "^my-project$"; then npm publish dist/packages/my-project fi tags: - nodejs
3. 版本管理优化
如果每个项目使用独立版本号,可借助NX的release工具自动更新版本:
nx release version --projects=my-project --no-interactive
执行后会自动修改项目package.json的版本号,发布时即可使用更新后的版本。
4. 关键注意事项
- 依赖覆盖:仅监听目录可能漏判跨项目依赖变更,必须在流水线中结合
nx affected结果二次校验,确保发布逻辑准确。 - 缓存加速:在CI中缓存NX的缓存目录(如
~/.nx),减少nx affected计算时间,提升流水线效率。 - 权限隔离:每个项目的发布流水线应使用独立的发布令牌(如NPM_TOKEN),避免权限溢出风险。
内容的提问来源于stack exchange,提问作者Vince V.
相关产品推荐
相关产品推荐

