日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Jenkins部署Python项目实战

發(fā)布時(shí)間:2025/4/16 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jenkins部署Python项目实战 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、背景

我們工作中常用Jenkins部署Java代碼,因其靈活的插件特性,例如jdk,maven,ant等使得java項(xiàng)目編譯后上線部署一氣呵成,同樣對(duì)于腳本語言類型如Python上線部署,利用Jenkins強(qiáng)大的插件功能,輕松實(shí)現(xiàn)CI/CD,但如果部署多項(xiàng)目到同一臺(tái)服務(wù)器涉及環(huán)境一致性問題,對(duì)此可以利用容器技術(shù)Docker解決,也可以利用Python虛擬環(huán)境例如virutalenv或conda等優(yōu)秀等工具解決,在此由于后期根據(jù)requirements來安裝依賴包比較慢,且后期需要將Python整個(gè)環(huán)境打包,利用conda工具來對(duì)項(xiàng)目環(huán)境進(jìn)行管理,方便快速移植。

本文較系統(tǒng)的記錄下部署一個(gè)具體的Django項(xiàng)目,包括利用conda工具來實(shí)現(xiàn)Python多環(huán)境管理,Pylint工具來實(shí)現(xiàn)代碼檢查,使用nose框架做單元測試和覆蓋率。

二、必備知識(shí)

  • Jenkins基礎(chǔ)安裝部署

可參考:https://blog.51cto.com/kaliarch/2050862

  • Conda軟件包管理系統(tǒng)

由于conda包較大,通常情況下可以使用Miniconda
官網(wǎng)下載地址:https://conda.io/en/latest/miniconda.html
基礎(chǔ)使用命令:

一、工具包管理命令 1.更新工具包 conda update conda conda upgrade --all2.安裝包(進(jìn)入虛擬環(huán)境,也可用pip安裝) conda install package_name 可以指定版本 conda install package_name=1.103.移除包 conda remove package_name4.查看包 conda list5.查詢包 conda search package_name6.源配置 因?yàn)閍naconda的服務(wù)器在國外,因此有時(shí)候速度會(huì)比較慢,可以換到國內(nèi)源,比如清華的TUNA。conda config --show-sources #查看當(dāng)前使用源 conda config --remove channels 源名稱或鏈接 #刪除指定源 conda config --add channels 源名稱或鏈接 #添加指定源# 添加Anaconda的TUNA鏡像 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # TUNA的help中鏡像地址加有引號(hào),需要去掉# 設(shè)置搜索時(shí)顯示通道地址 conda config --set show_channel_urls yes二、Python環(huán)境管理命令 1.顯示創(chuàng)建的所有環(huán)境 conda env list2.創(chuàng)建python環(huán)境: conda create -n env_name list of packages eg:conda create -n py2 python=2.7 request3.進(jìn)入python環(huán)境:(windows 環(huán)境不需要加source) source activate env_name eg:source activate py24.退出環(huán)境: source deactivate5.查看某環(huán)境下已安裝的包 conda list -n python26.復(fù)制環(huán)境: conda create --name <new_env_name> --clone <copied_env_name>7.刪除環(huán)境: conda remove -n go2cloud-api-env --all8.環(huán)境生成為YAML文件 當(dāng)分享代碼的時(shí)候,同時(shí)也需要將運(yùn)行環(huán)境分享給大家,首先進(jìn)入到環(huán)境中,執(zhí)行如下命令可以將當(dāng)前環(huán)境下的 package 信息存入名為 environment 的 YAML 文件中。
  • conda env export > environment.yaml

同樣,當(dāng)執(zhí)行他人的代碼時(shí),也需要配置相應(yīng)的環(huán)境。這時(shí)你可以用對(duì)方分享的 YAML 文件來創(chuàng)建一摸一樣的運(yùn)行環(huán)境

conda env create -f environment.yaml

Shell基礎(chǔ)

可參考:https://myshell-note.readthedocs.io/en/latest/index.html

  • GIT基礎(chǔ)

可參考:https://blog.51cto.com/kaliarch/2049724

三、優(yōu)化

  • 生成主題

主題工具生成鏈接:http://afonsof.com/jenkins-material-theme/
在主題工具生成喜歡的顏色已經(jīng)上傳logo下載生成的主題到Jenkins服務(wù)器的jenkins 家目錄,一般為安裝啟動(dòng)jenkins系統(tǒng)用戶的家目錄下.jenkins/userContent/material/,如果沒有此目錄需要新建目錄,css文件移動(dòng)到目錄下,例如/root/.jenkins/userContent/material/blue.css。

  • Jenkins上配置主題

