背景
持續集成是敏捷開發的一項重要環節,傳統的集成方式較爲繁瑣,需要利用一些CI/CD工具進行集成工作。筆者嘗試採用jenkins進行django項目的集成部署。
jenkins安裝與配置
安裝
jenkins的安裝比較簡單,分爲兩步安裝java運行環境和jenkins軟件即可。另外,官網還推薦使用docker進行安裝。筆者在ubuntu系統上採用傳統方式進行後續的流程。安裝步驟爲:
- 安裝java
apt install openjdk-8-jre
- 安裝Jenkins
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
配置
端口
首次安裝jenkins可能會出現無法啓動的情況,其中一個原因可是能系統的8080端口被佔用,我們需要修改/etc/default/jenkins
的HTTP_PORT=8080
爲其他空閒端口即可。之後重啓服務service jenkins restart
賬戶權限
jenkins會爲安裝jenkins軟件的linux系統生成一個jenkins賬戶進行後續操作。但是筆者想採用超級管理員權限進行後續的操作。
- 將jenkins賬戶加到root分組中,
gpasswd -a root jenkins
- 修改配置文件
/etc/default/jenkins
JENKINS_USER=root
JENKINS_GROUP=root
- 重啓服務
service jenkins restart
插件
筆者試用了blue ocean的插件,看起來比較美觀。我們僅需要到系統管理->插件配置進行添加即可。
創建持續集成項目
項目創建有多種方案,最常用的是任意風格和流水線。筆者先介紹默認任意風格的方案,pipeline方案日後補上。
任意風格
項目配置
一個簡單django集成部署的步驟,需要包含:
- 從代碼倉庫(git/github等)拉取代碼
- 指定python運行環境
- 創建或激活虛擬環境
- 安裝依賴
- 數據庫遷移
- 靜態文件收集
- 配置環境變量
- 殺死舊程序
- 啓動新程序
其中從代碼倉庫拉取代碼可以利用配置完成:
剩餘步驟,我們可以編寫一個shell去完成這一系列的步驟:
# !/bin/bash
cd project_path
PROCESS=`ps -e | grep gunicorn | awk '{printf "%d\n", $1}'`
for i in $PROCESS
do
echo "Kill the gunicorn process [ $i ]"
kill -9 $i
done
CPROCESS=`ps -e | grep celery | awk '{printf "%d\n", $1}'`
for i in $CPROCESS
do
echo "Kill the celery process [ $i ]"
kill -9 $i
done
echo "finish kill"
~/.pyenv/bin/pyenv local 3.7.2
pipenv --python 3.7.2
export BUILD_ID=dontKillMe
. `pipenv --venv`/bin/activate
pip install -r requirements.txt
pip install gunicorn==19.9.0
python manage.py collectstatic --noinput
python manage.py migrate
nohup gunicorn -w 3 -b localhost:9003 imageprocessing.wsgi:application > django.out 2>&1 &
sleep 10s
nohup celery -A imageprocessing worker -l info -P eventlet -c 1 > celery.out 2>&1 &
sleep 10s
exit 0
其中有幾個比較需要注意的點是:
- 筆者的python環境管理採用pyenv進行管理,但是在jenkins的腳本中,不知道出於什麼原因直接調用pyenv是會報command not found的,需要指定絕對路徑
~/.pyenv/bin/pyenv
才行。 - 另外,jenkins當腳本完成之後會殺死所有的後臺進程,所以直接使用nohup掛進程的話是沒有效果的,需要在腳本中聲明一個環境變量
export BUILD_ID=dontKillMe
纔可以達到目的。
保存過後點擊執行即可。
如果安裝了blue ocean最終的效果: