Monorepo 按需构建
373 字约 1 分钟
本文介绍如何在 Monorepo 中实现按需构建——仅修改特定目录时触发对应服务的构建任务,避免全量构建的资源浪费。
前置知识
- 语法手册:Pipeline.ifModify
- 系统默认环境变量:CNB_PIPELINE_KEY
配置文件示例
多个包可采用统一模板 + 变量区分的方式,避免复制粘贴。 以 package-1 为例,在每个包名下声明 ifModify、env 与 stages:
.cnb.yml
main:
push:
package-1:
services:
- docker
ifModify:
- packages/package-1/**
env:
PACKAGE: package-1
stages:
- name: set docker tag
script: echo -n "${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:$CNB_COMMIT_SHORT"
exports:
info: IMAGE_TAG
- name: docker build
script: cd packages/$PACKAGE && docker build -t $IMAGE_TAG .
- name: push image
script: docker push $IMAGE_TAG其他包复制该结构,替换 package-1、ifModify 路径与 PACKAGE 值即可。 当包数量较多时,推荐通过 include 将通用 stages 抽为模板文件, 每个包仅需声明 ifModify 和 env 即可复用。
假设通用构建步骤抽为 cnb/build-template.yml:
cnb/build-template.yml
stages:
- name: set docker tag
script: echo -n "${CNB_DOCKER_REGISTRY}/${CNB_REPO_SLUG_LOWERCASE}:$CNB_COMMIT_SHORT"
exports:
info: IMAGE_TAG
- name: docker build
script: cd packages/$PACKAGE && docker build -t $IMAGE_TAG .
- name: push image
script: docker push $IMAGE_TAG主配置通过 include 引入模板,每个包只需关注差异部分:
.cnb.yml
main:
push:
package-1:
services:
- docker
ifModify:
- packages/package-1/**
env:
PACKAGE: package-1
include: cnb/build-template.yml
package-2:
services:
- docker
ifModify:
- packages/package-2/**
env:
PACKAGE: package-2
include: cnb/build-template.yml