GitLab CI 持续集成

简介

从GitLab 8.0开始就把GitLab-Ci集成在GitLab中了,咱们只要在项目中添加一个.gitlab-ci.yml文件,而后添加一个Runner就能够进行持续集成了,GitLab-Ci实现自动化部署流程:用户提交代码->检查是否有.gitlab-ci.yml文件->若是无,则结束;若是有,则调用runner执行脚本->获取返回的结果。git

概念

  • pipline

一次piplien至关于一次构建任务,里面能够包含多个流程,如编译、测试、部署等。任何提交或者MergeRequest的合并均可以触发Pipline,如图:web

  • Stages

Stages表示构建阶段,咱们能够在一个Piplien中定义多个Stages,这些Stages会有如下特色:centos

  1. 全部的Stages会按照顺序运行,即当一个Stages完成后,下一个Stage才开始
  2. 只有当全部Stages完成后,该构建任务(Pipline)才会成功
  3. 若是任何一个Stage失效,那么后面Stages不会执行,该构建任务(Pipline)失效

所以,Stages和Pipline的关系是:缓存

  • Jobs

Jobs表示构建工做,表示某个Stage里面执行工做,咱们能够在Stage里面定义多个Jobs,这些Jobs会有如下特色:服务器

  1. 相同Stage中的Jobs会并行执行。
  2. 相同Stage中的Jobs都执行成功时,该Stage才会成功。
  3. 若是任何一个Job失败,即该构建任务(Pipline)失败。

Jobs和Stage的关系图:ssh

  • gitlab runner

执行构建任务的一个服务,把构建任务放到runner里面而不是在CI里面作是不想把”构建”这个重任(一般较大的工程构建都比较小耗资源) 放到gitlab上而影响gitlab性能。经过把gitlab runner安装到不一样机器上,让这台单独的机器来执行构建任务,GitLab-Runner能够分类两种类型:Shared Runner(共享型)和Specific Runner(指定型):gitlab

  1. Shared Runner:这种Runner(工人)是全部工程都可以用的。只有系统管理员可以建立Shared Runner。
  2. Specific Runner:这种Runner(工人)只能为指定的工程服务。拥有该工程访问权限的人都可以为该工程建立Shared Runner。

向GitLab-CI注册一个Runner须要两样东西:GitLab-CI的url和注册token。若是要注册Shared Runner,你须要到管理界面的Runners页面里面去找注册token。以下图所示:性能

若是要注册Specific Runner,须要到指定的项目中去找对应的token,如图:测试

实践

  • GitLab-Runner的安装与注册

以centos 7为例, 使用了清华大学的镜像,新建 gitlab-ci-multi-runner.repogradle

[root@i-vvwtw5ne ~]# touch /etc/yum.repos.d/gitlab-ci-multi-runner.repo

将如下内容写入文件

[gitlab-ci-multi-runner]
name=gitlab-ci-multi-runner
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ci-multi-runner/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
gpgkey=https://packages.gitlab.com/gpg.key

执行

[root@i-vvwtw5ne ~]# yum makecache
[root@i-vvwtw5ne ~]# yum install gitlab-ci-multi-runner

注册一个Rnner

让Runner启动起来

[root@i-vvwtw5ne ~]# gitlab-runner start

登录到gitlab就能够看到新注册的Runner了,如图:

配置.gitlab-ci.yml文件

在工程目录下增长一个.gitlab-ci.yml文件,内容以下:

# 缓存服务, 若是有文件须要多个stages共用,例如jar/war包
cache:
  paths:
  - target/

# 本次构建的阶段:build package
stages:
- build
- deploy
# 构建 Job
build:
  stage: build
  tags:
  - dev
  only:
   - dev
  script:
  - echo "=============== 开始编译构建和打包任务  ==============="
  - pwd
  - gradle clean build -x test
  # 部署
deploy:
  stage: deploy
  tags:
  - dev
  only:
   - dev
  script:
  - echo "=============== 开始部署任务  ==============="
  # 测试,是否可以经过 ssh 连通远程服务器
  - sshpass -p Falsesoul**** ssh -o StrictHostKeychecking=no root@192.192.18.73
  - echo "=============== 将 jar 包部署到远程服务器上  ==============="
  - sshpass -p Falsesoul**** scp -o StrictHostKeychecking=no /home/gitlab-runner/builds/66b08c53/0/cos/yh-cos/yh-cos-web/build/libs/yh-cos-web-0.0.1.jar  root@192.192.18.73:/opt/war/
  - echo "=============== 开始执行  ==============="
  - sshpass -p Falsesoul**** ssh -o StrictHostKeychecking=no root@192.192.18.73 "sh deploy.sh"

当有提交或Meger request到dev分支的时候,就会自动触发pipline,如图: