0
点赞
收藏
分享

微信扫一扫

Hello Git(九)——GitLab CI持续集成

一、CI持续集成简介

1、CI持续集成简介

CI(Continuous Integration),即持续集成,是一种可以增加项目可见性、降低项目失败风险的开发实践,其目的在于让产品快速迭代的同时,尽可能保持高质量。每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽快地发现集成错误,只有通过自动测试的代码才能进行后续的交付和部署。

CI是团队成员间(产研测)更好地协调工作,更好的适应敏捷迭代开发,自动完成减少人工干预,保证每个时间点上团队成员提交的代码都能成功集成的,可以很好的用于对Android/iOS项目的打包。

2、持续集成的优点

A、快速发现错误

每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。

B、防止分支大幅偏离主干

如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。

3、持续集成的原则

持续集成的原则包括:

A、需要版本控制软件保障团队成员提交的代码不会导致集成失败。

B、开发人员必须及时向版本控制库中提交代码,必须经常性地从版本控制库中更新代码到本地。

C、需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次。

D、必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。

4、持续集成系统的组成

一个完整的构建系统必须包括:

A、一个自动构建过程,包括自动编译、分发、部署和测试等。

B、一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。

C、一个持续集成服务器。

二、CD持续交付、持续部署

 持续交付(Continuous delivery)是频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。

持续部署(continuous deployment)是持续交付的下一步,是代码通过评审后,自动部署到生产环境。

三、GitLab-CI持续集成

1、GitLab-CI简介

GitLab-CI(GitLab Continuous Integration)是一套配合GitLab使用的持续集成系统(其它的持续集成系统同样可以配合GitLab使用,比如Jenkins),GitLab8.0以后的版本默认集成GitLab-CI并且启用。

 GitLab CI是GitLab提供的持续集成服务,只要在仓库根目录创建一个.gitlab-ci.yml 文件, 并为工程指派一个Runner,当有合并请求或者 push的时候就会触发那么每一次合并请求(MR)或者push都会触发CI pipeline。

Pipelines是定义于.gitlab-ci.yml中的不同阶段的不同任务。

.gitlab-ci.yml文件定义GitLab runner要做哪些操作。 默认有3个[stages(阶段)]: build、test、deploy。

当build完成后(返回非零值),会看到push的 commit或者合并请求前面出现一个绿色的对号。 方便开发者检查出来合并请求是否会导致build失败, 免去检查代码。

GitLab CI服务跑build测试, 开发者会很快得到反馈,知道自己提交的代码是否有BUG。

A、在仓库根目录创建一个名为.gitlab-ci.yml的文件

B、为工程配置一个Runner

每次push代码到Git仓库, Runner就会自动开始pipeline。

GitLab CI负责.gitlab-ci.yml脚本的解析,根据.gitlab-ci.yml脚本的规则,分配到各个Runner来运行相应的脚本script。

2、Runner脚本文件

.gitlab-ci.yml脚本文件必须用空格来缩进,不能用tab来缩进。

.gitlab-ci.yml脚本基本示例如下:

# 定义 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关键字用于定义Pipeline中的各个构建阶段,然后用一些非关键字来定义jobs。每个job中可以可以再用stage关键字来指定该 job 对应哪个 stage。job 里面的 script 关键字是最关键的地方了,也是每个 job 中必须要包含的,它表示每个 job 要执行的命令。

stages

定义 Stages,默认有三个 Stages,分别是build,test,deploy。

types

stages的别名。

before_script

定义任何Jobs运行前都会执行的命令。

after_script

要求GitLab 8.7+和 GitLab Runner 1.2+,定义任何Jobs运行完后都会执行的命令。

variables && Job.variables

要求 GitLab Runner 0.5.0+,定义环境变量。
如果定义了 Job 级别的环境变量的话,该 Job 会优先使用 Job 级别的环境变量。

cache && Job.cache

要求 GitLab Runner 0.7.0+

定义需要缓存的文件。
每个 Job 开始的时候,Runner 都会删掉 .gitignore 里面的文件。
如果有些文件 (如 node_modules/) 需要多个 Jobs 共用的话,我们只能让每个 Job 都先执行一遍 npm install。
这样很不方便,因此我们需要对这些文件进行缓存。缓存了的文件除了可以跨 Jobs 使用外,还可以跨 Pipeline 使用。

Job.script

定义Job要运行的命令,必填项。

Job.stage

定义Job的stage,默认为test。

Job.artifacts

定义Job中生成的附件。
当该 Job 运行成功后,生成的文件可以作为附件 (如生成的二进制文件) 保留下来,打包发送到 GitLab,之后我们可以在 GitLab 的项目页面下下载该附件。
.gitlab-ci.yml脚本工程实例:

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
  only:
    - develop
  script:
    - pm2 delete app || true
    - pm2 start app.js --name app

# 部署生产服务器
deploy_production:
  stage: deploy_production
  only:
    - master
  script:
    - bash scripts/deploy/deploy.sh

.gitlab-ci.yml脚本将Pipeline 分成五个阶段:

A、安装依赖(install_deps)

B、运行测试(test)

C、编译(build)

D、部署测试服务器(deploy_test)

E、部署生产服务器(deploy_production)

设置 Job.only 后,只有当develop分支和master分支有提交的时候才会触发相关的Jobs。

四、GitLab-Runner

1、GitLab-Runner简介

GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于自己的软件集成脚本,用来自动化地完成一些软件集成工作。当工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将变动通知GitLab-CI。GitLab-CI会找出与工程相关联的Runner,并通知这些Runner把代码更新到本地并执行预定义好的执行脚本。

