Python基于Webhook实现github自动化部署
作者:-零 发布时间:2023-09-28 21:31:27
一. 分析需求
1. 需求说明
在项目开发过程中,我们有时会频繁的更新代码, 流程大概为:
(1) 本地git push提交代码至git托管平台
(2) 登陆到部署有网站源码的线上服务器
(3) cd到项目根目录, 执行git pull 指令拉取最新代码
整个流程纯手动更新,每次耗时在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配置。用户通过配置,就可以使一个网站上的事件调用在另一个网站上表现出来,这些事件调用可以是任何事件,但通常应用的是系统集成和消息通知。
方案流程:
所以自动部署主要实现方式就是:
- 修改代码 push
- github(其他仓库平台)发送请求给你的网站服务器
- 网站服务器收到更新请求,执行自动部署脚本
- 自动部署脚本执行代码拉取,打包,修改文件等动作完成网站的更新部署
二、具体实现
Github仓库设置
在GitHub上需要更新的代码仓库添加webhooks, 在指定仓库→settings→webhooks
编写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;
}
}
来源:https://www.cnblogs.com/-wenli/p/13420106.html


猜你喜欢
- 1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。 比如 SELECT * FR
- 环境:xadmin-for-python3 python3.5.2 django1.9.12问题描述:Product ProductSku两
- 初衷:在工作的时候,我们会有很多个项目,每个项目使用的库的版本不一样,导致我们切换项目的时候会很麻烦。比如:我有两个django项目,项目一
- 在使用SQL Server 的过程,中由于经常需要从多个不同地点将数据集中起来或向多个地点复制数据,所以数据的导出,导入是极为常见的操作.我
- os.Rename()这个函数的原型是func Rename(oldname, newname string) error,输入的是旧文件名
- 最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三
- 一、图示上面为pdf截图内容,下面为转化后的word截图内容接下来,我们试试自己动作写这个工具吧!二、前期准备由于我们采用的是python进
- 什么是RSS?RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),通常被用于新闻和其他按顺序排列的网站,例如Blog。一段
- Quoted-printable 可译为“可打印字符引用编码”、“使用可打印字符的编码”,我们收邮件,查看信件原始信息,经常会看到这种类型的
- 在Firefox推出3.5后,他增加了许多新的支持,今天抽空将他们整理一下。属性image-renderingtext-renderingi
- 0x00 前言大家对HTTP代理应该都非常熟悉,它在很多方面都有着极为广泛的应用。HTTP代理分为正向代理和反向代理两种,后者一般用于将防火
- 今天的主题!最近很多朋友问起pyecharts,尤其是地理坐标图的制作,都说被其图形之美给吸引到了。刚好今天也有同事问起来,那么今天就以py
- 代码如下所示:import osimport requestsimport datetimefrom Crypto.Cipher impor
- 数据库的选择原则是什么?我只知道小网站用Access,大网站用SQL,请问它的具体选择原则是什么?在实际应用中,数据库的选择原则一般是:如果
- subplot(arg1, arg2, arg3)arg1: 在垂直方向同时画几张图arg2: 在水平方向同时画几张图arg3: 当前命令修
- 今晚在Mac OS中搭建web服务器时遇到一点冲突,逛了几个论坛和网站,都说的太片面。先列出最正确的搭建步骤:(无论你是任何操作系统,或者任
- 本文实例为大家分享了python实现双色球随机选号的具体代码,供大家参考,具体内容如下双色球随机选号实现代码from random impo
- 对于需要大量翻译的数据,人工翻译太慢,此时需要使用软件进行批量翻译。1.使用360的翻译def fanyi_word_cn(string):
- Python的3.0版本,常被称为Python 3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。为了不带入过多的
- 导语:哈喽,哈喽~小编不知道你有没有经历过,想联系一位很长时间没有联系的朋友,发现对方很早以前已经把你删除了,而你还一无所知。反正小编经历过