说起到持续集成工具,想到的有jenkins、buildbot、gitlab ci,本文就来说讲gitlab ci~git
首先先扫盲:segmentfault
持续集成指的是,频繁地(一天屡次)将代码集成到主干。windows
持续集成的好处主要有两个:
快速发现错误:
每完成一点更新,就集成到主干,能够快速发现错误,定位错误也比较容易。bash
防止分支大幅偏离主干:
若是不是常常集成,主干又在不断更新,会致使之后集成的难度变大,甚至难以集成。服务器
简单总结:
减小风险、减小重复过程、项目更加透明curl
一个完整的构建系统必须包括:工具
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。
持续集成基本原理实际上很是简单:
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
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信息放哪里呢?
下面须要开启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:
而后再输入:
gitlab-runner start
gitlab-runner status
复制代码
而后就能看到久违的is running!!
感动啊~为了看到这个提示,都不知道找了多少方法,果真,看log才是王道~
3)gitlab 上一直显示pending
缘由: 在注册gitlab runner的时候,有一步是:
那若是是已经建立好的runner,不想从新注册,怎么办?
打开对应的runner界面,点击编辑图标,把run untagged jobs勾上便可;
步骤: projects-settings-CI/CD-Runners settings
这样,就不会再是pending的状态了~
4)权限不够,没法建立目录
这个目录就是问题2手动建立的目录,手动chmod 777 /home/gitlab-runner便可
谢谢你们~