参考博文:基于gitlab-ci的CICD
概念
GitLab-CI
GitLab自带的持续集成系统,负责.gitlab-ci.yml脚本解析。
GitLab-Runner
脚本执行的承载者。GitLab-CI解析.gitlab-ci.yml文件后,根据里面配置的规则,分配到各个Runner来运行相应的脚本script。
.gitlab-ci.yml
位于git项目根目录,记录了一系列的阶段和执行规则。
Pipeline
一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。
Stages
构建阶段(上述所说的流程)。一次 Pipeline 中可以定义多个 Stages,所有 Stages 会按顺序运行,前一个 Stage 完成后,下一个才会开始。只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功。任何一个 Stage 失败,后面的 Stages 都不会执行,该构建任务失败。
Jobs
构建工作,某个 Stage 里面执行的具体内容。我们可以在 Stages 里面定义多个 Jobs,相同 Stage 中的 Jobs 会并行执行。相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功,如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败。
流程
安装部署
添加gitlab官方库
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
安装最新版本的gitlab-runner
yum -y install gitlab-runner
启动服务
gitlab-runner list 查看各个 Runner 的状态
gitlab-runner stop 停止服务
gitlab-runner start 启动服务
gitlab-runner restart 重启服务
注册
需要先获取令牌。详细步骤请移步文章顶部参考博文。
.gitlab-ci.yml配置
这个文件大家参考意义不大,调用的命令很多是自定义的。博主主要是想记录下。
variables:
# 构建结果发送邮件(服务端python实现)
RECIEVER: xxx@yyy.com;
SYS_NAME: jinghailu
BASE_DIR: /export/App/
BACKUP_DIR: /export/App/bak/
BUILD_DIR: ./_build/
DEV_ALPHA_IP: **.**.**.**
DEV_DATABANK_IP: **.**.**.**
# 三个IP分别对应国内、泰国、印尼
UAT_IP: **.**.**.** **.**.**.** **.**.**.**
.env_init: &env_init |
# develop / master
IP_LIST="${UAT_IP}"
# 从分支dev-alpha提交代码并push
if [[ "${CI_COMMIT_REF_NAME}" == "dev-alpha" ]]; then
IP_LIST="${DEV_ALPHA_IP}"
fi
# 从分支dev-databank提交push
if [[ "${CI_COMMIT_REF_NAME}" == "dev-databank" ]]; then
IP_LIST="${DEV_DATABANK_IP}"
fi
#if [[ -n "${CI_COMMIT_TAG}" ]]; then
#IP_LIST="${UAT_IP}"
#fi
before_script:
- *env_init
# - PATH=$PATH:/export/servers/node-v10.15.1/bin/
cache:
key: "$CI_COMMIT_REF_NAME"
paths:
- node_modules/
- deploy.tar.gz
# for uat env
package-develop:
stage: build
script:
- npm install
- npm run build:uat
- mkdir $BUILD_DIR
- cp -r ./dist/ $BUILD_DIR/resource
- cp -r ./jdos/* $BUILD_DIR
- chmod a+x $BUILD_DIR/bin/*
- cd $BUILD_DIR && tar czvf ../deploy.tar.gz * && cd ..
- download_url=`upload-deploy-package -f deploy.tar.gz -r ${SYS_NAME}/${CI_COMMIT_REF_NAME}.tar.gz`
- my-sendmail -s "publish-${SYS_NAME}" -c "You could deploy in jdos now! </br></br> <b>Branch:</b> ${CI_COMMIT_REF_NAME} </br> <b>Commit:</b> ${CI_COMMIT_MESSAGE} </br> <b>Commit Author:</b> ${GITLAB_USER_NAME} </br> <b>Download Url:</b> ${download_url}" -r "$RECIEVER"
only:
- develop
- dev-alpha
- dev-databank
# for master env
package-master:
stage: build
script:
- npm install
- npm run build
- mkdir $BUILD_DIR
- cp -r ./dist/ $BUILD_DIR/resource
- cp -r ./jdos/* $BUILD_DIR
- chmod a+x $BUILD_DIR/bin/*
- cd $BUILD_DIR && tar czvf ../deploy.tar.gz * && cd ..
- download_url=`upload-deploy-package -f deploy.tar.gz -r ${SYS_NAME}/${CI_COMMIT_REF_NAME}.tar.gz`
- my-sendmail -s "publish-${SYS_NAME}" -c "You could deploy in jdos now! </br></br> <b>Branch:</b> ${CI_COMMIT_REF_NAME} </br> <b>Commit:</b> ${CI_COMMIT_MESSAGE} </br> <b>Commit Author:</b> ${GITLAB_USER_NAME} </br> <b>Download Url:</b> ${download_url}" -r "$RECIEVER"
only:
- master
# Auto Deploy
deploy:
stage: deploy
script:
- echo $IP_LIST
- for ip in $IP_LIST; do
- echo $ip
# backup files
- ssh admin@$ip "cd $BASE_DIR && mkdir -p $BACKUP_DIR && tar czvf /export/App/bak/resource-`date +%Y%m%d%H`.tar.gz resource/ bin/"
# stop service
- ssh admin@$ip "cd /export/App/bin && /export/App/bin/stop.sh"
# send file
- scp deploy.tar.gz admin@$ip:$BASE_DIR
# deploy files
- ssh admin@$ip "cd $BASE_DIR && \rm -rf ./resource && tar xzvf deploy.tar.gz && \rm deploy.tar.gz"
# work only in pre-production env
# - ssh admin@$ip "cd $BASE_DIR/nginx && \cp jinghailu.jd.com_yufa agent"
# start service
- ssh admin@$ip "cd /export/App/bin && /export/App/bin/start.sh"
- done
- my-sendmail -s "deploy-${SYS_NAME}" -c "Deployed successfully! </br></br> <b>Branch:</b> ${CI_COMMIT_REF_NAME} </br> <b>Commit:</b> ${CI_COMMIT_MESSAGE} </br> <b>Commit Author:</b> ${GITLAB_USER_NAME}" -r "$RECIEVER"
only:
- master
- develop
- dev-alpha
- dev-databank
笔记
处理流程:
- 制定分支push
- 构建阶段 - 安装依赖(服务端每次拉取最新代码时更新依赖库)
- 构建阶段 - 执行打包命令
- 构建阶段 - 压缩包传到oss平台
- 构建阶段 - 发送邮件,附oss访问地址
- 部署阶段 - 遍历IP,从oss拉包到部署服务器,启动脚本
Tip:
- 相同 Stage 中的 Jobs 会并行执行
- job越少耗时越短。尝试过拆分更细粒度的阶段,阶段越多耗时越长。故最终还是只用了2个阶段。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。