Gitlab的CI/CD初尝试
初衷:今天公司的前端和测试人员吵起来了。原因是测试埋怨前端人员把Bug的状态更改为已解决,结果代码根本没提交,而前端人员埋怨测试测的太频繁了,需要打几个环境的包不方便。又要改东西又要频繁打包费时间。凡正各有各的理由,就是不想办法解决问题。
哎,没办法,为了解决这种问题,我打算看看Gitlab的CI集成,如果能弄上这个那么开发只管提代码就行了,会自动构建环境。
我这也是现学现卖,今天照着官网和查资料,刚把基本的流程跑通,中间还是费了点时间的,这里记录下
按照官网上说的,要使用CI,就弄两个东西就行了
1 在你的项目工程中创建.gitlab-ci.yml文件,这个文件主要是配置Piplines和stages以及脚本。gitlab-runner就是执行这个文件来构建环境的。
2 安装和配置gitlab-runner,一个Go写的工具,用于执行.gitlab-ci.yml里面的脚本。
一 创建.gitlab-ci.yml
stages:
- deploy
deploy_develop:
stage: deploy
tags:
- nodejs
script:
- echo "hello,ci/cd"
only:
- dev
上面的文件我定义了一个piplines(deploy), 然后定义了一个job(deploy_develop), 只对dev分支有效,执行这个job时,会输出"hello,ci/cd"
二 gitlab-runner的安装和配置
这个gitlab-runner不需要和gitlab在一台机器上,甚至可以是在本地机器。相反官方也建议单独是最好的,构建必须要耗性能呀,不影响其它业务就好。
安装gitlab-runner
https://docs.gitlab.com/runner/install/linux-manually.html
我是按照官方的步骤一步步来的,系统是Centos,如果是其它系统按照上面的安装方式就行
sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
如果需要设置环境变量,则设置/usr/local/bin到PATH中
设置可执行权限
sudo chmod +x /usr/local/bin/gitlab-runner
增加一个单独用户用于gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
安装服务和启动
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
三 配置gitlab-runner
安装好gitlab-runner后,需要注册下,runner和gitlab之间通过Api通信的
gitlab-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://172.18.10.22/
上面这个url从gitlab的pipelines里面的Specific Runners去找
四 遇到的问题
- 提交了代码没有触发,一直停留在pending
报错:This job is stuck, because you don't have any active runners that can run this job.
需要tags,值为在gitlab-runner注册的时候设置的
stages:
- deploy
deploy_develop:
stage: deploy
tags:
- nodejs
script:
- echo "hello,ci/cd"
only:
- dev
- 遇到使用git clone拉取代码权限问题
我安装gitlab-runner的时候使用的是新建的一个用户,然后在gitlab-runner的安装机器上使用git clone代码时报权限问题。
需要将gitlab对应的公钥加到用户的.ssh/目录下面
经过上面的步聚,基本的CI就完成了,在以后的开发中,只需要将代码合到相应的分支,就会按照.gitlab-ci.yml里面的脚本构建了,记得在上家公司刚看到这个的时候感觉好厉害呀,只不过一直没动手弄过,今天自已动手试了下不光印象要深刻些,感觉也没有像以前那么神秘了。
我这个只是跑通了基本的,接下来还用弄nodejs和webpack前端打包这个,这个到时候弄一个shell脚本,然后定义在gitlab-ci.yml里面就行了。
PS:这里不得不喷下公司的运维,平时啥事都不干,四个运维除了平时发个版本一点事情没有,而且不管是环境还是什么,从来不管的,都是开发自已在弄。要一个线上的只读权限库也不肯给,说有安全问题,线上的有些问题完全没法查。
而且,更可笑的时,线上的发版你都没法想像,都是我们本地打成压缩包到指定的文件夹,然后他们再一台台机器发布,什么年代了,还整得这么原始。有这时间好好研究下现在的工具提高效率多好。关键是我们的leader也差不多这想法,导致这种事一直压着。
就像今天安装Ci这个,我开始以为gitlab-runner一定要装在gitlab的机器,去找他们开权限,结果他们以没有听过Ci是啥和可能有安全性为由拒绝了,后面看到官方文档说可以不在一台机器,就找了一台我们部门内部的一台测试机安装的。哎,真是无语了。
程序员的危机大部分也是自已造成的,自已不思进取。等那天被淘汰时,又会责怪现实的无情,须不知这一切和自已有很大的关系,很庆幸我还一直在努力,保持学习的习惯。