Docker+Jenkins+Gitlab+Django應用部署實踐

      網友投稿 1172 2025-03-31

      一、背景介紹


      在互聯(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} !

      構建通知模版:

      ${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日志

      (本郵件是程序自動下發(fā)的,請勿回復!)

      構建結果 - ${BUILD_STATUS}


      構建信息
      Changes Since Last Successful Build:
      ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:
      %c
      ",showPaths=true,changesFormat="
      [%a]
      %m
      ",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)一部署管理

      Docker+Jenkins+Gitlab+Django應用部署實踐

      后期可以利用利用公有云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小時內刪除侵權內容。

      上一篇:在Excel中去除選定區(qū)域數(shù)據(jù)的多種方法及比較(excel刪除所選區(qū)域)
      下一篇:如何實現(xiàn)表格內分行(怎樣在表格里分行)
      相關文章
      亚洲区日韩精品中文字幕| 久久精品国产亚洲AV高清热 | 91丁香亚洲综合社区| 久久久无码精品亚洲日韩按摩 | 亚洲日本国产综合高清| 亚洲一区在线观看视频| 亚洲国产电影在线观看| 91久久亚洲国产成人精品性色| 亚洲av不卡一区二区三区| 久久久久亚洲AV成人无码网站 | 亚洲AV无码成人精品区日韩| 亚洲大码熟女在线观看| 亚洲s码欧洲m码吹潮| 国产亚洲欧美日韩亚洲中文色| 亚洲JIZZJIZZ妇女| 丰满亚洲大尺度无码无码专线| 国产精品亚洲精品日韩动图| 日韩精品成人亚洲专区| 亚洲男人的天堂在线va拉文| 国产亚洲精品自在线观看| 亚洲精品成人无限看| 久久精品国产精品亚洲艾| 日产亚洲一区二区三区| 亚洲毛片基地日韩毛片基地| 亚洲伊人久久大香线蕉啊| 亚洲视频在线观看免费视频| 亚洲国产精品网站在线播放| 亚洲成熟丰满熟妇高潮XXXXX| 蜜芽亚洲av无码一区二区三区| 无码亚洲成a人在线观看| 国产精品亚洲二区在线| 亚洲一级黄色视频| 亚洲精品无码不卡在线播HE | 国产偷窥女洗浴在线观看亚洲| 亚洲一区二区三区在线播放| 亚洲开心婷婷中文字幕| 中文字幕亚洲精品资源网| 亚洲AV成人一区二区三区在线看| 亚洲国产精品成人午夜在线观看| 全亚洲最新黄色特级网站 | 亚洲AV永久无码精品网站在线观看|