本文将会对Gitlab CI进行简要介绍,包括Gitlab Runner,Gitlab CI中的相关概念以及.gitlab-ci.yml的经常使用配置。html
那么,GitLab CI 是什么?linux
GitLab CI 是GitLab内置的进行持续集成的工具,只须要在仓库根目录下建立.gitlab-ci.yml 文件,并配置GitLab Runner;每次提交的时候,gitlab将自动识别到.gitlab-ci.yml文件,而且使用Gitlab Runner执行该脚本。git
GitLab-Runner就是一个用来执行.gitlab-ci.yml 脚本的工具。能够理解成,Runner就像认真工做的工人,GitLab-CI就是管理工人的中心,全部工人都要在GitLab-CI里面注册,而且代表本身是为哪一个项目服务。当相应的项目发生变化时,GitLab-CI就会通知相应的工人执行对应的脚本。github
GitLab-Runner能够分类两种类型:Shared Runner(共享型)和Specific Runner(指定型)。web
以Linux为例:docker
# For Debian/Ubuntu curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.deb.sh | sudo bash # For RHEL/CentOS curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
其余系统请参考官网文档: https://docs.gitlab.com/runne...shell
安装好Runner以后,须要向Gitlab进行注册,注册Runner须要GitLab-CI的url和token。可根据需求注册选择所需类型Runner。segmentfault
获取Shared Runner注册Token:
使用管理员用户登陆,进入Admin Area->OverView->Runners界面。api
获取Specific Runner注册Token:
进行项目仓库->settings->CI/CD界面数组
执行gitlab-ci-multi-runner register命令进行Runner注册,期间会用到前期获取的url及token;注册完成以后,GitLab-CI就会多出一条Runner记录:
更多系统注册,请参考阅读官方文档:https://docs.gitlab.com/runne...
每一个推送到 Gitlab 的提交都会产生一个与该提交关联的管道(pipeline),若一次推送包含了多个提交,则管道与最后那个提交相关联,管道(pipeline)就是一个分红不一样阶段(stage)的做业(job)的集合。
阶段是对批量的做业的一个逻辑上的划分,每一个 GitLab CI/CD 都必须包含至少一个 Stage。多个 Stage 是按照顺序执行的,若是其中任何一个 Stage 失败,则后续的 Stage 不会被执行,整个 CI 过程被认为失败。
以图中所示为例,整个 CI 环节包含三个 Stage:build、test 和deploy。
下图是Gitlab对阶段和阶段状态的展现:
做业就是运行器(Runner)要执行的指令集合,Job 能够被关联到一个 Stage。当一个 Stage 执行的时候,与其关联的全部 Job 都会被执行。在有足够运行器的前提下,同一阶段的全部做业会并发执行。做业状态与阶段状态是同样的,实际上,阶段的状态就是继承自做业的。
做业必须包含script(由Runner执行的shell脚本),随着项目愈来愈大,Job 愈来愈多,Job 中包含的重复逻辑可能会让配置文件臃肿不堪。.gitlab-ci.yml 中提供了 before_script 和 after_script 两个全局配置项。这两个配置项在全部 Job 的 script 执行前和执行后调用。
Job 的执行过程当中每每会产生一些数据,默认状况下 GitLab Runner 会保存 Job 生成的这些数据,而后在下一个 Job 执行以前(甚至不局限于当次 CI/CD)将这些数据恢复。这样即使是不一样的 Job 运行在不一样的 Runner 上,它也能看到彼今生成的数据。
在了解了 Job 配置的 script、before_script、after_script 和 cache 之后,能够将整个 Job 的执行流程用一张图归纳:
从7.12版本开始,GitLab CI使用YAML文件(.gitlab-ci.yml)来管理项目配置。该文件存放于项目仓库的根目录,而且包含了你的项目如何被编译的描述语句。YAML文件使用一系列约束叙述定义了Job启动时所要作的事情。
Job是.gitlab-ci.yml文件中最基本的元素,由一系列参数定义了任务启动时所要作的事情,用户能够建立任意个任务;每一个任务必须有一个独一无二的名字,但有一些保留keywords不能用于Job名称,image,services,stages,types,before_script,after_script,variables,cache。
Job被定义为顶级元素,而且至少包括一条script语句,若是一个 Job 没有显式地关联某个 Stage,则会被默认关联到 test Stage。
示例:
job1: # 关联到bulid阶段 stage: build # 所需执行的脚本 script: - execute-script-for-job1
下面是关于配置CI/CD管道的经常使用参数详细说明。
用于定义全部做业(job)可使用的全局阶段,gitlab-ci.yml容许灵活定义多个阶段,stages元素的顺序定义了做业执行的顺序。Job关联的stage名相同时,该多个Job将并行执行(在拥有足够Runner状况下)。下一个阶段的job将会在前一个阶段的job都完成的状况下执行。
若是文件中没有定义 stages,那么则默认包含 build、test 和 deploy 三个 stage。Stage 中并不能直接配置任何具体的执行逻辑,具体的执行逻辑应该在 Job 中配置。
示例:
stages: - build - test - deploy
阶段是根据每一个Job定义的,而且依赖于全局定义的阶段。它容许将做业(Job)分组到不一样的阶段。
示例:
stages: - build - test - deploy job 1: stage: build script: make build dependencies job 2: stage: build script: make build artifacts job 3: stage: test script: make test job 4: stage: deploy script: make deploy
script是一段由Runner执行的shell脚本。
示例:
job: script: "bundle exec rspec"
这个参数也可使用数组包涵好几条命令:
job: script: - uname -a - bundle exec rspec
有些时候,script命令须要被单引号或者双引号所包裹。举个例子,命令中包涵冒号的时候,该命令须要被引号所包裹,这样YAML解析器才知道该命令语句不是“key: value”语法的一部分。当命令中包涵如下字符时须要注意打引号:: { } [ ] , & * #? | - < > = ! % @ `
这两个选项容许开发者指定任务运行时所需的自定义的docker镜像和服务。
示例:
#为每一个做业定义不一样的映像和服务 test:2.1: image: ruby:2.1 services: - postgres:9.3 script: - bundle exec rake spec test:2.2: image: ruby:2.2 services: - postgres:9.4 script: - bundle exec rake spec
before_script是用于定义一些在全部任务执行前所需执行的命令, 包括部署工做,能够接受一个数组或者多行字符串。after_script用于定义全部job执行事后须要执行的命令,能够接受一个数组或者多行字符串。
示例:
#定义全局 before_script: default: before_script: - global before script #覆盖全局before_script job: before_script: - execute this instead of global before script script: - my command after_script: - execute this after my script
如下是这两个参数的几条用法规则:
此外,only和except容许使用如下一些特殊关键字:
值 | 描述 |
---|---|
branches | 当一个分支被push上来 |
tags | 当一个打了tag的分支被push上来 |
api | 当一个pipline被piplines api所触发调起,详见piplines api(https://docs.gitlab.com/ce/ap...) |
external | 当使用了GitLab之外的CI服务 |
pipelines | 针对多项目触发器而言,当使用CI_JOB_TOKEN并使用gitlab所提供的api建立多个pipelines的时候 |
pushes | 当pipeline被用户的git push操做所触发的时候 |
schedules | 针对预约好的pipline而言(每日构建一类~,具体请看https://docs.gitlab.com/ce/us...) |
triggers | 用token建立piplines的时候 |
web | 在GitLab页面上Pipelines标签页下,你按了run pipline的时候 |
下面的例子,job将会只在issue-开头的refs下执行,反之则其余全部分支被跳过:
job: # use regexp only: - /^issue-.*$/ # use special keyword except: - branches
更多配置详情,请参考官网文档:
https://docs.gitlab.com/ee/ci...
GitLab CI的每一个实例都有一个名为Lint的嵌入式调试工具,它能够验证.gitlab-ci.yml文件的内容,进入项目仓库->CI/CD->CI Lint,示例以下:
参考文档:
Choerodon 猪齿鱼做为开源多云应用敏捷全链路技术平台,是基于开源技术Kubernetes,Istio,knative,Gitlab,Spring Cloud来实现本地和云端环境的集成,实现企业多云/混合云应用环境的一致性。平台经过提供精益敏捷、持续交付、容器环境、微服务、DevOps等能力来帮助组织团队来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。
更加详细的内容,请参阅Release Notes和官网。
你们也能够经过如下社区途径了解猪齿鱼的最新动态、产品特性,以及参与社区贡献:
欢迎加入Choerodon猪齿鱼社区,共同为企业数字化服务打造一个开放的生态平台。
本篇文章出自 Choerodon猪齿鱼社区史常萍。