基于 Monorepo、Lerna、gitlab 的 CI/CD

4,831 阅读1分钟

背景

在利用 gitlab ci 构建做 CI/CD 过程中会遇到 发布特定项目的内容,本文着重介绍 gitlab ci 如何实现 按需发布!

项目目录与配置

  • projects 为 workspace 的目录合集
.
├── README.md
├── lerna.json
├── node_modules
├── package.json
├── .gitlab-ci.yml
├── projects
├── tsconfig.json
└── yarn.lock

package.json

设置 workspaces

{
......
  "workspaces": [
    "projects/*"
  ],
......
}

lerna.json

{
  "useWorkspaces": true,
  "npmClient": "yarn",
  "version": "0.0.0"
}

CI/CD .gitlab-ci.yml

image: docker:node-v14.15 # 构建镜像版本

variables:
  ROOT_BUILD_PATH: $CI_PROJECT_DIR/build # 全局变量

cache:
  key: $CI_COMMIT_REF_SLUG # 提交分支名称 用作缓存唯一表示
  paths: # 缓存路径
    - node_modules/
    - .yarn

# 构建步骤
stages:
  - install
  - build
  - deploy

# 安装依赖
install_dependency:
  stage: install
  # 把文件传递到下一个job expire_in 过期时间 建议加上
  artifacts:
    # 把没版本跟踪的产物发送到 下一个任务
    untracked: true 
    expire_in: 1 week
  script:
    - mkdir -p $ROOT_BUILD_PATH
    - yarn install --pure-lockfile --prefer-offline --cache-folder .yarn
    
# 构建项目 project1
project1_build:
  stage: build
  variables:
    DIR: 'project1'
  extends:
    - .build_project # 继承构建项目脚本
  only:
    changes:
      - projects/project1/src/**/*.ts # 满足文件修改时触发

# 构建项目 project2
project2_build:
  stage: build
  variables:
    DIR: 'project2'
  extends:
    - .build_project
  only:
    changes:
      - projects/project2/src/**/*.ts

.build_project:
  artifacts:
    untracked: true 
    expire_in: 1 week
  script:
    - cd projects/$DIR
    - yarn build
    - rm -rf $ROOT_BUILD_PATH/$DIR
    - cp -r dist/$DIR $ROOT_BUILD_PATH
  cache:
    policy: pull # 禁止上传更新缓存
  only:
    refs:
      - master # master 提交后触发

deploy_project:
  stage: deploy
  artifacts:
    expire_in: 1 week
    paths:
      - $ROOT_BUILD_PATH
  cache:
    policy: pull
  only:
    refs:
      - master

总结

在脚本到 deploy 的时候会把需要发布的构建后产物收集起来,然后通过 rsync 或者其他同步工具同步到相应的环境 进行下一步操作。 通过以上操作可以完美实现按需构建的过程,另外存在多版本的模式 可以通过 after_script 进行深度定制