CI/CD 不必多说。

gitlab ci

CI/CD 解决的问题:

  • 重复劳动
  • 等待时间
  • 手工出错

基本概念

gitlab CI 依赖于项目根目录中定义的 .gitlab-ci.yml 文件,这个文件定义了 GitLab CI 应该做的事情。每次提交代码 GitLab 会检查该文件,然后将该文件定义的内容提交给 GitLab Runner 执行。

CI/CD

  • CI : Continuous integration,持续集成,代码有改动时触发编译、测试、打包等一系列构建操作,最后生成一个可部署的构件。指开发⼈人员在特定分⽀支(频繁)提交代码,⽴立即执⾏行行构建和单元测试,代码通过测试标准后集成到主⼲干的过程。强调的是分⽀支代码的提交、构建与单元测试。
  • Continuous Delivery,持续交付,在持续集成的基础上,将构建的代码部署到「类⽣生产环境」
  • Continuous Deployment, 持续部署,CI 之后自动化地部署或交付给客户使用。

pipeline

gitlab-ci 中配置的所有可执行的 job 称为 pipeline,Pipeline 可以认为是一次构建过程。Pipeline 中可以包含多个 stage.

gitlab-ci-pipeline

在 GitLab 后台可以看到如图,整个过程称为一个 pipeline,这个 pipeline 包括两个 stage(阶段)。每个阶段就只有一个任务,gitlab-ci 在运行时只有当一个 stage 中所有的任务都执行完成才会进入下一个 stage.

首先来对 .gitlab-ci.yml 文件有一个整体的了解。

# 定义 stages
stages:
  - test
  - build

# 定义 job
job1:
  stage: test
  script:
    - echo "test stage"

job1_1:
  stage: test
  script:
    - echo "test stage: job1_1"

# 定义 job
job2:
  stage: build
  script:
    - echo "build stage"

stage

stage 可以理解为阶段,是 gitlab-ci 的概念,流程中的阶段,可以包括测试,编译,发布,部署等,在 .gitlab-ci.yml 文件中会用到。

  • GitLab CI 文件中必须包含至少一个 stage
  • 多个 stage 按照顺序执行
  • 如果其中任何一个 stage 发生错误,之后的所有 stage 都不会被执行。
  • 同样只有所有的 stage 都成功,Pipeline 才会成功

定义:

- stages:
  - build
  - deploy
  - release

job 或者 app

job 或者又被称为 app,由 job 组成 gitlab-ci 的 stage 阶段,多个 job 可以并发执行。

  • 同一个 stage 下的 job 会并行执行
  • 同一个 stage 下的 job 都执行成功,该 stage 才会成功
  • 如果 job 执行失败, 那么该 stage 失败,pipeline 失败,该次构建过程失败

举例:

build_front:
  stage: build
build_backend:
  stage: build

上面两个 app (build_front, build_backend) 将会在 build 阶段并发执行。

variables

gitlab-ci 中集成了很多默认的变量,可以通过 variables 关键字来定义自己的变量,也可以在 gitlab 提供的界面上配置。gitlab 提供的 UI 可以配置全组或者 project 级别的环境变量。

  • group 级别
  • project 级别

比如一些敏感的信息,比如 Nexus 密码,Docker Registry 密码或者密钥之类等等

GitLab Runner

GitLab CI 中是 Runner 真正在执行 .gitlab-ci.yml 中定义的任务,Runner 可以是虚拟机,物理机,Docker 容器或者容器集群。GitLab 和 GitLab Runner 直接通过 API 通信,所以需要保证 GitLab 和 Runner 直接可以通过 HTTP 进行通信。

GitLab Runner 可以分为两种类型: Shared Runner (共享型) 和 Specific Runner(指定)

  • Shared Runner: 所有工程都可以使用,只有系统管理员可以创建
  • Specific Runner: 只有特定的项目可以使用

Install Runner

GitLab Runner 的安装参考官方网站 即可,代码也是开源的.

常用关键词

全部的关键词可以在官网 查看。

script

最常用的一个关键词了,script 定义具体需要执行的任务。

before_script

before_script 定义在每一个 job 之前的任务,必须是 Array 类型。

after_script

after_script 每一个 job 之后执行,即使 job 失败了也会执行,Array 类型。

cache

定义需要缓存的文件或者路径。

Use case

对部分文件修改判断是否触发该阶段

有时候没有修改一些可能需要重新跑 build 的代码,不想 GitLab Runner 空跑,可以使用 only 关键字,以及 change 关键字实现只有部分文件改动后再触发 build.

only: # 下面的条件都成立
  refs: # 下面的分支中任一分支改变
    - release
  changes: # 下面的文件中任一文件发生改变
    - .gitlab-ci.yml
    - Dockerfile

当 release 分支改变,同时 .gitlab-ci.yml 文件或者 Dockerfile 文件发生改变时,触发这个阶段的执行。

多个模块编译方式不同

假如一个项目中集成了很多个模块,而每一个模块中的内容编译方式都不同。那么可以使用 gitlab-ci 提供的 include 关键字,对各个模块进行分拆。在每一个模块下放置 .gitlab-ci.yml 文件,然后再到根目录中创建 .gitlab-ci.yml 文件使用 include 关键字引入进来,对各个模块进行解耦。

include:
  - local: module1/.gitlab-ci.yml
  - local: module2/.gitlab-ci.yml

模板

集成 sonar

Build:
 stage: build
 script:
 - echo 'build projects'
 - "mvn $MAVEN_CLI_OPTS clean compile -Dmaven.test.skip=true"
 - 'mvn $MAVEN_CLI_OPTS -U clean package -Dmaven.test.skip=true'
 - 'mvn $MAVEN_CLI_OPTS sonar:sonar -Dsonar.projectKey=projectname -Dsonar.host.url=http://url -Dsonar.login=xxxxx'

Test:
 stage: test
 script:
 - echo 'test projects'
 - 'mvn $MAVEN_CLI_OPTS clean test'
 only:
  - master
  - staging

reference