jenkins 簡單實現自動化CI/CD(轉) jenkins 實現自動化CI/CD

jenkins 實現自動化CI/CD

 
docker | jenkins 實現自動化CI/CD,後端躺着把運維的錢掙了!(下) 在本篇文章中,將講解使用jenkins幫助我們監聽git倉庫的變化,一旦有新的push到master分支,jenkins服務則從gitee主動拉取項目代碼,構建新鏡像(**藉助上一節編寫好的Dockerfile文件**),然後**刪除同名舊鏡像和舊容器,部署新容器**。

前言

在上一篇文章中,我們使用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流程,不過到目前爲止,學校裏項目的開發維護功能也勉強夠用了~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章