持续集成
首先,我们先了解下什么是集成:
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。
软件集成是软件开发过程中的一个环节,这个环节的工作一般会包括以下流程:合并代码-->审核-->安装依赖-->编译-->测试-->发布。软件集成的工作一般会比较细碎繁琐,为了不影响开发效率,以前软件集成这个环节一般不会经常进行或者只会等到项目后期再进行。但是有些问题,如果等到后期才发现,解决问题的代价很大,有可能导致项目延期或者失败。因此,为了尽早发现软件集成错误,鼓励团队成员应该经常集成他们的工作,通常每个成员每天应该至少集成一次。这就是所说的持续集成。所以说,持续集成是一种软件开发实践。
软件集成的工作细碎繁琐,以前是由人工完成的。但是现在鼓励持续集成,那岂不是要累死人,还影响开发效率。所以,应该考虑将软件集成这个工作自动化,这就出现了所谓的持续集成系统。
持续集成详情可以参见百度百科-持续集成
GitLab-CI
GitLab-CI就是一套配合GitLab使用的持续集成系统(当然,还有其它的持续集成系统,同样可以配合GitLab使用,比如Jenkins)。而且GitLab8.0以后的版本是默认集成了GitLab-CI并且默认启用的。.gitlab-ci.yml的脚本解析就由它来负责。那么在gitlab上在哪里设置呢?
打开gitlab网站:
项目--》Setting--》CI/CD--》Runner--》Expand,如下图:
点击Expand后如下:
GitLab-Runner
那GitLab-Runner又是什么东东呢?与GitLab-CI有什么关系呢?
GitLab-Runner是配合GitLab-CI进行使用的。一般地,GitLab里面的每一个工程都会定义一个属于这个工程的软件集成脚本,用来自动化地完成一些软件集成工作。当这个工程的仓库代码发生变动时,比如有人push了代码,GitLab就会将这个变动通知GitLab-CI。这时GitLab-CI会找出与这个工程相关联的Runner,并通知这些Runner把代码更新到本地(服务器)并执行预定义好的执行脚本。
所以,GitLab-Runner就是一个用来执行软件集成脚本的东西。你可以想象一下:Runner就像一个个的工人,而GitLab-CI就是这些工人的一个管理中心,所有工人都要在GitLab-CI里面登记注册,并且表明自己是为哪个工程服务的。当相应的工程发生变化时,GitLab-CI就会通知相应的工人执行软件集成脚本。如下图:
GitLab-CI与GitLab-Runner关系示意图
Runner可以分布在不同的主机上,同一个主机上也可以有多个Runner。
Runner类型
GitLab-Runner可以分类两种类型:Shared Runner(共享型)和Specific Runner(指定型)。
Shared Runner:这种Runner(工人)是所有工程都能够用的。只有系统管理员能够创建Shared Runner,这种Runner通常用来团队写作使用的。
Specific Runner:这种Runner(工人)只能为指定的工程服务。拥有该工程访问权限的人都能够为该工程创建Shared Runner。
.gitlab-ci.yml
这个是在git项目的根目录下的一个文件,记录了一系列的阶段和执行规则。GitLab-CI在push后会解析它,根据里面的内容调用runner来运行。
安装步骤
安装GitLab-CI
这个不用安装了,GitLab就自带了
安装GitLab-Runner
在ubuntu上安装gitlab-ci-multi-runner
$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
$ sudo apt-get install gitlab-runner
这样就装好了gitlab-ci-multi-runner,然而我们只是装好了gitlab-runner,当然我们要接着向gitlab-CI注册这个runner,不然gitlab-CI在push事件到来的时候怎么知道要调用谁呢?这里也可以发现和webhook方式的区别,webhook方式是我们主动配置了一个连接给gitlab;gitlab-runner只要注册一下就好了。
那么我们就注册一下
$ gitlab-ci-multi-runner register
\#引导会让你输入gitlab的url,输入自己的url,例如http://gitlab.example.com/
\#引导会让你输入token,去相应的项目下找到token,例如ase12c235qazd32
\#引导会让你输入tag,一个项目可能有多个runner,是根据tag来区别runner的,输入若干个就好了,比如web,hook,deploy
\#引导会让你输入executor,这个是要用什么方式来执行脚本,图方便输入shell就好了。
然后就注册好了,在gitlab中相应的位置就可以看到你注册好的runner信息。
这时候的runner是已经运行的,可以使用命令:gitlab-ci-multi-runner status查看状态
编写.gitlab-ci.yml
在项目根目录下编写.gitlab-ci.yml这样在push之后,gitlab-ci就会自动识别来解析了。
stages:
- deploy
deploy:
stage: deploy
script:
- deploy Example_Group Example_Project
only:
- master
tags:
- deploy
这里我们只有一个stage是deploy。only指定了只有在master分支push的时候才会被执行。tags这里要填写deploy,对应了刚才注册runner的时候的tags,否则会报错(This build is stuck, because you don't have any active runners online with any of these tags assigned to them: dev),若是忘记tag是什么,可以到gitlab上查看详细Runner。
最重要的script部分deploy Example_Group Example_Project,这里是一条shell指令,为了方便通用性,deploy是我在服务器上编写的一个脚本,传入参数是Example_Group Example_Project分别是项目组名和项目名。执行这一条指令就能够自动部署到/xxx/Example_Group/Example_Project的服务器目录下。那么随便什么项目都用这个格式去套就好了,这样新项目的自动部署也不需要登录到服务器上去修改了。
- 编写deploy脚本
在gitlab-runner的~/.local/bin/目录下新建deploy文件
$ su gitlab-runner
$ mkdir ~/.local/bin
$ cd ~/.local/bin
$ touch deploy
并编辑成如下内容
#!/bin/bash
if [ $# -ne 2 ]
then
echo "arguments error!"
exit 1
else
deploy_path="/var/www/$1/$2"
if [ ! -d "$deploy_path" ]
then
project_path="git@gitlab.example.com" ##项目的地址
git clone $project_path $deploy_path
else
cd $deploy_path
git pull
fi
fi
这个脚本的大意就是,如果目录不存在,那么就git clone一个,如果存在了就git pull一个到指定目录下。这样就达到了自动部署的目的。记得修改里面的gitlab.example.com的地址,修改为你项目的ssh地址。
加上执行权限,然后把这个脚本放在gitlab-runner的~/.local/bin下就可以生效了(为了不用写难看的./deploy)
$ chmod +x ~/.local/bin/deploy
并且把/.local/bin加到$PATH路径中(用户执行命令时候能够查找到这个目录),只要在/.profile末尾加入这一句话
PATH="$HOME/.local/bin:$PATH"
运行source /etc/profile让配置剩下
- 配置ssh登录
上面的deploy脚本是用ssh方式来和gitlab联系的。所以要给gitlab-runner这个用户配置一个gitlab上能ssh的用户。首先在gitlab-runner下生成一个密钥对
$ mkdir ~/.ssh
$ cd ~/.ssh
$ ssh-keygen
提示输入一直按回车默认就可以了
$ cat id_rsa.pub
用cat查看公钥,然后复制这一串公钥。在这个账号的user_profile里面,把公钥粘贴进去就好了(即添加可信性的ssh公钥)。总之就是把这个账号配置成能用ssh登录的。
如果提示脚本没有权限或者没有权限新建文件夹,可能是gitlab-runner没有权限,执行下面的命令,赋予权限即可解决:
chown -hR gitlab-runner:gitlab-runner /var/www
备注:可以在服务器上手动运行下deploy脚本,看是否有问题,好排查
实验
可以push下代码到gitlab上,验证下服务器中是否已经自动git最新代码
参考链接:
gitlab安装runner
centos安装参考
(https://www.cnblogs.com/cnundefined/p/7095368.html)
GitLab-CI与GitLab-Runner