a.Install?Jenkins Simple Theme Plugin
b.點(diǎn)擊Manage Jenkins
c.點(diǎn)擊Configure System
d.找到 Theme 配置
e.填寫本地主題cssurl,例如:http://localhost:8080/jenkins/userContent/material/blue.css
f.Click Save
g.保存可查看效果。

  • 注意

本地css的url可以瀏覽器打開測試訪問,如果訪問不到會(huì)默認(rèn)加載Jenkins默認(rèn)主題
后期遷移url最好寫成localhost,如果寫公網(wǎng)IP,css文件不存在404,Jenkins頁面會(huì)很卡。

四、部署實(shí)戰(zhàn)

4.1 服務(wù)器列表

名稱IP軟件備注
Jenkins-server10.57.61.138minicondaJenkins服務(wù)器
Des-server172.21.0.10miniconda項(xiàng)目部署服務(wù)器

4.2 架構(gòu)圖

4.3 前期準(zhǔn)備

  • 安裝依賴包
    • pylint: Python靜態(tài)代碼審查包,參考:http://pylint.pycqa.org/en/latest/user_guide/run.html
    • mock: 用來生成測試數(shù)據(jù)。
    • nose: Python單元測試包。
    • coverage: Python代碼覆蓋率包。

    對(duì)依賴包需要在Jenkins-server服務(wù)器進(jìn)行安裝,首先根據(jù)項(xiàng)目里面conda創(chuàng)建對(duì)應(yīng)項(xiàng)目對(duì)虛擬環(huán)境conda create -n <project_name> python=3.6,創(chuàng)建完成利用conda env list查看環(huán)境,為避免環(huán)境污染,在項(xiàng)目環(huán)境內(nèi)利用pip工具安裝軟件pip install pylint mock nose coverage。

  • 安裝Jenkins插件
    • JUnit: 用來展示nose框架生成的單元測試報(bào)表(Allows JUnit-format test results to be published.)
    • Cobertura Plugin:用來展示Python代碼測試覆蓋率報(bào)表(This plugin integrates Cobertura coverage reports to Jenkins.)
    • Violations plugin:用來展示Python靜態(tài)代碼審查報(bào)表(This plugin does reports on checkstyle, csslint, pmd, cpd, fxcop, pylint, jcReport, findbugs, and perlcritic violations.),參考:https://wiki.jenkins.io/display/JENKINS/Violations
    • Git Plugin:用來從Gitbucket源代碼庫拉取代碼(This plugin allows GitLab to trigger Jenkins builds and display their results in the GitLab UI.)
    • Git Parameter:用于參數(shù)化構(gòu)建選擇git的branch(Adds ability to choose branches, tags or revisions from git repositories configured in project.)

    4.4 創(chuàng)建任務(wù)

    • 創(chuàng)建自由風(fēng)格軟件項(xiàng)目

    New任務(wù)->構(gòu)建一個(gè)自由風(fēng)格的軟件項(xiàng)目,填寫描述,在此由于后期會(huì)利用pylint進(jìn)行代碼檢查,給出了代碼檢查的消息類型,可以根據(jù)消息類型進(jìn)行相應(yīng)修復(fù)處理。

    • 配置參數(shù)化構(gòu)建

    配置選擇git具體branch進(jìn)行構(gòu)建,和可以自定義端口,在此需要注意參數(shù)化構(gòu)建的變了Name,在后續(xù)需要用到。

    • 源碼管理

    在此需要選擇源碼倉庫,選擇gitlab已經(jīng)認(rèn)證方式,需要注意由于參數(shù)化構(gòu)建選擇了branch,在Branches to build需要引用上面的變量$branch。

    • 構(gòu)建配置
      • 執(zhí)行shell

    執(zhí)行shell此shell為在Jenkins服務(wù)器上執(zhí)行,所以需要預(yù)先在其上配置Python虛擬環(huán)境,在其上進(jìn)行代碼審查,單元測試生成nosetests.xml文件,已經(jīng)代碼覆蓋率測試生成coverage.xml文件,pylint測試生成pylint.xml文件。

    以下為此項(xiàng)目示例shell腳本,此腳本需要根據(jù)自己的實(shí)際情況來修改,需要注意Python項(xiàng)目結(jié)構(gòu)與需要代碼檢查的標(biāo)識(shí)符。

    base_dir=/root/.jenkins/workspace/ project=go2cloud-api-deploy-prod/ project_env=go2cloud-api-env # 切換python環(huán)境 source activate ${project_env} $(which python) -m pip install mock nose coverage # 更新python環(huán)境 echo "+++更新Python環(huán)境+++"if [ -f ${base_dir}${project}requirements.txt ];then$(which python) -m pip install -r ${base_dir}${project}requirements.txt && echo 0 || echo 0 fi# 代碼檢查/單元測試/代碼測試覆蓋率 echo "+++代碼檢查+++" cd ${base_dir} # 生成pylint.xml $(which pylint) -f parseable --disable=C0103,E0401,C0302 $(find ${project}/* -name *.py) >${base_dir}pylint.xml || echo 0echo "+++單元測試+++" # 生成nosetests.xml #$(which nosetests) --with-xunit --all-modules --traverse-namespace --with-coverage --cover-package=go2cloud-api-deploy-prod --cover-inclusive || echo 0 $(which nosetests) --with-xunit --all-modules --traverse-namespace --with-coverage --py3where=go2cloud-api-deploy-prod --cover-package=go2cloud-api-deploy-prod --cover-inclusive || echo 0 echo "+++代碼覆蓋率+++" # 生成coverage.xml

    python -m coverage xml --include=go2cloud-api-deploy-prod* || echo 0

    • 發(fā)送文件及命令到目標(biāo)服務(wù)器


    在此需要制定發(fā)布到目標(biāo)到的服務(wù)器遠(yuǎn)端目錄,已經(jīng)執(zhí)行的命令,在此執(zhí)行重啟腳本。
    由于在此項(xiàng)目為Django項(xiàng)目,需要制定虛擬環(huán)境/入口啟動(dòng)文件/啟動(dòng)端口。
    將之前參數(shù)化構(gòu)建的端口當(dāng)作變量傳遞給腳本,啟動(dòng)相應(yīng)的端口

    #!/usr/bin/env bash# 當(dāng)前目錄 BASEPATH=$(cd `dirname $0`;pwd)# python解釋器具體路徑 PYTHON_BIN=$1# mananger文件路徑 MAIN_APP=$2# python SERVER_PORT=$3[ $# -lt 3 ] && echo "缺少參數(shù)" && exit 1LOG_DIR=${BASEPATH}/logs/ [ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR}OLD_PID=`netstat -lntup | awk -v SERVER_PORT=${SERVER_PORT} '{if($4=="0.0.0.0:"SERVER_PORT) print $NF}'|cut -d/ -f1` [ -n "${OLD_PID}" ] && kill -9 ${OLD_PID}echo "---------$0 $(date) excute----------" >> ${LOG_DIR}server-$(date +%F).log# 啟動(dòng)服務(wù)nohup ${PYTHON_BIN} -u ${MAIN_APP} runserver 0.0.0.0:${SERVER_PORT} &>> ${LOG_DIR}server-$(date +%F).log 2>&1 &
    • 構(gòu)建后動(dòng)作
      • JUnit插件實(shí)現(xiàn)單元測試報(bào)告,需要指定nosetests.xml

    • Cobertura Plugin插件實(shí)現(xiàn)覆蓋率測試

    • Violations插件進(jìn)行代碼審計(jì),需要制定Jenkins-server上的生成的pylint.xml文件。

    需要注意文件路徑為jenkins服務(wù)器pylint.xml,以及對(duì)應(yīng)生成文件的編碼。

    • 郵件通知配置

    選擇郵件內(nèi)容為Content Type為HTML,這樣可以編寫郵件HTML模版,生成較為好看的郵件通知模版。
    注意選擇觸發(fā)告警可以選擇類型,失敗幾次或無論構(gòu)建成功失敗都發(fā)送,可根據(jù)具體需求配置。


    郵件HTML模版

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構(gòu)建日志</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><td>(本郵件是程序自動(dòng)下發(fā)的,請勿回復(fù)!)</td></tr><tr><td><h2><font color="#0000FF">構(gòu)建結(jié)果 - ${BUILD_STATUS}</font></h2></td></tr><tr><td><br /><b><font color="#0B610B">構(gòu)建信息</font></b><hr size="2" width="100%" align="center" /></td></tr><tr><td><ul><li>項(xiàng)目名稱&nbsp;:&nbsp;${PROJECT_NAME}</li><li>構(gòu)建編號(hào)&nbsp;:&nbsp;第${BUILD_NUMBER}次構(gòu)建</li><li>SVN&nbsp;版本:&nbsp;${SVN_REVISION}</li><li>觸發(fā)原因:&nbsp;${CAUSE}</li><li>構(gòu)建日志:&nbsp;<a href="${BUILD_URL}console">${BUILD_URL}console</a></li><li>構(gòu)建&nbsp;&nbsp;Url&nbsp;:&nbsp;<a href="${BUILD_URL}">${BUILD_URL}</a></li><li>工作目錄&nbsp;:&nbsp;<a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li><li>項(xiàng)目&nbsp;&nbsp;Url&nbsp;:&nbsp;<a href="${PROJECT_URL}">${PROJECT_URL}</a></li></ul></td></tr><tr>
          <td><a href="http://www.yxccc.com" target="_blank">電動(dòng)叉車</a></td><td><b><font color="#0B610B">Changes Since LastSuccessful Build:</font></b><hr size="2" width="100%" align="center" /></td></tr><tr><td><ul><li>歷史變更記錄 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li></ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="&nbsp;&nbsp;&nbsp;&nbsp;%p"}</td></tr><tr><td><b>Failed Test Results</b><hr size="2" width="100%" align="center" /></td></tr><tr><td><prestyle="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre><br /></td></tr><tr><td><b><font color="#0B610B">構(gòu)建日志 (最后 100行):</font></b><hr size="2" width="100%" align="center" /></td></tr><!-- <tr><td>Test Logs (if test has ran): <ahref="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a><br /><br /></td></tr> --><tr><td><textarea cols="80" rows="30" readonly="readonly"style="font-family: Courier New">${BUILD_LOG, maxLines=100}</textarea></td></tr></table> </body> </html>

    4.5 進(jìn)行構(gòu)建測試

    • 觸發(fā)構(gòu)建

    選擇對(duì)應(yīng)的branch與端口

    • 查看consle log
      • pylint檢查

    • nosetests單元測試及代碼覆蓋率


    • 目標(biāo)服務(wù)器查看具體項(xiàng)目

    4.6 查看構(gòu)結(jié)果

    • 總覽查看

    • 查看代碼覆蓋率


    查看具體不合規(guī)代碼
    在源代碼分析結(jié)束后面,會(huì)有一系列的報(bào)告,每個(gè)報(bào)告關(guān)注于項(xiàng)目的某些方面,如每種類別的 message 的數(shù)目,模塊的依賴關(guān)系等等。具體來說,報(bào)告中會(huì)包含如下的方面:
    MESSAGE_TYPE 有如下幾種:

    (C) convention 慣例。違反了編碼風(fēng)格標(biāo)準(zhǔn) (R) refactor 重構(gòu)。寫得非常糟糕的代碼。 (W) warning 警告。某些 Python 特定的問題。 (E) error 錯(cuò)誤。很可能是代碼中的錯(cuò)誤。 (F) fatal 致命錯(cuò)誤。阻止 Pylint 進(jìn)一步運(yùn)行的錯(cuò)誤。

    • 查看郵件

    五、流水線部署

    5.1 pipeline基礎(chǔ)概念

    • pipeline是什么

    pipeline為運(yùn)行于Jenkins上的工作流框架,project中的配置信息以steps的方式放在一個(gè)腳本里將原本獨(dú)立運(yùn)行于單個(gè)或者多個(gè)節(jié)點(diǎn)的任務(wù)連接起來,實(shí)現(xiàn)單個(gè)任務(wù)難以完成的復(fù)雜流程編排與可視化。

    • 基礎(chǔ)概念
      • Stage: 階段:告訴Jenkins做什么,一個(gè)Pipeline可以劃分為若干個(gè)Stage,每個(gè)Stage代表一組操作。注意,Stage是一個(gè)邏輯分組的概念,可以跨多個(gè)Node。
      • Node: 節(jié)點(diǎn):告訴Jenkins在job在哪運(yùn)行一個(gè)Node就是一個(gè)Jenkins節(jié)點(diǎn),或者是Master,或者是slave,是執(zhí)行Step的具體運(yùn)行期環(huán)境。
      • Step: 步驟:具體細(xì)化到每一步構(gòu)建操作,Step是最基本的操作單元,小到創(chuàng)建一個(gè)目錄,大到構(gòu)建一個(gè)Docker鏡像,由各類Jenkins Plugin提供。
    • 語發(fā)工具

    Pipeline提供了一組可擴(kuò)展的工具,通過Pipeline Domain Specific Language(DSL)syntax可以達(dá)到Pipeline as Code(Jenkinsfile存儲(chǔ)在項(xiàng)目的源代碼庫)的目的。

    參考:https://wiki.jenkins.io/display/JENKINS/Pipeline+Plugin

    5.2 pipeline的特性

    基于 Jenkins Pipeline,用戶可以在一個(gè) JenkinsFile 中快速實(shí)現(xiàn)一個(gè)項(xiàng)目的從構(gòu)建、測試以到發(fā)布的完整流程,并且可以保存這個(gè)流水線的定義。

    • 代碼:Pipeline以代碼的形式實(shí)現(xiàn),通常被檢入源代碼控制,使團(tuán)隊(duì)能夠編輯、審查和迭代其CD流程。
    • 可持續(xù)性:Jenklins重啟或者中斷后都不會(huì)影響Pipeline Job。
    • 停頓:Pipeline可以選擇停止并等待任工輸入或批準(zhǔn),然后再繼續(xù)Pipeline運(yùn)行。
    • 多功能:Pipeline支持現(xiàn)實(shí)世界的復(fù)雜CD要求,包括fork/join子進(jìn)程,循環(huán)和并行執(zhí)行工作的能力
    • 可擴(kuò)展:Pipeline插件支持其DSL的自定義擴(kuò)展以及與其他插件集成的多個(gè)選項(xiàng)。

    5.3 pipeline語法

    • 聲明式
    pipeline { /* insert Declarative Pipeline here */ }

    在聲明式流水線中有效的基本語句和表達(dá)式遵循與?Groovy的語法同樣的規(guī)則, 有以下例外:

    • 流水線頂層必須是一個(gè)?block, 特別地: pipeline { }
    • 沒有分號(hào)作為語句分隔符,,每條語句都必須在自己的行上。
    • 塊只能由?節(jié)段,?指令,?步驟, 或賦值語句組成。 *屬性引用語句被視為無參方法調(diào)用。 例如, input被視為 input()

    示例:

    Jenkinsfile (Declarative Pipeline) pipeline {agent none stages {stage('Example Build') {agent { docker 'maven:3-alpine' } steps {echo 'Hello, Maven'sh 'mvn --version'}}stage('Example Test') {agent { docker 'openjdk:8-jre' } steps {echo 'Hello, JDK'sh 'java -version'}}} }

    詳細(xì)學(xué)習(xí)可參考:https://jenkins.io/zh/doc/book/pipeline/syntax/

    • 腳本式

    腳本化流水線, 與[declarative-pipeline]一樣的是, 是建立在底層流水線的子系統(tǒng)上的與聲明式不同的是, 腳本化流水線實(shí)際上是由?Groovy構(gòu)建的通用 DSL [2]。 Groovy 語言提供的大部分功能都可以用于腳本化流水線的用戶。這意味著它是一個(gè)非常有表現(xiàn)力和靈活的工具,可以通過它編寫持續(xù)交付流水線。

    示例:

    node('master') { //master節(jié)點(diǎn)運(yùn)行,以下stage也可指定節(jié)點(diǎn)stage 'Prepare' //清空發(fā)布目錄bat '''if exist D:\\publish\\LoginServiceCore (rd/s/q D:\\publish\\LoginServiceCore)if exist C:\\Users\\Administrator\\.nuget (rd/s/q C:\\Users\\Administrator\\.nuget)exit'''//拉取git代碼倉庫stage 'Checkout'checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'c6d98bbd-5cfb-4e26-aa56-f70b054b350d', url: 'http://xxx/xxx/xxx']]])//構(gòu)建stage 'Build'bat '''cd "D:\\Program Files (x86)\\Jenkins\\workspace\\LoginServiceCore\\LoginApi.Hosting.Web"dotnet restoredotnet builddotnet publish --configuration Release --output D:\\publish\\LoginServiceCore'''//部署stage 'Deploy'bat '''cd D:\\PipelineScript\\LoginServiceCorepython LoginServiceCore.py'''//自動(dòng)化測試(python代碼實(shí)現(xiàn)) stage 'Test'bat'''cd D:\\PipelineScript\\LoginServiceCorepython LoginServiceCoreApitest.py''' }

    5.4 示例

    在此將上面的項(xiàng)目利用pipeline進(jìn)行發(fā)布

    • 創(chuàng)建自由風(fēng)格軟件項(xiàng)目

    New任務(wù)->流水線,填寫任務(wù)描述。

    • Pipeline

    如果對(duì)Pipeline語法不熟悉,可以利用工具生成

    在此的pipeline

    pipeline {agent anyparameters {gitParameter branchFilter: 'origin/(.*)', defaultValue: 'master', name: 'BRANCH', type: 'PT_BRANCH'}stages {stage('checkout src code') {steps {echo "checkout src code"git branch: "${params.BRANCH}",'http://123.206.xxx.xxx/xuel/go2cloud_platform.git'}}stage('exec shell'){steps{echo "pylint,Unit test"sh '''# jenkins 服務(wù)器項(xiàng)目workspace目錄base_dir=/root/.jenkins/workspace/# 項(xiàng)目名稱project=go2cloud_platform# 項(xiàng)目環(huán)境python環(huán)境project_env=go2cloud_platform_pipeline# 切換python環(huán)境source /data/miniconda3/bin/activate ${project_env}$(which python) -m pip install mock nose coverage pylint# 更新python環(huán)境echo "++++++更新Python環(huán)境+++"if [ -f ${base_dir}${project}requirements/requirements.txt ];then$(which python) -m pip install -r ${base_dir}${project}/requirements/requirements.txt && echo 0 || echo 0fi# 代碼檢查/單元測試/代碼測試覆蓋率echo "++代碼檢查++"cd ${base_dir}# 生成pylint.xml$(which pylint) -f parseable --disable=C0103,E0401,C0302 $(find ${project}/* -name *.py) >${base_dir}${project}_pylint.xml || echo 0echo "++單元測試++"# 生成nosetests.xml#$(which nosetests) --with-xunit --all-modules --traverse-namespace --with-coverage --cover-package=go2cloud-api-deploy-prod --cover-inclusive || echo 0$(which nosetests) --with-xunit --all-modules --traverse-namespace --with-coverage --py3where=${project} --cover-package=${project} --cover-inclusive || echo 0echo "++代碼覆蓋率+++"# 生成coverage.xmlpython -m coverage xml --include=${project_env}* || echo 0'''}}stage("deploy") {steps {echo "send file"sshPublisher(publishers: [sshPublisherDesc(configName: 'go2cloud_platform_host', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''base_dir=/devops_pipelineproject_src=go2cloud_platformproject_env=/data/miniconda3/envs/go2cloud_platform_pipeline/bin/pythonecho "+++++++更新部署服務(wù)器python環(huán)境++++++++++"if [ -f ${base_dir}/requirements/requirements.txt ];then${project_env} -m pip install -r ${base_dir}/requirements/requirements.txt && echo 0 || echo 0fiecho -e "\\033[32m 啟動(dòng)服務(wù)腳本 \\033[0m"$(which bash) ${base_dir}/run_server.sh ${project_env} ${base_dir}/apps/manage.py ${port}''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/devops_pipeline', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '**/**')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}}} }
    • 運(yùn)行構(gòu)建

    • 查看結(jié)果

    六、注意要點(diǎn)

    • 在部署前一定梳理好流程,需要理解哪一步在目標(biāo)服務(wù)器還上在Jenkins服務(wù)器上執(zhí)行
    • 需要對(duì)應(yīng)好目錄及Python虛擬環(huán)境,避免環(huán)境污染

    七、反思

    • 在此利用來Conda虛擬環(huán)境管理,來在同一個(gè)服務(wù)器上解決環(huán)境不一致行,也可以利用Docker來解決
    • 利用Pipeline項(xiàng)目發(fā)布可視化,明確階段,方便stage查看與排錯(cuò),Jenkinsfile可放在git倉庫進(jìn)行

    轉(zhuǎn)載于:https://www.cnblogs.com/xyou/p/10674774.html

    總結(jié)

    以上是生活随笔為你收集整理的Jenkins部署Python项目实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。