JB的git之旅-gitlab ci介绍

说起到持续集成工具,想到的有jenkins、buildbot、gitlab ci,本文就来说讲gitlab ci~git

首先先扫盲:segmentfault

什么是持续集成?

持续集成指的是,频繁地(一天屡次)将代码集成到主干。windows

持续集成的好处主要有两个:
快速发现错误:
每完成一点更新,就集成到主干,能够快速发现错误,定位错误也比较容易。bash

防止分支大幅偏离主干:
若是不是常常集成,主干又在不断更新,会致使之后集成的难度变大,甚至难以集成。服务器

简单总结:
减小风险、减小重复过程、项目更加透明curl

常见的持续集成系统组成

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

  • 一个自动构建过程,包括自动编译、分发、部署和测试等。
  • 一个代码存储库,即须要版本控制软件来保障代码的可维护性,同时做为构建过程的素材库。
  • 一个持续集成服务器

GitLab CI介绍

GitLab CI
GitLab CI 是 GitLab 提供的持续集成服务,只要在你的仓库根目录 建立一个.gitlab-ci.yml 文件, 并为该项目指派一个Runner,当有合并请求或者 push的时候就会触发build。gitlab

GitLab-Runner
单元测试

这个是脚本执行的承载者,.gitlab-ci.yml的script部分的运行就是由runner来负责的。
GitLab-CI浏览过项目里的.gitlab-ci.yml文件以后,根据里面的规则,分配到各个Runner来运行相应的脚本script。测试

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

Pipelines
Pipelines是定义于.gitlab-ci.yml中的不一样阶段的不一样任务。
把Pipelines理解为流水线,流水线包含有多个阶段(stages),每一个阶段包含有一个或多个工序(jobs),
好比先购料、组装、测试、包装再上线销售,每一次push或者MR都要通过流水线以后才能够合格出厂。
而.gitlab-ci.yml正是定义了这条流水线有哪些阶段,每一个阶段要作什么~

+------------------+           +----------------+
|                  |  trigger  |                |
|   Commit / MR    +---------->+    Pipeline    |
|                  |           |                |
+------------------+           +----------------+
复制代码

Stages
Stages 表示构建阶段,说白了就是上面提到的流程。
咱们能够在一次 Pipeline 中定义多个 Stages,每一个Stage能够完成不一样的任务。
Stages有下面的特色:

全部 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始
只有当全部 Stages 完成后,该构建任务 (Pipeline) 才会成功
若是任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败
复制代码

所以,Stages 和 Pipeline 的关系就是:

+--------------------------------------------------------+
|                                                        |
|  Pipeline                                              |
|                                                        |
|  +-----------+     +------------+      +------------+  |
|  |  Stage 1  |---->|   Stage 2  |----->|   Stage 3  |  |
|  +-----------+     +------------+      +------------+  |
|                                                        |
+--------------------------------------------------------+
复制代码

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

相同 Stage 中的 Jobs 会并行执行
相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功
若是任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败
复制代码

因此,Jobs 和 Stage 的关系图就是:

+------------------------------------------+
|                                          |
|  Stage 1                                 |
|                                          |
|  +---------+  +---------+  +---------+   |
|  |  Job 1  |  |  Job 2  |  |  Job 3  |   |
|  +---------+  +---------+  +---------+   |
|                                          |
+------------------------------------------+
复制代码

简单的说,要让CI工做可总结为如下几点:
1)在仓库根目录建立一个名为.gitlab-ci.yml 的文件
2)为该项目配置一个Runner

完成上面的步骤后,每次push代码到Git仓库, Runner就会自动开始pipeline。

CI基本原理

持续集成基本原理实际上很是简单:

  • 1.检测到 git 有新的代码提交(定时检测或主动触发),生成任务
  • 2.agent(真正干活的进程,能够分布在多台机器) 领取任务,拉取代码,运行一段脚本(不管是单元测试仍是 APP 打包,均可以用脚本完成)
  • 3.展现结果:成功与否、测试覆盖率、apk ipa 下载连接等

安装及配置

1.安装runner
本文以win10举例:
首先,下载gitlab-ci-multi-runner-windows-amd64,并将其放到C:\CI

下载地址: https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-ci-multi-runner-windows-amd64.exe

Centos: 安装gitlab-ci-multi-runner:

  • 添加yum源

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

执行后长这样:

只要不报错或者提示找不到的话,就能够了,那接下来就安装了~

yum install gitlab-ci-multi-runner
复制代码

注册等步骤则跟Windows一致~ 2.获取gitlab的runners

点击一个项目->Settings->CI/CD->Runners setting,点击Expand

点击后会打开后runner settings的界面,里面就有runner的url跟token

3.配置runner
回到刚刚配置的目录,楼主是在C:\CI
执行下面的命令:

