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 03 Python
Python使用lxml模块和Requests模块抓取HTML页面的教程
May 16 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
Python动态语言与鸭子类型详解
Jul 01 Python
python 控制Asterisk AMI接口外呼电话的例子
Aug 08 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
基于Pycharm加载多个项目过程图解
Jan 19 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
python3跳出一个循环的实例操作
Aug 18 Python
如何将json数据转换为python数据
Sep 04 Python
python利用paramiko实现交换机巡检的示例
Sep 22 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
第八节 访问方式 [8]
2006/10/09 PHP
第十三节 对象串行化 [13]
2006/10/09 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
set_exception_handler函数在ThinkPHP中的用法
2014/10/31 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
PHP SPL标准库之数据结构栈(SplStack)介绍
2015/05/12 PHP
php字符串操作常见问题小结
2016/10/11 PHP
关于js内存泄露的一个好例子
2013/12/09 Javascript
用JavaScript实现用一个DIV来包装文本元素节点
2014/09/09 Javascript
JS+CSS实现仿新浪微博搜索框的方法
2015/02/24 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
mac下的nodejs环境安装的步骤
2017/05/24 NodeJs
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
javascript触发模拟鼠标点击事件
2019/06/26 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
Python Web开发模板引擎优缺点总结
2014/05/06 Python
Python实现简单的四则运算计算器
2016/11/02 Python
Python下实现的RSA加密/解密及签名/验证功能示例
2017/07/17 Python
基于python select.select模块通信的实例讲解
2017/09/21 Python
python安装scipy的步骤解析
2019/09/28 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
Levi’s美国官网:美国著名的牛仔裤品牌
2016/08/19 全球购物
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
电子专业毕业生自我鉴定
2014/01/22 职场文书
马智宇婚礼主持词
2014/03/22 职场文书
培训协议书范本
2014/04/22 职场文书
企业精神口号
2014/06/11 职场文书
供用电专业求职信
2014/07/07 职场文书
2014年居委会工作总结
2014/12/09 职场文书
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