Python基于Webhook实现github自动化部署


Posted in Python onNovember 28, 2020

一. 分析需求

1. 需求说明

在项目开发过程中,我们有时会频繁的更新代码, 流程大概为:

(1) 本地git push提交代码至git托管平台

(2) 登陆到部署有网站源码的线上服务器

(3) cd到项目根目录, 执行git pull 指令拉取最新代码

Python基于Webhook实现github自动化部署

整个流程纯手动更新,每次耗时在1分钟左右, 这样一天下来,浪费了很多时间在这些琐碎的事情上.

现在的需求是,在每次本地提交代码后,线上服务器自动拉取最新代码,完成部署更新.即所谓的自动化部署.

2. 方案

现在一些主流代码托管平台如github、 gitlab、git@osc 等均已提供webhook功能,在用户push了代码后,会自动回调一个您设定的http地址。 用户可以自己根据不同的需求,来编写自己的脚本程序(比如发邮件,自动部署等);目前,webhook支持多种触发方式,如Push、 Tag Push、 Issue、评论、合并请求 等。

附webhook的简介:

Webhook就是用户通过自定义回调函数(callback)的方式来改变Web应用的一种行为,这些回调函数可以由不是该Web应用官方的第三方用户或者开发人员来维护,修改。通过Webhook,你可以自定义一些行为通知到指定的URL去。Webhook的“自定义回调函数”通常是由一些事件触发的,比如推送代码到代码库或者博客下新增一个评论,源站点会为Webhook进行HTTP请求的URI配置。用户通过配置,就可以使一个网站上的事件调用在另一个网站上表现出来,这些事件调用可以是任何事件,但通常应用的是系统集成和消息通知。

方案流程:

Python基于Webhook实现github自动化部署

所以自动部署主要实现方式就是:

- 修改代码 push

- github(其他仓库平台)发送请求给你的网站服务器

- 网站服务器收到更新请求,执行自动部署脚本

- 自动部署脚本执行代码拉取,打包,修改文件等动作完成网站的更新部署

二、具体实现

Github仓库设置

在GitHub上需要更新的代码仓库添加webhooks, 在指定仓库→settings→webhooks

Python基于Webhook实现github自动化部署

编写GitHub推送回调

python开启web服务(hook.py)

import hmac
import os
from flask import Flask, request, jsonify

app = Flask(__name__)
# github中webhooks的secret
github_secret = 'xxxxxxxx'

def encryption(data):
  key = github_secret.encode('utf-8')
  obj = hmac.new(key, msg=data, digestmod='sha1')
  return obj.hexdigest()

@app.route('/hook', methods=['POST'])
def post_data():
  """
  github加密是将post提交的data和WebHooks的secret通过hmac的sha1加密,放到HTTP headers的
  X-Hub-Signature参数中
  """
  post_data = request.data
  token = encryption(post_data)
  # 认证签名是否有效
  signature = request.headers.get('X-Hub-Signature', '').split('=')[-1]
  if signature != token:
    return "token认证无效", 401
  # 运行shell脚本,更新代码
  os.system('sh deploy.sh')
  return jsonify({"status": 200})

if __name__ == '__main__':
  app.run(port=8989)

编写shell脚本(deploy.sh)

cd "$(dirname "$0")"
echo '--------Git pull------------'
git pull
echo '-----Already up-to-date------'
echo '----- restart supervision-----'
supervisorctl restart blog
echo '----- reload nginx-----'
nginx -s reload

注意: 此次部署的hook.py 和deploy.sh都是在仓库的同一目录下

开启服务

supervisor部署webhook

[program:webhook]
directory=/data/wwwroot/docs
command=/home/dukenan/.envs/flask_py3/bin/python3 hook.py
autostart=true
autorestart=false
startsecs=1
;使用root账户
user=root
stderr_logfile=/etc/supervisor/logs/webhooks/stderr.log 
stdout_logfile=/etc/supervisor/logs/webhooks/stdout.log 
redirect_stderr=true
loginfo=info

部署NGINX的参考

server {
  listen 80; 
  server_name 服务器IP; # 配置域名
  client_max_body_size 300M;
  location / { 
    proxy_pass http://127.0.0.1:8989; #转发本地8989端口
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }  
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 七种邮件内容发送方法实例
Apr 22 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
Flask 让jsonify返回的json串支持中文显示的方法
Mar 26 Python
Python 爬取携程所有机票的实例代码
Jun 11 Python
python 自动去除空行的实例
Jul 24 Python
python实现人机猜拳小游戏
Feb 03 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
基于python实现检索标记敏感词并输出
May 07 Python
Python实现查找数据库最接近的数据
Jun 08 Python
浅析python中的del用法
Sep 02 Python
解决pytorch 数据类型报错的问题
Mar 03 Python
Django-simple-captcha验证码包使用方法详解
Nov 28 #Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 #Python
python 用Matplotlib作图中有多个Y轴
Nov 28 #Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 #Python
Python Http请求json解析库用法解析
Nov 28 #Python
基于Django集成CAS实现流程详解
Nov 28 #Python
Django haystack实现全文搜索代码示例
Nov 28 #Python
You might like
Ajax PHP简单入门教程代码
2008/04/25 PHP
php短址转换实现方法
2015/02/25 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
PHP转换文本框内容为HTML格式的方法
2016/07/20 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
JS读取cookies信息(记录用户名)
2012/01/10 Javascript
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
jQuery中:gt选择器用法实例
2014/12/29 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
jQuery简单实现QQ空间点赞已经取消点赞
2015/04/02 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
利用浮层使select不可选的实现方法
2016/12/03 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
vue-cli+iview项目打包上线之后图标不显示问题及解决方法
2019/10/16 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
python检测服务器是否正常
2014/02/16 Python
解决Django连接db遇到的问题
2019/08/29 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
Tensorflow实现部分参数梯度更新操作
2020/01/23 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
莫斯科隐形眼镜网上商店:Linzi
2019/07/22 全球购物
计算机专业学生求职信分享
2013/12/15 职场文书
出生公证书样本
2014/04/04 职场文书
企业指导教师评语
2014/04/28 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
运动会入场词
2015/07/18 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书