Gitlab-runner
是.gitlab-ci.yml脚本的运行器,Gitlab-runner是基于Gitlab-CI的API进行构建的相互隔离的机器(虚拟机),GitLab Runner不需要和Gitlab安装在同一台机器上。构建任务会占用很多的系统资源 (譬如编译代码),而GitLab CI是GitLab的一部分,如果由GitLab CI来运行构建任务的话,在执行构建任务的时候,GitLab的性能会大幅下降,因此,不建议Gitlab和GitLab Runner安装在同一台机器上。

 Runner可以分布在不同的主机上,同一个主机上也可以有多个Runner。

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

Shared Runner:所有开启Allow shared runners选项的工程都能够用,只有系统管理员能够创建Shared Runner。

Specific Runner:只能为指定的工程服务,拥有工程访问权限的人都能够为工程创建Specific Runner。

GitLab上所有的工程都有可能需要在公司的服务器上进行编译、测试、部署等工作,可以注册一个Shared Runner供所有工程使用。

如果在工作机或者服务器上自动构建开发者参与的某个工程,可以注册一个Specific Runner。

对于GitLab的普通用户,没有管理员权限,如果同时参与多个项目,就需要为所有项目都各注册一个Specific Runner,就需要在同一台机器上注册多个Runner。

gitlab-runner是gitlab-ci-multi-runner的符号链接。

2、添加gitlab-runner仓库

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

添加gitlab-ci-multi-runner仓库国内镜像:

[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

3、安装gitlab-runner

sudo yum install gitlab-runner

4、启动gitlab-runner

sudo gitlab-ci-multi-runner start

设置开机启动:

echo "sudo gitlab-ci-multi-runner start" >> /etc/rc.local

5、注册 Runner

Runner需要注册到Gitlab才可以被工程所使用,一个gitlab-ci-multi-runner服务可以注册多个Runner。

sudo gitlab-ci-multi-runner register

交互界面如下:

Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):

http://192.168.1.2/ci   //输入gitlab安装的服务器ip/ci,CI URL

Please enter the gitlab-ci token for this runner:

eaYyokc57xxZbzAsoshT    // 指定Gitlab上工程的Runners选项的注册token

Please enter the gitlab-ci description for this runner:

[E5]: spring-demo       // 填写runner描述信息

Please enter the gitlab-ci tags for this runner (comma separated):

demo                  // 填写tag信息,多个tag可通过逗号,分割。

Registering runner... succeeded                     runner=eaYyokc5

Please enter the executor: docker, docker-ssh, parallels, shell, ssh, virtualbox, docker+machine, docker-ssh+machine:

shell  //输入runner执行方式,Gitlab和runner安装在同一台服务器上,输入shell

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

向GitLab-CI注册一个Runner必须有:GitLab-CI的url和注册token。
token用于确定Runner是所有工程都能够使用的Shared Runner还是具体某一个工程才能使用的Specific Runner。

如果要注册Shared Runner,需要到管理界面的Runners页面里面查找注册token。使用管理员登录,点击Admin Area菜单,右侧导航栏Runners,Shared Runner信息如下:

 对于工程的Specific Runner信息可以通过查看GitLab中工程管理的Projects下拉菜单选择Your Project->Settings->CI/CD->Runners settings。

 在Runners settings中可以查看工程相关的Specific Runner信息。

 注册Runner完成后,可以用sudo gitlab-ci-multi-runner list 命令来查看各个Runner的状态。

 通过gitlab-ci-multi-runner register注册的Runner配置会存储在/etc/gitlab-runner/config.toml中,如果需要修改可直接编辑该文件。

GitLab-CI会为每个Runner生成一个唯一的token,以后Runner就通过token与GitLab-CI进行通信。

在类Unix操作系统下:

如果以root用户身份运行gitlab-ci-multi-runner register,配置文件默认是/etc/gitlab-runner/config.toml

如果以非root用户身份运行gitlab-ci-multi-runner register,配置文件默认是~/.gitlab-runner/config.toml

在其他操作系统下:

配置文件默认在当前工作目录下./config.toml

6、运行Runner

Runner注册完成后必须运行起来,否则无法接收到GitLab-CI的通知并且执行软件集成脚本。

运行单个Runner命令:

gitlab-ci-multi-runner run-single

要让一个Runner运行起来,--url、--token和--executor选项是必要的。其他选项可根据具体情况和需求进行设置。

gitlab-ci-multi-runner run-single --url url --token token --shell

批量地运行Runner命令:

gitlab-ci-multi-runner run

-c, --config选项
用来指定配置文件路径。如果想同时运行多个Runner,必须知道要运行哪些Runner以及这些Runner运行时所需要的信息。配置文件里面就存放着Runner运行时所需要的信息,一个配置文件是可以存放多个Runner的信息。如果不指定本选项,就会使用默认的配置文件。

-n, --service选项
本选项用来指定服务的别名。一次只能运行一批Runner,因为一次只能指定一个配置文件。如果有多个配置文件,要运行多批Runner,给每一次批量运行服务取不同的别名。

-d, --working-directory选项
本选项用来指定此次批量运行服务的工作目录。如果自己没有指定builds_dir,此次运行起来的Runner会把builds_dir放到目录里面。

-u, --user选项
本选项指定以什么用户权限来运行Runner。为了安全,不应该给运行Runner的用户过高的权限,更不应该以root用户来运行Runner。

--syslog选项
本选项指定把日志记录到系统日志。

启动服务后,运行命令ps -aux | grep gitlab-runner查看后台程序,发现启动服务其实就是在后台执行了一个批量运行Runner的任务

举报

相关推荐

0 条评论