当前位置: 首页 > 编程笔记 >

Python基于Webhook实现github自动化部署

璩俊雅
2023-03-14
本文向大家介绍Python基于Webhook实现github自动化部署,包括了Python基于Webhook实现github自动化部署的使用技巧和注意事项,需要的朋友参考一下

一. 分析需求

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;
  }  
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍GO 使用Webhook 实现github 自动化部署的方法,包括了GO 使用Webhook 实现github 自动化部署的方法的使用技巧和注意事项,需要的朋友参考一下 通常大家开发大部分是本地git push 提交,服务器上git pull 手动更新。git 可以使用webhook实现自动部署。 webhook是仓库平台的一个钩子事件,通过hook 钩子监听代码,回调通知(通知地址

  • 本文向大家介绍如何基于Python实现自动扫雷,包括了如何基于Python实现自动扫雷的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了如何基于Python实现自动扫雷,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式。 一

  • 发展历程: 《selenium_webdriver(python)第一版》 将本博客中的这个系列整理为pdf文档,免费。 《selenium_webdriver(python)第二版》 加入的单元测试框架unittest,用其组织和运行测试用例, 5元。 《selenium_webdriver(python)第三版》 整合和HTML测试报告的生成,初步形成测试架构的雏形, 8元。 《seleniu

  • 本文向大家介绍基于Python实现人脸自动戴口罩系统,包括了基于Python实现人脸自动戴口罩系统的使用技巧和注意事项,需要的朋友参考一下 1、项目背景 2019年新型冠状病毒感染的肺炎疫情发生以来,牵动人心,举国哀痛,口罩、酒精、消毒液奇货可居。 抢不到口罩,怎么办?作为技术人今天分享如何使用Python实现自动戴口罩系统,来安慰自己,系统效果如下所示: 本系统的实现原理是借助 Dlib模块的L

  • 本文向大家介绍Python自动化xpath实现自动抢票抢货,包括了Python自动化xpath实现自动抢票抢货的使用技巧和注意事项,需要的朋友参考一下 小伙伴们,这次推文讲的是‘xpath‘,掌握起来不难的哦。而且,熟悉了这套路,别说pubmed,任何你能在浏览器实现的操作,都基本能通过selenium自动化进行。 总代码: 代码1 for i in range(1,50+1): printg('

  • 本文向大家介绍python unittest实现api自动化测试,包括了python unittest实现api自动化测试的使用技巧和注意事项,需要的朋友参考一下 项目测试对于一个项目的重要性,大家应该都知道吧,写python的朋友,应该都写过自动化测试脚本。 最近正好负责公司项目中的api测试,下面写了一个简单的例子,对API 测试进行梳理。 首先,编写restful api接口文件 testp