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 requests 使用快速入门
Aug 31 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
Feb 07 Python
利用pandas将numpy数组导出生成excel的实例
Jun 14 Python
python将一个英文语句以单词为单位逆序排放的方法
Dec 20 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 Python
python实现滑雪者小游戏
Feb 22 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例
Mar 06 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
Python 的 sum() Pythonic 的求和方法详细
Oct 16 Python
python中filter,map,reduce的作用
Jun 10 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中的 == 运算符进行字符串比较
2006/11/26 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
jQuery输入城市查看地图使用介绍
2013/05/08 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
使用基于Node.js的构建工具Grunt来发布ASP.NET MVC项目
2016/02/15 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
详解Vuex管理登录状态
2017/11/13 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
使用Vue Composition API写出清晰、可扩展的表单实现
2020/06/10 Javascript
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python书单 不将就
2017/07/11 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
Python检测网络延迟的代码
2018/05/15 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
用CSS3实现瀑布流布局的示例代码
2017/11/10 HTML / CSS
MVMT手表官方网站:时尚又实惠的高品质手表
2016/12/04 全球购物
英语文学专业学生的自我评价
2013/10/31 职场文书
水污染治理专业毕业生推荐信
2013/11/14 职场文书
大学生创业计划书的范文
2014/01/07 职场文书
十佳青年事迹材料
2014/08/21 职场文书
物流专业专科生职业生涯规划书
2014/09/14 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
2014年村计划生育工作总结
2014/11/14 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
安全先进个人材料
2014/12/29 职场文书
离婚起诉状范本
2015/05/19 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis