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的項目從自動部署到重啟服務,整個就算完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM