Jenkins部署Python项⽬实战
⼀、背景
我们⼯作中常⽤Jenkins部署Java代码,因其灵活的插件特性,例如jdk,maven,ant等使得java项⽬编译后上线部署⼀⽓呵成,同样对于脚本语⾔类型如Python上线部署,利⽤Jenkins强⼤的插件功能,轻松实现CI/CD,但如果部署多项⽬到同⼀台服务器涉及环境⼀致性问题,对此可以利⽤容器技术Docker解决,也可以利⽤Python虚拟环境例如virutalenv或conda等优秀等⼯具解决,在此由于后期根据requirements来安装依赖包⽐较慢,且后期需要将Python整个环境打包,利⽤conda⼯具来对项⽬环境进⾏管理,⽅便快速移植。
本⽂较系统的记录下部署⼀个具体的Django项⽬,包括利⽤conda⼯具来实现Python多环境管理,Pylint⼯具来实现代码检查,使⽤nose 框架做单元测试和覆盖率。
⼆、必备知识
Jenkins基础安装部署
可参考:
Conda软件包管理系统
由于conda包较⼤,通常情况下可以使⽤Miniconda 官⽹下载地址: 基础使⽤命令:
⼀、⼯具包管理命令
1.更新⼯具包
conda update conda
conda upgrade --all
2.安装包(进⼊虚拟环境,也可⽤pip安装)python新建项目教程
conda install package_name
可以指定版本
conda install package_name=1.10
3.移除包
conda remove package_name
4.查看包
conda list
5.查询包
conda search package_name
6.源配置
因为anaconda的服务器在国外,因此有时候速度会⽐较慢,可以换到国内源,⽐如清华的TUNA。
conda config --show-sources #查看当前使⽤源
conda config --remove channels 源名称或链接 #删除指定源
conda config --add channels 源名称或链接 #添加指定源
# 添加Anaconda的TUNA镜像
conda config --add channels mirrors.tuna.tsinghua.edu/anaconda/pkgs/free/
# TUNA的help中镜像地址加有引号,需要去掉
# 设置搜索时显⽰通道地址
conda config --set show_channel_urls yes
⼆、Python环境管理命令
1.显⽰创建的所有环境
conda env list
2.创建python环境:
conda create -n env_name list of packages
eg:conda create -n py2 python=2.7 request
3.进⼊python环境:(windows 环境不需要加source)
source activate env_name
eg:source activate py2
4.退出环境:
source deactivate
5.查看某环境下已安装的包
conda list -n python2
6.复制环境:
conda create --name <new_env_name> --clone <copied_env_name>
7.删除环境:
conda remove -n go2cloud-api-env --all
8.环境⽣成为YAML⽂件
当分享代码的时候,同时也需要将运⾏环境分享给⼤家,⾸先进⼊到环境中,执⾏如下命令可以将当前环境下的 package 信息存⼊名为 environment 的 YAML ⽂件中复制代码
conda env export > environment.yaml
同样,当执⾏他⼈的代码时,也需要配置相应的环境。这时你可以⽤对⽅分享的 YAML ⽂件来创建⼀摸⼀样的运⾏环境
conda env create -f environment.yaml
Shell基础
可参考:
GIT基础
可参考:
三、优化
⽣成主题
主题⼯具⽣成链接: 在主题⼯具⽣成喜欢的颜⾊已经上传logo下载⽣成的主题到Jenkins服务器的jenkins 家⽬录,⼀般为安装启动jenkins系统⽤户的家⽬录下.jenkins/userContent/material/,如果没
有此⽬录需要新建⽬录,css⽂件移动到⽬录下,例
如/root/.jenkins/userContent/material/blue.css。
Jenkins上配置主题
注意
本地css的url可以浏览器打开测试访问,如果访问不到会默认加载Jenkins默认主题 后期迁移url最好写成localhost,如果写公⽹IP,css ⽂件不存在404,Jenkins页⾯会很卡。
四、部署实战
4.1 服务器列表
名称IP软件备注Jenkins-server10.57.61.138miniconda Jenkins服务器
Des-server172.21.0.10miniconda项⽬部署服务器
4.2 架构图
4.3 前期准备
1. 安装依赖包
pylint: Python静态代码审查包,参考:
mock: ⽤来⽣成测试数据。
nose: Python单元测试包。
coverage: Python代码覆盖率包。
对依赖包需要在Jenkins-server服务器进⾏安装,⾸先根据项⽬⾥⾯conda创建对应项⽬对虚拟环境conda create -n <project_name> python=3.6,创建完成利⽤conda env list查看环境,为避免环境污染,在项⽬环境内利⽤pip⼯具安装软件pip install pylint mock nose coverage。
2. 安装Jenkins插件
JUnit: ⽤来展⽰nose框架⽣成的单元测试报表(Allows JUnit-format test results to be published.)
Cobertura Plugin:⽤来展⽰Python代码测试覆盖率报表(This plugin integrates Cobertura coverage reports to Jenkins.) Violations plugin:⽤来展⽰Python静态代码审查报表(This plugin does reports on checkstyle, csslint, pmd, cpd, fxcop, pylint, jcReport, findbugs, and perlcritic violations.),参考:
Git Plugin:⽤来从Gitbucket源代码库拉取代码(This plugin allows GitLab to trigger Jenkins builds and display their results in the GitLab UI.)
Git Parameter:⽤于参数化构建选择git的branch(Adds ability to choose branches, tags or revisions from git repositories configured in project.)
4.4 创建任务
创建⾃由风格软件项⽬
New任务->构建⼀个⾃由风格的软件项⽬,填写描述,在此由于后期会利⽤pylint进⾏代码检查,给出了代码检查的消息类型,可以根据消息
类型进⾏相应修复处理。
配置参数化构建
配置选择git具体branch进⾏构建,和可以⾃定义端⼝,在此需要注意参数化构建的变了Name,在后续需要⽤到。
源码管理
在此需要选择源码仓库,选择gitlab已经认证⽅式,需要注意由于参数化构建选择了branch,在Branches to build需要引⽤上⾯的变量$branch。
构建配置
执⾏shell
执⾏shell此shell为在Jenkins服务器上执⾏,所以需要预先在其上配置Python虚拟环境,在其上进⾏代码审查,单元测试⽣成
以下为此项⽬⽰例shell脚本,此脚本需要根据⾃⼰的实际情况来修改,需要注意Python项⽬结构与需要代码检查的标识符。
base_dir=/root/.jenkins/workspace/
project=go2cloud-api-deploy-prod/
project_env=go2cloud-api-env
# 切换python环境
source activate ${project_env}
$(which python) -m pip install mock nose coverage
# 更新python环境
echo "+++更新Python环境+++"
if [ -f ${base_dir}${ ];then
$(which python) -m pip install -r ${base_dir}${ && echo 0 || echo 0
fi
# 代码检查/单元测试/代码测试覆盖率
echo "+++代码检查+++"
cd ${base_dir}
# ⽣成l
$(which pylint) -f parseable --disable=C0103,E0401,C0302 $(find ${project}/* -name *.py) >${base_l || echo 0
echo "+++单元测试+++"
# ⽣成l
#$(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 echo "+++代码覆盖率+++"
# ⽣成l
复制代码
python -m coverage xml --include=go2cloud-api-deploy-prod* || echo 0
发送⽂件及命令到⽬标服务器
在此需要制定发布到⽬标到的服务器远端⽬录,已经执⾏的命令,在此执⾏重启脚本。 由于在此项⽬为Django项⽬,需要制定虚拟环境/⼊⼝启动⽂件/启动端⼝。 将之前参数化构建的端⼝当作变量传递给脚本,启动相应的端⼝
#!/usr/bin/env bash
# 当前⽬录
BASEPATH=$(cd `dirname $0`;pwd)
# python解释器具体路径
PYTHON_BIN=$1
# mananger⽂件路径
MAIN_APP=$2
# python
SERVER_PORT=$3
[ $# -lt 3 ] && echo "缺少参数" && exit 1
LOG_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
# 启动服务
nohup ${PYTHON_BIN} -u ${MAIN_APP} runserver 0.0.0.0:${SERVER_PORT} &>> ${LOG_DIR}server-$(date +%F).log 2>&1 &
复制代码
构建后动作
JUnit插件实现单元测试报告,需要指定l
Cobertura Plugin插件实现覆盖率测试
Violations插件进⾏代码审计,需要制定Jenkins-server上的⽣成的l⽂件。
需要注意⽂件路径为jenkins服务器l,以及对应⽣成⽂件的编码。
邮件通知配置
选择邮件内容为Content Type为HTML,这样可以编写邮件HTML模版,⽣成较为好看的邮件通知模版。 注意选择触发告警可以选择类型,失败⼏次或⽆论构建成功失败都发送,可根据具体需求配置。
邮件HTML模版
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建⽇志</title>
</head>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论