Appearance
全局配置
Appearance
一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程,如安装依赖、运行测试、编译、部署测试服务器、部署生产服务器等流程。 任何提交或者 Merge Request 的合并都可以触发 Pipeline,如下图所示:
+------------------+ +----------------+
| | trigger | |
| Commit / MR +---------->+ Pipeline |
| | | |
+------------------+ +----------------+
Stages 表示构建阶段,说白了就是上面提到的流程。 我们可以在一次 Pipeline 中定义多个 Stages,这些 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) 失败, 但可以通过参数设置 allow_failure: true 进行跳过 所以,Jobs 和 Stage 的关系图就是:
+------------------------------------------+
| |
| Stage 1 |
| |
| +---------+ +---------+ +---------+ |
| | Job 1 | | Job 2 | | Job 3 | |
| +---------+ +---------+ +---------+ |
| |
+------------------------------------------+
可以使用GitLab Runner执行这些构建任务,因为 GitLab Runner 可以安装到不同的机器上,所以在构建任务运行期间并不会影响到 GitLab 的性能。 一般来说,构建任务都会占用很多的系统资源 (譬如编译代码),GitLab CI 又是 GitLab 的一部分,GitLab CI 最大的作用是管理各个项目的构建状态,如果由 GitLab CI 来运行构建任务的话,在执行构建任务的时候,GitLab 的性能会大幅下降。
下面是 Debian/Ubuntu/CentOS 的安装方法,其他系统去参考官方文档:
# For Debian/Ubuntu
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-ci-multi-runner
# For CentOS
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
$ sudo yum install gitlab-ci-multi-runner
安装好 GitLab Runner 之后,我们只要启动 Runner 然后和 CI 绑定就可以了:
gitlab-runner register --name="XX" --url="https://git.xx.com/" --token="XXX" --executor="shell"
当注册好 Runner 之后,可以用 sudo gitlab-ci-multi-runner list 命令来查看各个 Runner 的状态:
sudo gitlab-runner list
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
my-runner Executor=shell Token=cd1cd7cf243afb47094677855aacd3 URL=http://mygitlab.com/ci
配置文件在/etc/gitlab-runner/config.toml 配置项类似下面,可能需要手动添加builds_dir和cache_dir这两个变量,再重启服务
[[runners]]
name = "216XX"
url = "https://git.XX.com/"
token = "XX"
executor = "shell"
builds_dir = "/home/gitlab-runner/builds"
cache_dir = "/home/gitlab-runner/cache"
[runners.cache]
sudo gitlab-runner list # 查看各个 Runner 的状态
sudo gitlab-runner stop # 停止服务
sudo gitlab-runner start # 启动服务
sudo gitlab-runner restart # 重启服务
.gitlab-ci.yml 在定义 Pipeline,当我们在项目根目录中添加了 .gitlab-ci.yml 文件后,每次提交代码或者合并 MR 都会自动运行构建任务了。
# 定义 stages
stages:
- build
- test
# 定义 job
job1:
stage: test
script:
- echo "I am job1"
- echo "I am in test stage"
# 定义 job
job2:
stage: build
script:
- echo "I am job2"
- echo "I am in build stage"
根据我们在 stages 中的定义,build 阶段要在 test 阶段之前运行,所以 stage:build 的 jobs 会先运行,之后才会运行 stage:test 的 jobs。
I am job2
I am in build stage
I am job1
I am in test stage
更多语法官方文档
定义 Stages,默认有三个 Stages,分别是 build, test, deploy
variables && Job.variables 定义了环境变量。 如果定义了 Job 级别的环境变量的话,该 Job 会优先使用 Job 级别的环境变量。
cache && Job.cache 定义需要缓存的文件。
每个 Job 开始的时候,Runner 都会删掉 .gitignore 里面的文件。 如果有些文件 (如 node_modules/) 需要多个 Jobs 共用的话,我们只能让每个 Job 都先执行一遍 npm install。 这样很不方便,因此我们需要对这些文件进行缓存。缓存了的文件除了可以跨 Jobs 使用外,还可以跨 Pipeline 使用。
定义 Job 要运行的命令,必填项。
定义 Job 的 stage,默认为 test。
定义 Job 中生成的附件。 当该 Job 运行成功后,生成的文件可以作为附件 (如生成的二进制文件) 保留下来,打包发送到 GitLab,之后我们可以在 GitLab 的项目页面下下载该附件。
when 用于配置作业运行时间的条件。如果未在作业中定义,则默认值为 when: on_success 。
stages:
- build
- cleanup_build
- test
- deploy
- cleanup
build_job:
stage: build
script:
- make build
cleanup_build_job:
stage: cleanup_build
script:
- cleanup build when failed
# cleanup_build_job 仅在失败时 build_job 执行。
when: on_failure
test_job:
stage: test
script:
- make test
deploy_job:
stage: deploy
script:
- make deploy
# 在 GitLab UI 中手动运行时执行 deploy_job 。
when: manual
environment: production
cleanup_job:
stage: cleanup
script:
- cleanup after jobs
# 无论成功或失败,始终 cleanup_job 作为管道中的最后一步执行。
when: always
# Pipeline 分成五个阶段:
# 安装依赖(install_deps)
# 运行测试(test)
# 编译(build)
# 部署测试服务器(deploy_test)
# 部署生产服务器(deploy_production)
stages:
- install_deps
- test
- build
- deploy_test
- deploy_production
cache:
key: ${CI_BUILD_REF_NAME}
paths:
- node_modules/
- dist/
# 安装依赖
install_deps:
stage: install_deps
only:
- develop
- master
script:
- npm install
# 运行测试用例
test:
stage: test
only:
- develop
- master
script:
- npm run test
# 编译
build:
stage: build
only:
- develop
- master
script:
- npm run clean
- npm run build:client
- npm run build:server
# 部署测试服务器
deploy_test:
stage: deploy_test
# 只有当 develop 分支有提交的时候才会触发相关的 Jobs。
only:
- develop
script:
- pm2 delete app || true
- pm2 start app.js --name app
# 部署生产服务器
deploy_production:
stage: deploy_production
# 只有当 master 分支有提交的时候才会触发相关的 Jobs。
only:
- master
script:
- bash scripts/deploy/deploy.sh
#构建阶段-任务
stages:
- analytics
- test
- build
- package
- deploy
#构建工作job名称
build_analytics:
#该工作执行阶段
stage: analytics
#设置只对master分支有效
only:
- master
- tags
tags:
- runner-tag-snoreqube
script:
- echo "=============== 开始代码质量检测 ==============="
- echo "=============== 结束代码质量检测 ==============="
build_test:
stage: test
only:
- master
- tags
tags:
- runner-tag
script:
- echo "=============== 开始测试任务 ==============="
- echo "=============== 结束测试任务 ==============="
build:
stage: build
only:
- master
- tags
tags:
- runner-tag
script:
- echo "=============== 开始编译任务 ==============="
- echo "=============== 结束编译任务 ==============="
package:
stage: package
tags:
- runner-tag
script:
- echo "=============== 开始打包任务 ==============="
- echo "=============== 结束打包任务 ==============="
deploy_test:
stage: deploy
tags:
- runner-tag
#输出在gitlab-ci中设置的变量
script:
- echo "=============== 自动部署到测试服务器 ==============="
- echo "测试服务器:" ${SERVER_TEST}
#环境变量
environment:
name: test
url: https://staging.example.com
deploy_test_manual:
stage: deploy
tags:
- runner-tag
script:
- echo "=============== 手动部署到测试服务器 ==============="
environment:
name: test
url: https://staging.example.com
#设置条件 manual 允许失败
when: manual
deploy_production_manual:
stage: deploy
tags:
- runner-tag
script:
- echo "=============== 手动部署到生产服务器 ==============="
- echo "测试服务器:" ${SERVER_TEST}
environment:
name: production
url: https://staging.example.com
when: manual