环境
gitlab: 11.11.8
gitlab-runner: 14.4.0
nodejs: v14.21.3
pm2: 5.4.2
实现效果
- 提交代码到demo分支 才触发流水线
- 判断package.json或package-lock.json 是否发生变化
- 若变化 则执行build+install阶段进行构建并同步代码
- 若没变化 则只是执行deploy阶段仅同步代码
- pm2 重启
- 可选 手动构建
.gitlab-ci.yml
# 定义缓存的内容和路径
cache:
key: ${CI_COMMIT_REF_SLUG} # 使用分支名作为缓存的 key
policy: pull-push
paths:
- node_modules/ # 缓存 node_modules 目录
stages:
- build
- deploy
- manual_install_package
build:
stage: build
script:
- npm install
#- npm install --registry=https://registry.npmmirror.com --sass_binary_site=https://registry.npmmirror.com/node-sass --unsafe-perm
# artifacts:
# paths:
# - node_modules/ # 把 node_modules 作为 artifacts 保存下来供后续多个stages Job使用
only:
#variables:
# - $CI_COMMIT_MESSAGE =~ /build:demo/i
refs:
- demo
changes:
- package.json
- package-lock.json
deploy:
stage: deploy
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
policy: pull
script:
- rsync -avu --delete --exclude='.git/' . /data/web/$CI_PROJECT_NAME/
# - |
# if [ -d /data/web/$CI_PROJECT_NAME ] && [ ! -L /data/web/$CI_PROJECT_NAME ]; then
# echo "Error: /data/web/$CI_PROJECT_NAME exists and is a directory." >&2
# exit 1
# elif [ ! -L /data/web/$CI_PROJECT_NAME ]; then
# ln -s "$(pwd)" /data/web/$CI_PROJECT_NAME
# fi
- cd /data/web/$CI_PROJECT_NAME
- pm2 restart server.json --update-env
only:
refs:
- demo
manual_install_package:
stage: manual_install_package
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
after_script:
- node -v && npm -v
script:
- npm install
- cd /data/web/$CI_PROJECT_NAME
- pm2 restart server.json --update-env
when: manual
only:
refs:
- demo
注:不是想着更新快点 就使用软链接。因为重置机器人编号会变化 导致软链接对不上