七、Flask+Github触发webhoop接口

[root@iZj6cbtjqbqb2cx7qdl9z5Z bugbk.com]# more app.py
#coding: utf8

import hmac
import os
from flask import Flask, request, jsonify

app = Flask(__name__)
# github中webhooks的secret
github_secret = 'aabb1122'

def encryption(data):
    key = github_secret.encode('utf-8')
    obj = hmac.new(key, msg=data, digestmod='sha1')
    return obj.hexdigest()

@app.route('/bugbk', 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()

uwsgi.ini

[uwsgi]
#plugin=python3
virtualenv=/root/.local/share/virtualenvs/bugbk.com-nBYCV8PL
http=0.0.0.0:39000
uid=root
gid=root
#socket=/tmp/uwsgi.sock
#chmod-socket=666
enable-threads=true 
master=true
vhost=true
workers=5
max-requests=1000
pidfile=/var/run/uwsgi.pid
daemonize=/var/log/uwsgi.log
module=app
callable=app


chdir=/www/wwwroot/bugbk.com
wsgi-file=app.py
manage-script-name=true
touce-reload=/www/wwwroot/bugbk.com

pipenv管理

[root@iZj6cbtjqbqb2cx7qdl9z5Z bugbk.com]# cat Pipfile
[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flask = "*"
uwsgi = "*"
pipfile = "*"

[dev-packages]

[requires]
python_version = "3.7"

deploy.sh

[root@iZj6cbtjqbqb2cx7qdl9z5Z bugbk.com]# cat deploy.sh 
#!/usr/bin/bash

WORK_DIR=$(pwd)


echo "开始自动化构建..." >> /root/bugbk
[[ -d "${WORK_DIR}/bugbk" ]] && rm -fr ${WORK_DIR}/bugbk

git clone https://github.com.cnpmjs.org/dev-centos/bugbk.git \
&& cd ${WORK_DIR}/bugbk && npm install && hexo g && hexo d && chown www:www public -R

#[[ $? != 0 ]] && echo "hexo -d错误" >>/root/bugbk && exit 1


#cd ${WORK_DIR} &&  mv public /tmp/public_`date +%F_%T` && mv ${WORK_DIR}/bugbk/public . && chown www:www public -R

Last updated