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 02 Python
python读写ini配置文件方法实例分析
Jun 30 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
Python2随机数列生成器简单实例
Sep 04 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
python中数据库like模糊查询方式
Mar 02 Python
Tensorflow tf.nn.depthwise_conv2d如何实现深度卷积的
Apr 20 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
pytorch 移动端部署之helloworld的使用
Oct 30 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
 python中的元类metaclass详情
May 30 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
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
php 带逗号千位符数字的处理方法
2012/01/10 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
2015/06/23 PHP
php单链表实现代码分享
2016/07/04 PHP
PHP中十六进制颜色与RGB颜色值互转的方法
2019/03/18 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
JS+JSP checkBox 全选具体实现
2014/01/02 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
Javascript基于对象三大特性(封装性、继承性、多态性)
2016/01/04 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
jQuery animate()实现背景色渐变效果的处理方法【使用jQuery.color.js插件】
2017/03/15 Javascript
用js将long型数据转换成date型或datetime型的实例
2017/07/03 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
python模拟斗地主发牌
2020/04/22 Python
使用HTML5 Geolocation实现一个距离追踪器
2018/04/09 HTML / CSS
expedia比利时:预订航班+酒店并省钱
2018/07/13 全球购物
Ever New加拿大官网:彰显女性美
2018/10/05 全球购物
食品营养与检测应届生求职信
2013/11/08 职场文书
英文商务邀请信
2014/01/22 职场文书
广播体操比赛口号
2014/06/10 职场文书
师德师风自查总结
2014/10/14 职场文书
论文答谢词
2015/01/20 职场文书
服务行业标语口号
2015/12/26 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书