GitLab CI/CD +Shell脚本实现简单的自动代码部署+重新启动dotnet 服务
1.为什么要使用gitlab CI
gitlab自带的CI/CD 就是可持续集成工具,简单来讲,就是开发提交代码,gitlab自动 测试、编译、部署,
省下了很多时间。而且这个简单一点比jenkins+git 那种方式,项目部署不是很多的情况下,可以选择此方法
首先这里需要的三个核心 gitlab runner、.gitlab-ci.yml、然后就是shell脚本
我们一个一个来处理,首先要安装runner
执行命令(如下图应该就算成功了):
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
接下来安装runner,出现complete 就算安装完成了
yum install -y gitlab-ci-multi-runner
然后就是注册,这个步骤是runner和git关联的重要环节,马虎不得
我们来把上面的域名和token去 gitlab服务器复制下来,点开你的项目-然后settings下的CI/CD
找到runner里面有域名和token 复制粘贴到记事本,在下面runner 注册时使用
输入命令,里面有一些参数是后期可以改的,不用慌,输入之后回车就自动下一步了
gitlab-ci-multi-runner register
注册完成后,我们回到gitlab服务器,还是打开runner可以看到下图这样。绿色的就是证明注册成功了,点那个小图标进入编辑
如果不是绿色的 重启runner即可
查看runner状态
gitlab-ci-multi-runner verify
重启所有runner:
gitlab-ci-multi-runner restart
然后就可以修改 刚才的一些配置 我刚才注册时,tags有乱码,现在改过来了
接下来我们写一个shell脚本 起个名字就叫deploy
su gitlab-runner
mkdir ~/.local/bin -p
cd ~/.local/bin
vim 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@你的git项目地址:"$1/$2".git" git clone $project_path $deploy_path else cd $deploy_path git pull fi fi
这个脚本的意识是,先判断是否有两个参数(这个参数是在yml文件里面写的,下面有解释)
然后就是判断是否存在目录,如果不存在则拉取,如果存在,就更新。
添加脚本执行权限
chmod +x ~/.local/bin/deploy
切换到root编辑/etc/profile 在最末尾添加 path路径
PATH="$HOME/.local/bin:$PATH"
给gitlab-runner 用户创建文件权限
chown -hR gitlab-runner:gitlab-runner /var/www
配置 ssh登录 免密操作
su gitlab-runner
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen
cat id_rsa.pub
复制粘贴ssh公钥
复制完成后,我们打开gitlab仓库,复制进去后,点add key 就可以了
appkey在用户下的settings下的 SSH KEY,下面这个是我已经添加完成的,记住:绑定key 的用户一定要有,你需要集成项目的权限。不然无法获取项目
接下来我们在gitlab服务器上创建一个.gitlab-ci.yml 和一个test.txt
script 就是两个变量 jjlg.dev 就是组名称,jjlg.webapi.core是项目名称,为了拉取项目的,里面的空格 一定要遵循,不能乱写,不然编译不过去,
stages: - deploy deploy: stage: deploy only: - master tags: - apiTag script: - bash deploy jjlg.dev jjlg.webapi.core
点 Commit changes 这里红框的部分就是校验 yml格式的,如果写错了会做提示的
其实每次commit 修改文件内容 都会跑一下的,下图就是成功了,可以去服务器看看代码是否已经发布进去了
------------------如果想要做两个项目的集成,只需要在写一个 deploye,里面的内容稍微改一下路径即可
然后在新项目中修改.gitlab-ci.yml指向你的shell脚本,并把权限给好
chmod +x ~/.local/bin/deployvue
chown -hR gitlab-runner:gitlab-runner /usr/local/jjlg.dev/vuepublish(这里是你的新目录,如果两个项目在同一个目录,可以忽略此步骤)
细心的人可能会发现,标签还是 apitag 这里和注册、ssh秘钥都无需改动。在你的新项目的runner里面,把之前的项目标签恢复一下即可,Enable for this project
注意:这里有一个问题,就是第一次获取服务器代码的时候,会需要输入yes,所以执行runner跑脚本的时候会报错
这里报错很无语,说是无法连接远程仓库,害我找了半天,我就在服务器上直接拉取了一下代码,
让我输入yes,这就让我怀疑了,如果用脚本怎么输入呢,还好只是第一次让你输入,我也懒得找办法了,
就直接去服务器,手动拉取一下,然后就可以了,你在试着改一下text 然后push一下
应该没什么问题,我遇到的坑,基本都写清楚了,我这种小白都能成功,估计各位大神也一样可以。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里补充一下,我这边使用的是.net core 代码自动部署完成后,我们要重新启动一下.net core
先进入 su gitlab-runner
编辑deploy脚本 vim ~/.local/bin/deploy
这里的~ 是用户的根目录,比如我们现在用的是gitlab-runner这个用户,
这个用户的目录在/home/gitlab-runner 我们的~ 就是/home/gitlab-runner
.local 就是隐藏文件 和不同文件一样就是多了一个.
这里面加了一个if,判断.NET 进程是否存在,如果不存在则,进入.NET启动文件的目录,去启动
如果存在,还需要先kill一下然后,在去启动,不然会报错,这里的nohup 是后台启动,
后面的>output 2>&1
这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,
所以结果是标准错误和标准输出都导入文件output里面了。
还有就是如果你不加,那么就需要你回车才能继续往下进行,如果在执行runner job的时候,就会一直处于running 的状态
最后的 & 就是结尾,命令的尾部
这里有一个问题需要注意,如果你的.NET 程序是 root用户启动的,那么gitlab-runner 这个用户就无法kill
所以需要先查询一下,ps -ef | grep WebApi.Core.Api.dll 查看一下启动的用户是哪个,如果是root 那么就kill掉
然后进入 su gitlab-runner 找到对应目录 去启动一下,你的runner就不会出错,不然会报错
#!/bin/bash if [ $# -ne 2 ] then echo "arguments error!" exit 99 else deploy_path="/var/www/$1/$2" if [ ! -d "$deploy_path" ] then project_path="git@192.168.171.130:"$1/$2".git" git clone $project_path $deploy_path else cd $deploy_path git pull fi NAME="WebApi.Core.Api.dll" ID=`ps -ef | grep "$NAME" | grep -v "grep" | awk '{print $2}'` str=$"\n" if [ -z "$ID" ];then echo "process id is empty, process is not existed..." echo "process will start..." cd $deploy_path nohup dotnet $NAME --urls="http://*:5000" >output 2>&1 & echo "process has start..." else echo $ID for id in $ID do kill -9 $id echo "killed $id" done echo "process will restart..." cd $deploy_path nohup dotnet $NAME --urls="http://*:5000" >output 2>&1 & echo "process has restart..." fi fi
wq保存,然后在试一下push 看看是否重启了 你的.NET CORE项目, 使用ps -ef |grep 你的项目.dll 查看一下 ip 是否有变化,因为是kill 之后再启动的所以如果生效了就会有变化
或者你可以登录你的gitlab服务器仓库,查看CI/CD的pipelines,点passed
点deploy
最后你会看到
你可以与你写的脚本的输出 比对一下,到此一个.NET CORE的项目从自动部署到重启服务,整个就算完成。