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

  • 相关阅读:
    Jenkins获取运行job的用户名(在构建历史中展示构建人)
    Android -tool工具UIautomatorviewer提示“不能让屏幕黑屏”
    转: 谈谈关于内存的一些心得体会
    IP地址,子网掩码划分(转)
    重定向子进程控制台程序的输入输出
    正则表达式(1)
    Log4Net使用指南(转)
    使用wireshark抓本机之间的包(转)
    VirtualBox开发环境的搭建详解(转)
    SxsTrace工具使用方法(转)
  • 原文地址:https://www.cnblogs.com/xiaojinFat/p/13404761.html
Copyright © 2020-2023  润新知