1 持续集成
gitlab-ci全称是gitlab continuous integration的意思,也就是持续集成,中心思想是当每一次push到gitlab的时候或者每隔一定时间,都会触发一次脚本(.gitlab-ci.yml)执行,然后脚本的内容包括了测试,编译,部署等一系列自定义的内容。
2 GitLab CI相关概念
- pipeline
:相当于一次构建任务(执行脚本),面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。
+------------------+ +----------------+
| | trigger | |
| Commit / MR +---------->+ Pipeline |
| | | |
+------------------+ +----------------+
- Stages:表示构建阶段,一次任务里有多个阶段,这些阶段有一下特点:
- 所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始。
- 只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功。
- 如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败。
Stages 和 Pipeline 的关系就是:
+--------------------------------------------------------+
| |
| Pipeline |
| |
| +-----------+ +------------+ +------------+ |
| | Stage 1 |---->| Stage 2 |----->| Stage 3 | |
| +-----------+ +------------+ +------------+ |
| |
+--------------------------------------------------------+
- Jobs 表示构建工作,表示某个 Stage 里面执行的工作。我们可以在 Stages 里面定义多个 Jobs,这些 Jobs 会有以下特点:
- 相同 Stage 中的 Jobs 会并行执行
- 相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
- 如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败
Jobs 和 Stage 的关系图就是:
+------------------------------------------+
| |
| Stage 1 |
| |
| +---------+ +---------+ +---------+ |
| | Job 1 | | Job 2 | | Job 3 | |
| +---------+ +---------+ +---------+ |
| |
+------------------------------------------+
3 编写.gitlab-ci.yml 文件
实用例子:
######################## 定义以下五个阶段 ###########################
stages:
- install_deps
- test
- build
- deploy_test
- deploy_production
#加载缓存
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
- dist/
######################## job ###########################
# 安装依赖
install_deps:
stage: install_deps
only:
- develop
- master
script:
- npm install
######################## job ###########################
# 运行测试用例
test:
stage: test
only:
- develop
- master
script:
- npm run test
######################## job ###########################
# 编译
build:
stage: build
only:
- develop
- master
script:
- npm run clean
- npm run build:client
- npm run build:server
######################## job ###########################
# 部署测试服务器
deploy_test:
stage: deploy_test
only:
- develop
script:
- pm2 delete app || true
- pm2 start app.js --name app
######################## job ###########################
# 部署生产服务器
deploy_production:
stage: deploy_production
only:
- master
script:
- bash scripts/deploy/deploy.sh
每一个job内常用的几个关键字
关键字 | 是否必须 | 描述 |
---|---|---|
script | Y | 定义一些由Runner执行脚本命令 |
stage | N | 定义job的阶段 |
before_script | N | 定义job运行前都会执行的命令 |
after_script | N | 定义任何 Jobs 运行完后都会执行的命令。 |
variables | N | 定义一些变量 |
cache | N | 定义需要缓存的文件 |
only | N | 定义要构建工作的分支 |
except | N | 定义要不需要构建工作的分支 |
when | N | 定义如何运行下一个阶段,参数有:on_success、 on_failure、always 、 manual(手动) |
参考:
http://scarletsky.github.io/2016/07/29/use-gitlab-ci-for-continuous-integration/