gitlab-ci-multi-runner-windows-amd64.exe register
复制代码

若是是Linux则以下:

gitlab-ci-multi-runner register
复制代码

而后会要求输入一堆东西,以下图:

1)输入Gitlab CI地址
2)输入项目CI的token
3)输入Runner的描述
4)输入Runner的标签
5)是否运行无标记的构,默认false,后面能够改
6)是否将Runner跟当前项目绑定,默认false,若是不绑定,即为共享runner,后面能够改~
7)输入Runner执行语言
复制代码

执行完后,会发现CI目录会多了个config.toml的文件,里面就是刚刚的配置信息~

若是是Linux,Runner信息放哪里呢?

  • 若是是以root用户身份运行gitlab-ci-multi-runner register,那么配置文件默认是/etc/gitlab-runner/config.toml
  • 若是是以非root用户身份运行gitlab-ci-multi-runner register,那么配置文件默认是~/.gitlab-runner/config.toml
  • 又或者是在当前工做目录下./config.toml

下面须要开启runner服务~

在CI目录下,分别输入install跟start命令:

gitlab-ci-multi-runner-windows-amd64.exe install

gitlab-ci-multi-runner-windows-amd64.exe start
复制代码

若是须要中止,把start修改为stop便可~

输入完毕后,只要没有报错,则说明成功,而后回到gitlab项目-Runner Settings上,会发现多了个runner的信息:

到此为止,runner设置完成了~

关于其余平台的安装到注册,详情请看官网详细介绍,大同小异: https://docs.gitlab.com/runner/install/

4).gitlab-ci.yml
如上面介绍的同样,.gitlab-ci.yml 文件定义GitLab runner要作哪些操做;
它位于项目的根目录。

一个简单的.gitlab-ci.yml

stages:
        - test

    job1:
        stage: test
        script:
            - echo "jb1111112222"
复制代码

很简单,定义了一个叫job1的jobs,stages里面是定义任务执行的顺序,但上面体现不出来,而这个job1里面就是输出jb1111112222这串玩意~
注意:.gitlab-ci.yml是一个YAML文件,因此必需要格外注意锁紧。使用空格,而不是tabs。

假如是这样呢?

# 定义 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"

理所固然的,上面的运行结果就是这样:
I am job2
I am in build stage
I am job1
I am in test stage

根据在 stages 中的定义,build 阶段要在 test 阶段以前运行,因此 stage:build 的 jobs 会先运行,
以后才会运行 stage:test 的 jobs。
复制代码

文件建立好了,内容也定义好了,而后须要添加到git仓库~

git add .gitlab-ci.yml
git commit -m "Add .gitlab-ci.yml"
git push origin master
复制代码

下面为经常使用的关键字信息,通常熟悉就够用了:

有关更多关键字信息,请看下面的文章: https://segmentfault.com/a/1190000010442764#articleHeader5

5)查看pipeline和jobs的状态
成功的配置好Runner后,你应该查看最后一次提交后的状态,从pending、到执行中、成功或失败。

点击进入具体job的执行状况:

gitlab CI大体就介绍完毕了,剩下的就是定义.gitlab-ci.yml文件,作想执行的事情~

遇到的问题

1)gitlab ci结果显示乱码

暂时没找到解决方案

2)runner无故端离线,而后一直start失败,一直提示gitlab-runner: Service is running!, 即便重装gitlab-runner也不能解决问题

现象:

输入gitlab-runner start,卡住好久,而后没有任何日志输出

解决方案: 这种问题,第一思路就是找error log,可是找了好久都没找到error log文件;

最后晚上找到一条命令:

journalctl -u gitlab-runner
复制代码

输入后,会显示log:

直接分析log,最后发现楼主是由于在执行的时候,没有/home/gitlab-runner这个目录致使start失败,解决方案就是建立一个这个目录便可

而后再输入:

gitlab-runner start
gitlab-runner status
复制代码

而后就能看到久违的is running!!

感动啊~为了看到这个提示,都不知道找了多少方法,果真,看log才是王道~

3)gitlab 上一直显示pending

缘由: 在注册gitlab runner的时候,有一步是:

这句话的意思是:是否在没有标记的tag的job上运行,若是选择默认值false,
那没有标记tag的代码提交时不会触发gitlab runner,测试阶段,最好填写true;

那若是是已经建立好的runner,不想从新注册,怎么办?
打开对应的runner界面,点击编辑图标,把run untagged jobs勾上便可;

步骤: projects-settings-CI/CD-Runners settings

这样,就不会再是pending的状态了~

4)权限不够,没法建立目录

这个目录就是问题2手动建立的目录,手动chmod 777 /home/gitlab-runner便可

谢谢你们~

相关文章
相关标签/搜索