背景
在利用 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 进行深度定制