![fe7716da5d56464c8e258e45eac32fd5.png](https://img-blog.csdnimg.cn/img_convert/fe7716da5d56464c8e258e45eac32fd5.png)
背景
服务和服务器开始多起来了,一个个搞效率太低,所以准备用持续集成来提高效率
原理
![d0778dd044c83133d728ba83ff51d488.png](https://img-blog.csdnimg.cn/img_convert/d0778dd044c83133d728ba83ff51d488.png)
push到gitlab之后,触发GitLab-CI,GitLab-CI根据注册信息依次让GitLab-Runner执行对应的任务
步骤
- Step 0:GitLab-CI是gitlab自带的,无需额外安装
- Step 1:安装GitLab-Runner
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash # 添加源
sudo apt-get install gitlab-runner # ubuntu
- Step 2: 注册runner,在此之前需要准备token,根据如下的官网提示操作(我这里选择了shared runner,需要管理员权限)
![1fee5f9a3c51ada0891c1781dc58a273.png](https://img-blog.csdnimg.cn/img_convert/1fee5f9a3c51ada0891c1781dc58a273.png)
![0907f1070e4096e702700384429e091d.png](https://img-blog.csdnimg.cn/img_convert/0907f1070e4096e702700384429e091d.png)
![fc29695358c128e11089b8ab8bb3792b.png](https://img-blog.csdnimg.cn/img_convert/fc29695358c128e11089b8ab8bb3792b.png)
- 注册成功后长这样
![ab4b2f9d32292a45b9349eaa61b41346.png](https://img-blog.csdnimg.cn/img_convert/ab4b2f9d32292a45b9349eaa61b41346.png)
- 关于注册runner的tips:
- 注意 tag可以有多个,各 tag之间用逗号隔开。如果你使用了多个 tag,那么当你想用这个 Runner时,在
.gitlab-ci.yml
的 tag字段里也必须明确指明这些 tags - 如果你选择Docker作为Runner的executor,你还要选择默认的docker image来运行job(当然,你也可以在
.gitlab-ci.yml
里指明你需要用的image) - 注册完成后你可以在
/etc/gitlab-runner
里发现config.toml
文件,该文件是Runner的配置文件
- 注意 tag可以有多个,各 tag之间用逗号隔开。如果你使用了多个 tag,那么当你想用这个 Runner时,在
- Step 3:启动runner
- 直接启动:
sudo gitlab-runner run
-
- 启动为服务:
sudo gitlab-runner install -n "<service-name>" -u <user-name>
sudo gitlab-runner start -n "<service-name>"
user-name就是运行该命令的用户,必须指定,否者会报如下的错误,建议用一个单独的用户(比如:gitlab-runner)进行隔离
![591cd0378b25afbcddaf5f64c140e33d.png](https://img-blog.csdnimg.cn/img_convert/591cd0378b25afbcddaf5f64c140e33d.png)
启动之后,用service命令check服务运行状态
![e3f5513eb764d6b7150fe7bd1cfae8c5.png](https://img-blog.csdnimg.cn/img_convert/e3f5513eb764d6b7150fe7bd1cfae8c5.png)
- Step 4:配置ci任务
- 任务:将一个thrift服务每次push之后进行自动部署
- 编写:部署脚本
#!/bin/bash
if [ $# -ne 2 ]; then
echo "arguments error!<repo-name> and <deploy-path> were required"
echo "example $0 gitlab-username/repo-name /deploy/path/"
exit 1
else
deploy_path=$2
if [ ! -d "$deploy_path" ]; then
project_path="git@git.shengtang.ai:"$1".git"
git clone $project_path $deploy_path
else
cd $deploy_path && git pull
fi
supervisorctl restart service-name
fi
-
- 关于如何使用supervisor部署服务,可以参看:
![45f48050326e57608f0320b2cd3aea81.png](https://img-blog.csdnimg.cn/img_convert/45f48050326e57608f0320b2cd3aea81.png)
-
- 编写
.gitlab-ci.yml
: 在项目的根目录下添加.gitlab-ci.yml
内容如下:
- 编写
stages:
- deploy
deploy:
stage: deploy
script:
- ~/scripts/gitlab-runner/script.sh gitlab-user/repo-name /deploy/path/
only:
- master # 只有在mash push的时候才会触发部署
tags:
- global # gitlab-runner的tag,可以用来区分不同机器上的runner
-
- push上去之后就会自动执行第一次任务,可以在gitlab的对应项目下的piplines中看到(注意:如果名字写的不对的话:如写成了
.gitlab-ci.yaml
的话是看不到任务的,我因为这个问题找了好久的bug(有的地方说可以用yaml,但是我这里是不可以的))
- push上去之后就会自动执行第一次任务,可以在gitlab的对应项目下的piplines中看到(注意:如果名字写的不对的话:如写成了
![450813f16ead72fcf5baf2d41f4a8d4a.png](https://img-blog.csdnimg.cn/img_convert/450813f16ead72fcf5baf2d41f4a8d4a.png)
![058616af2ca963674e6c4d095f5ef929.png](https://img-blog.csdnimg.cn/img_convert/058616af2ca963674e6c4d095f5ef929.png)
- Step 5:多台机器部署
- 方案一:利用上面提到的tag,进行多台机器的部署,但是这里有个问题是:一旦有bug,所有的机器都会同时挂掉,即便没有bug,所有机器同时restart也是个问题
- 方案二(推荐):runner只在一台机器上,其它机器通过ssh命令进行触发(需要配置免密登录),该方法还能自己控制替换的步骤(这对于需要灰度的系统非常重要)
参考资料
gitlab-runner官网:https://docs.gitlab.com/runner/
关于runner的跟多细节:https://www.jianshu.com/p/19fe0ce7ecec