jenkins 實現自動化CI/CD
前言
在上一篇文章中,我們使用docker編寫Dockerfile
文件,將我們自己的項目構建成鏡像,然後發佈到Docker Hub
中,並且用自己的雲服務器拉取Docker Hub上我們自己上傳的項目鏡像,並且由該鏡像運行容器,使得我們成功將自己的項目用docker運行了起來,並且外網訪問測試通過。
如果還沒有使用過docker自己構建過鏡像的同學還是建議先閱讀第一篇文章:傳送門
在本篇文章中,將講解使用jenkins幫助我們監聽git倉庫的變化,一旦有新的push到master分支,jenkins服務則從gitee主動拉取項目代碼,構建新鏡像(藉助上一節編寫好的Dockerfile文件),然後刪除同名舊鏡像和舊容器,部署新容器。
而對於開發者來說,你向遠程倉庫的master
分支push
了新的代碼之後,就可以馬上訪問url看到最新的項目運行結果,一切都將由jenkins幫你完成(只要事先配置好jenkins工作流程)
最初我學編程很喜歡看視頻,而且是那種長而全的視頻,總覺得能看到別人每一步的操作就很踏實,但是漸漸的,還是看文檔多一些,我也在這裏推薦大家嘗試閱讀文檔,英文看起來慢就找中文的,相比於視頻,看文檔能快速找到你需要的點,而視頻需要跟着別人的節奏,相對會慢一些。(但剛開始學編程我還是推薦看視頻,後面輔以閱讀書籍文檔與博客文章)
jenkins相關
安裝
核心是下面這個運行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參數)。
或者輸入下面的命令查看jenkins的密鑰
cat /var/lib/jenkins/secrets/initialAdminPassword
填入密鑰之後就會跳轉至jerkins頁面,首次登錄它會提示你安裝推薦的插件,點擊即可。然後會引導你創建一個登錄jerkins的用戶,輸入用戶名,密碼和郵箱等信息完成創建,之後訪問服務器ip:8080
就會提示你輸入用戶名和密碼進行登錄jenkins。
新建任務
點擊左側新建任務,輸入你的任務名稱,如wood-app-backend,然後選擇構建自由風格的項目
然後會跳轉至Jenkins項目配置區,選擇源碼管理項,Git選項,輸入你Git倉庫的地址,然後在Credentials處添加你Git倉庫的用戶名和密碼,並且選擇監聽master分支(默認就是)
我們需要的效果是一旦git倉庫發生變化就要自動構建鏡像,並且部署新的鏡像容器,所以在構建觸發器項下選擇輪詢SCM,使用corn表達式控制Jenkins監聽git倉庫的頻率爲每分鐘一次
下面是最核心的操作,jenkins要做的事我們已經知道了,那jerkins怎麼知道呢?需要通過shell腳本指定,這裏的shell就是Jenkins在監聽到git倉庫的master分支發生變化時要做的事情,包括刪除已創建的容器(因爲端口被舊容器佔用,需要強制刪除),構建新的鏡像,運行新的容器
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,但是依舊佔據空間,需要回收)
但是直接在shell中編寫刪除鏡像的命令在回收時可能會發生錯誤,所以額外創建一個定時任務去回收這些舊的鏡像,這裏指定清理鏡像的任務的執行頻率是每天的凌晨一點鐘(可以自行控制)
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分支
一分鐘後,訪問服務器ip:5000看到jenkins已經完成項目鏡像構建以及新項目容器的運行,提供了最新的服務,之後便可以進行敏捷的開發了!
結束語
這篇文章講述的使用Jenkins是比較取巧的,使用corn每分鐘監聽一次git倉庫的變化達到這種細粒度的CI/CD效果,當然這只是jenkins功能的冰山一角,具體jenkins部署階段還可以細分爲構建、測試、部署等,也可以針對不同的推送命令配置不同的應答行爲,每個階段也可以指定執行各種腳本,這個就要學習Jenkins的pipeline機制,通過流水線的方式指定更詳細和規範的CI/CD流程,不過到目前爲止,學校裏項目的開發維護功能也勉強夠用了~