CI/CD 不必多说。
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 后台可以看到如图,整个过程称为一个 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