docker | jenkins 實現自動化CI/CD,後端躺著把運維的錢掙了!(下)

白澤來了發表於2022-02-14

前言

在上一篇文章中,我們使用docker編寫Dockerfile檔案,將我們自己的專案構建成映象,然後釋出到Docker Hub中,並且用自己的雲伺服器拉取Docker Hub上我們自己上傳的專案映象,並且由該映象執行容器,使得我們成功將自己的專案用docker執行了起來,並且外網訪問測試通過。

如果還沒有使用過docker自己構建過映象的同學還是建議先閱讀第一篇文章:傳送門

image-20220213145129520

在本篇文章中,將講解使用jenkins幫助我們監聽git倉庫的變化,一旦有新的push到master分支,jenkins服務則從gitee主動拉取專案程式碼,構建新映象(藉助上一節編寫好的Dockerfile檔案),然後刪除同名舊映象和舊容器,部署新容器

而對於開發者來說,你向遠端倉庫的master分支push了新的程式碼之後,就可以馬上訪問url看到最新的專案執行結果,一切都將由jenkins幫你完成(只要事先配置好jenkins工作流程)

最初我學程式設計很喜歡看視訊,而且是那種長而全的視訊,總覺得能看到別人每一步的操作就很踏實,但是漸漸的,還是看文件多一些,我也在這裡推薦大家嘗試閱讀文件,英文看起來慢就找中文的,相比於視訊,看文件能快速找到你需要的點,而視訊需要跟著別人的節奏,相對會慢一些。(但剛開始學程式設計我還是推薦看視訊,後面輔以閱讀書籍文件與部落格文章)

jenkins相關

安裝

這裡先給出jerkins的中文文件:https://www.jenkins.io/zh/doc/tutorials/build-a-python-app-with-pyinstaller/,你可以選擇將jenkins服務直接安裝到伺服器上,也可以選擇將jenkins服務通過容器執行在伺服器上,這裡我選擇後者,點選上面的連結,就能跟著使用docker執行jinkins服務。

核心是下面這個執行docker容器的shell,關於這些引數的作用我前一篇文章已經講過,如果不太清楚可以回過去結合著一起看。

docker run \
  -d \
  --rm \
  -u root \
  -p 8080:8080 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v "$HOME":/home \
  jenkinsci/blueocean

登入

執行jenkins容器之後,訪問伺服器ip:8080就能跳轉到jenkins登入頁面,第一次會讓你輸入一個金鑰,這個在伺服器執行Jenkins容器的時候控制檯上就會顯示(如果沒有加上-d引數)。

image-20220213145350573

或者輸入下面的命令檢視jenkins的金鑰

cat /var/lib/jenkins/secrets/initialAdminPassword

填入金鑰之後就會跳轉至jerkins頁面,首次登入它會提示你安裝推薦的外掛,點選即可。然後會引導你建立一個登入jerkins的使用者,輸入使用者名稱,密碼和郵箱等資訊完成建立,之後訪問伺服器ip:8080就會提示你輸入使用者名稱和密碼進行登入jenkins。

image-20220213152756099

新建任務

點選左側新建任務,輸入你的任務名稱,如wood-app-backend,然後選擇構建自由風格的專案

image-20220213145959187

然後會跳轉至Jenkins專案配置區,選擇原始碼管理項,Git選項,輸入你Git倉庫的地址,然後在Credentials處新增你Git倉庫的使用者名稱和密碼,並且選擇監聽master分支(預設就是)

image-20220213150343603

我們需要的效果是一旦git倉庫發生變化就要自動構建映象,並且部署新的映象容器,所以在構建觸發器項下選擇輪詢SCM,使用corn表示式控制Jenkins監聽git倉庫的頻率為每分鐘一次

image-20220213150644507

下面是最核心的操作,jenkins要做的事我們已經知道了,那jerkins怎麼知道呢?需要通過shell指令碼指定,這裡的shell就是Jenkins在監聽到git倉庫的master分支發生變化時要做的事情,包括刪除已建立的容器(因為埠被舊容器佔用,需要強制刪除),構建新的映象執行新的容器

image-20220213150923340

if docker ps -a|grep -i wood-app-backend;then
   docker rm -f wood-app-backend
fi
#刪除已建的容器,防止容器名,埠衝突
sleep 1
docker build -t baize1998/wood-app-backend:latest .    #根據dockerfile生成映象
sleep 1
docker run -d -p 5000:5000 --name wood-app-backend baize1998/wood-app-backend:latest    #執行映象生成容器

刪除舊映象

上面的shell命令中有刪除舊容器的命令,但是沒有刪除舊映象的命令(每次構建同名新映象,舊的映象就會變成none,但是依舊佔據空間,需要回收)

image-20220213151915338

但是直接在shell中編寫刪除映象的命令在回收時可能會發生錯誤,所以額外建立一個定時任務去回收這些舊的映象,這裡指定清理映象的任務的執行頻率是每天的凌晨一點鐘(可以自行控制)

image-20220213152207275

image-20220213152237924

shell指令碼用於判斷是否存在<none>狀態的映象,並對它們進行回收

echo ---------------Clear-Images...------------------
clearImagesList=$(docker images -f "dangling=true" -q)
if [ ! -n "$clearImagesList" ]; then
echo "no images need  clean up."
else
docker rmi $(docker images -f "dangling=true" -q)
echo "clear success."
fi

測試CI/CD

CI--持續整合(一旦push之後,新的映象會構建),CD--持續部署(一旦push之後,新的容器會依據新的映象執行,提供最新的服務),下面修改我們的專案介面,然後push到遠端倉庫的master分支

image-20220213153030544

一分鐘後,訪問伺服器ip:5000看到jenkins已經完成專案映象構建以及新專案容器的執行,提供了最新的服務,之後便可以進行敏捷的開發了!

image-20220213153243298

結束語

這篇文章講述的使用Jenkins是比較取巧的,使用corn每分鐘監聽一次git倉庫的變化達到這種細粒度的CI/CD效果,當然這只是jenkins功能的冰山一角,具體jenkins部署階段還可以細分為構建、測試、部署等,也可以針對不同的推送命令配置不同的應答行為,每個階段也可以指定執行各種指令碼,這個就要學習Jenkins的pipeline機制,通過流水線的方式指定更詳細和規範的CI/CD流程,不過到目前為止,學校裡專案的開發維護功能也勉強夠用了~

建了一個春秋招備戰/內推/閒聊群,歡迎大家加入。

image-20220212231622599

關注公眾號【程式設計師白澤】,帶你走近一個有點話癆的程式設計師/學生黨。

image-20220110183620835

相關文章