GitHook实现Django自动化部署
来源:互联网 发布:淘宝要交多少保证金吗 编辑:程序博客网 时间:2024/06/15 07:56
前言
项目中Django自动化部署的要求是:master分支,push了新的commit,需要自动拉去最新的代码,重启uwsgi,直接部署新版本上线。通过日志文件远程监控部署状态。
原来一直寄托与github的webhook来实现,但是这种第三方推送,自己服务器还需要单独开一个webhook服务单独跑来响应github的推送,操作很不方便!最不能忍的是 Github非常慢 git fetch一下都要等半天!
所以最后采用的方案是自己在阿里云上搭建git服务器,配上gitweb,效果基本和github一样,当然美观程度不及github,若追求美观,更好的方案是使用gitlab。相比于github好处有:
- git速度非常快,git clone/push/pull 基本是秒传,毕竟访问的是阿里云
- 私人仓库,对于团队项目没必要放到开源的github上
- 通过hooks非常方便实现自动化部署
自动化部署=git私服+githooks
Git服务器搭建
Google git服务器搭建,方案很多。主流是设置一个Git用户单独管理。其实对于小团队和个人用,直接使用root用户也是可以的。
下面创建hooktest的仓库。
cd /home/gitmkdir hooktest.gitcd hooktest.gitgit init --bare
这样仓库创建好了,修改gitweb的配置文件指向git目录,在网页中就能看到了:
客户端clone仓库:
git clone root@阿里云ip:/home/git/hooktest.git
说明: root
:因为是root用户创建的 阿里云ip
:也就是远端服务器的ip地址 /home/git/hooktest.git
:项目仓库的地址
在clone
时会提示输入root
用户的密码
如果clone成功则,说明git服务器搭建完成了。
Django项目配置
在生产环境中,Django项目是通过Nginx+uwsgi来部署的。具体参考:
Django在生产环境的部署
在本地仓库中创建Django项目,让项目能够运行起来。然后push
到远端仓库中。
创建文件django_wsgi.py
#!/usr/bin/env python# coding: utf-8import osimport sys# 将系统的编码设置为UTF8reload(sys)sys.setdefaultencoding('utf8')os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hooktest.settings")from django.core.wsgi import get_wsgi_applicationapplication = get_wsgi_application()
uwsgi_socket.xml
<uwsgi> <socket>:8000</socket> <chdir>/home/www/hooktest</chdir> <module>django_wsgi</module> <processes>1</processes> <daemonize>/home/www/hooktest/static/log.txt</daemonize></uwsgi>
其中/home/www/hooktest/static/log.txt
为uwsgi
日志文件,放到static
目录下可以直接通过nginx
查看日志
远端服务器Nginx配置:
server { listen 80; root /usr/share/nginx/html; index index.html index.htm; # Make site accessible from http://localhost/ server_name zhujian.nghuyong.top; location /static/ { alias /home/www/hooktest/static/; index index.html index.htm; } location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; }}
这样重启nginx,clone代码到本地的www仓库,启动uwsgi项目就部署了。
Githook配置
githook,就是在有代码push的时候自动启动一个脚本。
要自动化部署,要操作的步骤包括:
- 拉去最新代码
- 关闭uwsgi
- 启动uwsgi
在仓库hooks目录下创建post-receive
#!/bin/bash -lGIT_REPO=/home/git/hooktest.gitTMP_GIT_CLONE=/home/www/tmp/hooktestPUBLIC_WWW=/home/www/hooktestrm -rf ${TMP_GIT_CLONE} git clone $GIT_REPO $TMP_GIT_CLONE rm -rf ${PUBLIC_WWW}cp -rf ${TMP_GIT_CLONE} ${PUBLIC_WWW} pid=`lsof -i:8000| awk 'NR==2{print $2}'` echo "pid:$pid" kill -9 $pid lsof -i:8000nohup uwsgi -x ${PUBLIC_WWW}/uwsgi_socket.xmllsof -i:8000 chmod 777 ${PUBLIC_WWW}/static/log.txt
注意的地方: kill -9
nohup uwsgi...
这样push新的代码后,查看uwsgi的log,通过时间发现uwsgi已经重新启动,项目自动部署好了:
通过这个log可以随时监测项目的运行状况。
- GitHook实现Django自动化部署
- GitHook+JGit实现最新代码的自动克隆或者项目的自动部署
- Django项目部署 - 脚本自动化
- 利用GitHook构建持续交付和部署
- 使用 Githook 实现团队 Coding Review 流程
- ant实现自动化部署
- 使用Cargo实现自动化部署
- 使用Cargo实现自动化部署
- 使用Jenkins实现自动化部署
- Apache Ant 实现自动化部署
- 搭建jenkins实现自动化部署
- ANT实现自动化软件部署
- Maven Tomcat8+ 实现自动化部署
- Maven Tomcat7 实现自动化部署
- centos 6.5 部署tomcat 实现自动化部署
- django haystack update_index 实现自动化 同步
- 基于jenkins的自动化部署实现
- Maven使用Cargo实现自动化部署
- 文件锁和文件流操作:fcntl和fdopen
- 基于TI-RTOS的CC2640 UART
- 在IDEA中配置Gauge环境
- 调用微信分享接口,自定义分享内容(2)-调用分享接口(java开发)
- 视频处理问题
- GitHook实现Django自动化部署
- MoveWindow后OnSize没被调用的原因:WM_GETMINMAXINFO限制了
- POJ1004 Financial Management
- 【JAVA经典】关于int的超限
- 并发编程总结之volatile关键字
- centos中设置邮件发送
- runtime详解
- Django 1.10中文文档—第一个Django应用Part1
- CursorAdapter的使用