前段時間寫了一篇初創團隊持續集成的落地與實現,主要用python接收gitlab的push請求,然後調用不同的shell腳本來實現。本文將使用基於Jenkins+Docker來實現另一套的自動化CI/CD的代碼發佈流程,至於jenkins和docker是什麼這裏就不多說了,能找到這篇文章的應該都知道他們是幹什麼用的,下面是整體的流程和部署。
一、總體流程設計
流程解析:
1、開發人員將代碼推送至git倉庫。
2、通過Jenkins上事先設置好的觸發器來拉取git倉庫的代碼。
3、代碼在Jenkins上通過設置好的規則編譯打包,然後build成docker鏡像,推送至docker倉庫。
4、Jenkins執行shell,連接到服務器上,拉取剛剛build的docker鏡像並運行。
5、發佈完成後,通過郵件通知測試人員。
資源相關:
git服務 | github |
---|---|
jenkins | jenkins.test.com |
項目服務器 | 120.78.xxx.xxx |
jenkins服務和項目服務都是我們線上的測試服務器,所以地址就不公開了。
二、git相關
本文我用的是自己的githubhttps://github.com/opsonly
,上面有一個用於測試的個人django的項目。
三、Jenkins設置
1、郵件設置
這裏注意要設置Extended E-mail Notification,否則後面無法發送郵件!
- 網站內容類型用的html,模板如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日誌</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
本郵件由系統自動發出,無需回覆!<br/>
項目 ${PROJECT_NAME }已構建完成!</br>
<td><font color="#CC0000">構建結果 - ${BUILD_STATUS}</font></td>
</tr>
<tr>
<td><br />
<b><font color="#0B610B">構建信息</font></b>
<hr size="2" width="100%" align="center" /></td>
</tr>
<tr>
<td>
<ul>
<li>項目名稱 : ${PROJECT_NAME}</li>
<li>構建編號 : 第${BUILD_NUMBER}次構建</li>
<li>觸發原因: ${CAUSE}</li>
<li>構建狀態: ${BUILD_STATUS}</li>
<li>構建日誌: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>構建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>工作目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
<li>項目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
</ul>
<h4><font color="#0B610B">失敗用例</font></h4>
<hr size="2" width="100%" />
$FAILED_TESTS<br/>
<h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
<hr size="2" width="100%" />
<ul>
${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
</ul>
詳細提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
</td>
</tr>
</table>
</body>
</html>
2、創建一個任務(自由風格的軟件項目)django-web,選擇參數化構建
3、源碼配置
·
4、觸發器配置
根據自己情況而設置
5、構建配置
選擇
執行shell
注意:這裏是整個流程的關鍵步驟,本文中是拉取github上的代碼後,將其cp至另一個專用於build的目錄,另外也將寫好的Dockerfile文件也複製至該目錄,然後完成docker鏡像的build和push操作。
-
項目服務器上的發佈腳本如下
- Dockerfile文件如下:
FROM python:3.7
ADD ./django-web ./app
WORKDIR ./app
RUN pip3 install -r requirements.txt
CMD ["python","manage.py","runserver","0.0.0.0:8000"]
6、構建後操作
在列表中選擇“Editable Email Notification”。
注意:這裏要選擇Editable Email Notification,前面的郵件配置爲Extended E-mail Notification,一定要對應起來,不然無法成功發送郵件(因爲Jenkins還有自帶的一個郵件通知,不過本文中沒有使用)。
整個的配置流程大致就是這樣子,可以根據實際情況再作調整,比如構建腳本和Dockerfile文件都還有很大的調整空間。
四、效果圖
1、傳入tag參數並構建項目
2、構建成功收到郵件通知:
3、打開剛剛構建成功的項目服務器的url,正常訪問沒有問題.
4、到項目服務器上查看一下啓動情況:
五、總結
1、數據庫問題:
因爲上面的django項目用的mysql,而顯然本文中mysql並沒有用容器實現,如果想要容器化mysql,需要注意mysql和django項目之間的網絡互通問題。django的mysql地址應填入容器mysql的容器名。
2、權限問題:
如果讀者根據上面步驟來試驗,可能會遇到mysql的權限問題,因爲我的本地的mysql服務已加入了root@’%’賬號,如果你是初始化的mysql,會出現連接失敗的問題。解決方法很簡單,就是根據情況添加特定的mysql賬號。