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查看多台服务器进程的脚本分享
Jun 11 Python
Python实现命令行通讯录实例教程
Aug 18 Python
win8下python3.4安装和环境配置图文教程
Jul 31 Python
Python3.5内置模块之time与datetime模块用法实例分析
Apr 27 Python
对Django url的几种使用方式详解
Aug 06 Python
python3.6生成器yield用法实例分析
Aug 23 Python
Python的Lambda函数用法详解
Sep 03 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python实现井字棋小游戏
Mar 04 Python
Python系统公网私网流量监控实现流程
Nov 23 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 Python
OpenCV-Python实现图像平滑处理操作
Jun 08 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 处理图片的类实现代码
2009/10/23 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
laravel实现前后台路由分离的方法
2019/10/13 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
javascript 常用关键字列表集合
2007/12/04 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
2013/12/18 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
2016/01/09 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
2016/02/23 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
Python中字典的基本知识初步介绍
2015/05/21 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
python 6行代码制作月历生成器
2020/09/18 Python
Python datetime模块的使用示例
2021/02/02 Python
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
《和我们一样享受春天》教学反思
2014/02/07 职场文书
医学生临床实习自我评价
2014/03/07 职场文书
给校长的建议书600字
2014/05/15 职场文书
2014年惩防体系建设工作总结
2014/12/01 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
警示教育观后感
2015/06/17 职场文书
在人间读书笔记
2015/06/30 职场文书
初三英语教学反思
2016/02/15 职场文书
Python实现学生管理系统并生成exe可执行文件详解流程
2022/01/22 Python
Vue+Flask实现图片传输功能
2022/04/01 Vue.js
Python时间操作之pytz模块使用详解
2022/06/14 Python