持续集成与自动部署配置-Django项目
首发链接:[https://chen-yijie.blogspot.com/2018/10/django.html]
持续集成与自动部署配置
以Django项目WeChatTicket为例
travisCI持续集成与测试
这一部分较为简单,直接按照travisCI官网教程操作即可,最后跑一下test即可
配置详见https://github.com/chenyijie2016/WeChatTicket/blob/master/.travis.yml
jenkins自动测试与部署
这一部分较为复杂,使用jenkins实现。其中jenkins分为两个构建任务
jenkins配置
第一个执行测试任务,每两分钟轮询git仓库抓取最新更改,重新建立虚拟环境进行测试
第二个执行部署任务,当且仅当上一个构建任务构建稳定(测试通过)时执行:
关闭正在运行的uwsgi
通过执行脚本清理原有的部署环境(rm -rf *)
重新建立虚拟环境,安装依赖
重启uwsgi服务
任务1
使用git源码管理,构建时进入的就是项目目录
触发器设置SCM轮询
任务1脚本:
sudo cp /[CONFIG_PATH]/configs.json ./configs.json
mysql -uroot -p -e 'CREATE DATABASE IF NOT EXISTS wechat_ticket;'
virtualenv -p /usr/bin/python3 env
. env/bin/activate
pip install -r requirements.txt
python manage.py test
deactivate
CONFIG_PATH: 存放配置文件的目录
任务2:
由于生产环境路径需要固定并且稳定,故任务2就是一个执行脚本的过程
触发器设置为上一个任务稳定构建时触发
任务2脚本:
cd [PATH_TO_DEPLOY]
# Clear previous deployment
sudo rm -rf *
git clone https://github.com/chenyijie2016/WeChatTicket.git
cd WeChatTicket
# Copy config file
cp /[CONFIG_PATH]/configs.json ./configs.json
cp /[CONFIG_PATH]/uwsgi.ini ./uwsgi.ini
# Stop uwsgi
cp /[CONFIG_PATH]/stopuwsgi.sh ./stopuwsgi.sh
sudo sh ./stopuwsgi.sh
# Create new env
virtualenv -p /usr/bin/python3 env
. env/bin/activate
pip install -r requirements.txt
# Database manage
python manage.py makemigrations
python manage.py migrate
# python manage.py syncmenu # 更新抢票菜单
# Start
uwsgi --ini uwsgi.ini
CONFIG_PATH:配置文件目录
PATH_TO_DEPLOY:部署的目录,与下面nginx配置中的PATH_TO_YOUR_PROJECT相同
由于uwsgi无法方便关闭(尝试 /etc/init.d/uwsgi stop 无效),使用脚本stopuwsgi.sh查找pid并kill
stopuwsgi.sh:
#!/bin/sh
NAME="uwsgi"
if [ ! -n "$NAME" ];then
echo "no arguments"
exit;
fi
echo $NAME
ID=`ps -ef | grep "$NAME" | grep -v "$0" | grep -v "grep" | awk '{print $2}'`
echo $ID
for id in $ID
do
kill -9 $id
echo "kill $id"
done
来自https://www.gowhich.com/blog/view/id/353?utm_source=tuicool&utm_medium=referral
特别注意:jenkins的执行用户为jenkins,需要分配其sudo权限,以及对于部署目录的读写权限
uwsgi配置
详见上一篇博文:bug解决及uwsgi部署Django项目
nginx配置
设置静态资源与uwsgi的转发
服务配置如下
server {
listen 80 default_server;
listen [::]:80 default_server;
root /[PATH_TO_YOUR_PROJECT]/WeChatTicket/static;
index index.html;
server_name [YOUR_SITE_DOMAIN];
location /api {
root /[PATH_TO_YOUR_PROJECT]/WeChatTicket;
uwsgi_pass 127.0.0.1:8000;
include /etc/nginx/uwsgi_params;
}
location /wechat {
root /[PATH_TO_YOUR_PROJECT]/WeChatTicket;
uwsgi_pass 127.0.0.1:8000;
include /etc/nginx/uwsgi_params;
}
location / {
root /[PATH_TO_YOUR_PROJECT]/WeChatTicket/static;
try_files $uri $uri/ =404;
}
}
PATH_TO_YOUR_PROJECT:部署的路径
YOUR_SITE_DOMAIN:域名配置
nginx 路由配置可以参考这篇教程https://www.cnblogs.com/jackylee92/p/6836948.html