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的项目从自动部署到重启服务,整个就算完成。

posted @ 2020-07-30 16:44  srsly  阅读(7213)  评论(2编辑  收藏  举报