Docker+Jenkins+Gitlab+Django應用部署實踐
一、背景介紹

在互聯(lián)網應用快速更新迭代的大背景下,傳統(tǒng)的人工手動或簡單腳本已經不能適應此變化,此時Devops為我們提供了良好的解決方案,應用好CI/CD可以大大的方便我們的日常工作,自動化快速的持續(xù)集成/持續(xù)交付為我們帶來了應用開放的更快速度、更好的穩(wěn)定性和更強的可靠性。
二、拓撲環(huán)境
如上圖實例,簡單花了下流程拓撲:
當研發(fā)push本地代碼到gitlab-server后,webhook自動觸發(fā)jenkins構建應用
在docker host上部署應用git clone來自gitlabserver源碼,并啟動應用
前端可以放置lb來做高可用
數(shù)據(jù)庫連接云數(shù)據(jù)庫
可將日志存儲在log后期投遞到elk實現(xiàn)日志可視化
構建完成郵件通知相關人員(測試或開放)
三、安裝部署
Jenkins安裝部署可參考:jenkins筆記
安裝完成后添加docker目標服務器
配置郵件發(fā)送服務器
Docker安裝部署及Dockerfile編寫可參考:容器Docker詳解
GitLab安裝在公網Linux服務器運行一些命令即可,如果沒有公網需要手動修改 /etc/gitlab/gitlab.rb文件的external_url 'http://自己的內網IP'
yum install -y libsemanage-static libsemanage-devel policycoreutils openss h-server openssh-clients postfix systemctl enable postfix && systemctl start postfix wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0. 0-ce.0.el7.x86_64.rpm rpm -i gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm # 獲取公網IP PUBLICIP=$(curl http://ipv4.icanhazip.com) # 修改 sed -i "s/gitlab-server/${PUBLICIP}/g" /etc/gitlab/gitlab.rb gitlab-ctl reconfigure gitlab-ctl restart echo "Username:root" echo "Password:5iveL!fe"
Jenkins新建構建一個自由風格的軟件項目
利用參數(shù)化構建方便后續(xù)部署Docker傳入映射的源端口和release
源代碼來自gitlab的django項目
利用webhook關聯(lián)gitlab和jenkins
jenkins安裝插件:
生成隨機token值
將jenkins生成的GitLab webhook URL配置到gitlab
當開發(fā)者在本地push代碼后自動觸發(fā)jenkins構建項目,有Dockerfile內寫的git pull代碼,再次不用將代碼由jenkins分發(fā)到docker宿主機,jenkins作為觸發(fā)docker構建使用
配置構建完成后的郵件
郵件模版,郵件類型選擇:
內容類型選擇:HTML
郵件主題填寫:構建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !
構建通知模版:
(本郵件是程序自動下發(fā)的,請勿回復!) |
構建結果 - ${BUILD_STATUS} |
構建信息 |
|
Changes Since Last Successful Build: |
%c ",showPaths=true,changesFormat=" [%a]",pathFormat=" %p"} |
Failed Test Results |
$FAILED_TESTS |
構建日志 (最后 100行): |
觸發(fā)類型可根據(jù)自身需要填寫,這里填寫always無論成功還是失敗都發(fā)送郵件
查看遠程Docker服務器內的文件
django部署已經利用conda打包好了項目的Python3.6的環(huán)境包自制了Docker鏡像
之前利用的是純凈的Python3.6系統(tǒng),在每次構建的時候利用pip安裝requirements.txt的模塊,但是長此以往由于環(huán)境變化很少,每次需要pip安裝耗時,所以利用conda將打包好的Python環(huán)境自制成定制化環(huán)境,以此來減少環(huán)境部署時間,也可以通過docker鏡像制作是-v參數(shù)將本地磁盤掛載在環(huán)境內,每次構建本地的conda即可,完成快速環(huán)境部署。
查看Dockerfile
FROM 87a69025db6a MAINTAINER kaliarch # 定義docker中工作目錄 ENV WORK_DIR /work/ # 創(chuàng)建docker內工作目錄 RUN mkdir $WORK_DIR # 定義映射端口 EXPOSE 80 WORKDIR $WORK_DIR RUN git clone http://123.xxxx.xxxxx.245/Devops/go2cloud.git # 添加啟動服務腳本 ADD *.sh ${WORK_DIR} CMD `which bash` /work/start_all.sh && tail -f /work/logs/server-$(date +%F).log
查看Django啟動腳本
#!/bin/bash BASEPATH=$(cd `dirname
#!/bin/bash BASEPATH=$(cd `dirname $0`;pwd) PY_CMD=/python3/bin/python # 服務入口文件 #MAIN_APP=${BASEPATH}/go2cloud/manage.py # 遷移腳本入口文件 SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py # 刪除腳本入口文件 DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py # 日志目錄 LOG_DIR=${BASEPATH}/logs/ [ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR} # 啟動服務 #nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 & # 啟動腳本遷移調度腳本 echo "---------$0 $(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).log nohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}script-$(date +%F).log 2>&1 & # 啟動遷移刪除腳本 echo "---------$0 $(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).log nohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &
`;pwd) PY_CMD=/python3/bin/python # 服務入口文件 #MAIN_APP=${BASEPATH}/go2cloud/manage.py # 遷移腳本入口文件 SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py # 刪除腳本入口文件 DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py # 日志目錄 LOG_DIR=${BASEPATH}/logs/ [ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR} # 啟動服務 #nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 & # 啟動腳本遷移調度腳本 echo "---------#!/bin/bash BASEPATH=$(cd `dirname $0`;pwd) PY_CMD=/python3/bin/python # 服務入口文件 #MAIN_APP=${BASEPATH}/go2cloud/manage.py # 遷移腳本入口文件 SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py # 刪除腳本入口文件 DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py # 日志目錄 LOG_DIR=${BASEPATH}/logs/ [ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR} # 啟動服務 #nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 & # 啟動腳本遷移調度腳本 echo "---------$0 $(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).log nohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}script-$(date +%F).log 2>&1 & # 啟動遷移刪除腳本 echo "---------$0 $(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).log nohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &
$(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).log nohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}script-$(date +%F).log 2>&1 & # 啟動遷移刪除腳本 echo "---------#!/bin/bash BASEPATH=$(cd `dirname $0`;pwd) PY_CMD=/python3/bin/python # 服務入口文件 #MAIN_APP=${BASEPATH}/go2cloud/manage.py # 遷移腳本入口文件 SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py # 刪除腳本入口文件 DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py # 日志目錄 LOG_DIR=${BASEPATH}/logs/ [ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR} # 啟動服務 #nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 & # 啟動腳本遷移調度腳本 echo "---------$0 $(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).log nohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}script-$(date +%F).log 2>&1 & # 啟動遷移刪除腳本 echo "---------$0 $(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).log nohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &
$(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).log nohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &查看jenkins部署腳本
#!/bin/bash release= port= BASEPATH=$(cd `dirname
#!/bin/bash release=$1 port=$2 BASEPATH=$(cd `dirname $0`;pwd) # 構建go2cloud-platform 鏡像 cd /dockerwork docker build -t go2cloud-platform-mini:$release . IMGNAME=$(docker images|awk -v release=$release '{if($1=="go2cloud-platform-mini" && $2==release) print $3}') echo $IMGNAME # 啟動容器 docker run -d -p ${port}:80 -v /testlog/:/work/logs ${IMGNAME}
`;pwd) # 構建go2cloud-platform 鏡像 cd /dockerwork docker build -t go2cloud-platform-mini:$release . IMGNAME=$(docker images|awk -v release=$release '{if(=="go2cloud-platform-mini" && ==release) print }') echo $IMGNAME # 啟動容器 docker run -d -p ${port}:80 -v /testlog/:/work/logs ${IMGNAME}利用-v參數(shù)將日志持續(xù)化存儲到docker 宿主機之上
四、測試展示
手動構建測試
五、反思改進
目前數(shù)據(jù)庫連接的為云服務器搭建的數(shù)據(jù)庫,后期數(shù)據(jù)庫也利用docker,多組采用docker-compose統(tǒng)一部署管理
后期可以利用利用公有云k8s集群進行方便測試
目前docker容器產生的日志在docker宿主機上,后期可以將其存儲在cos上,再投遞到elk集群日志可視化處理
將鏡像統(tǒng)一管理制作本地鏡像倉庫
gitlab添加code review并結合自動測試
Django Git GitHub
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。