Python 은 Webhook 기반 github 자동화 배 치 를 실현 합 니 다.

수요 분석
1.수요 설명
프로젝트 개발 과정 에서 우 리 는 가끔 코드 를 자주 업데이트 합 니 다.절 차 는 다음 과 같 습 니 다.
(1)로 컬 git push 는 git 위탁 관리 플랫폼 에 코드 를 제출 합 니 다.
(2)사이트 소스 코드 가 배 치 된 온라인 서버 에 로그 인
(3)cd 에서 프로젝트 루트 디 렉 터 리 로,git pull 명령 을 실행 하여 최신 코드 를 끌 어 옵 니 다.

전체 프로 세 스 는 수 동 으로 업데이트 되 고 매번 1 분 정도 걸 립 니 다.이런 날 이 오 면 이런 사소한 일 에 많은 시간 을 낭비 합 니 다.
현재 의 수 요 는 로 컬 에서 코드 를 제출 할 때마다 온라인 서버 에서 최신 코드 를 자동 으로 끌 어 와 배치 업 데 이 트 를 완성 하 는 것 이다.즉,자동화 배치 라 는 것 이다.
2.방안
현재 일부 주류 코드 위탁 관리 플랫폼,예 를 들 어 github,gitlab,git@osc등 은 모두 webhook 기능 을 제공 합 니 다.사용자 push 가 코드 를 입력 하면 설정 한 http 주 소 를 자동 으로 되 돌려 줍 니 다.사용 자 는 서로 다른 수요 에 따라 자신의 스 크 립 트 프로그램 을 작성 할 수 있 습 니 다(예 를 들 어 메 일 보 내기,자동 배치 등).현재 웹 훅 은 Push,Tag Push,Issue,댓 글,합병 요청 등 다양한 트리거 방식 을 지원 합 니 다.
웹 훅 의 프로필 첨부:
Webhook 은 사용자 가 사용자 정의 리 셋 함수(callback)를 통 해 웹 응용 을 바 꾸 는 행위 입 니 다.이러한 리 셋 함 수 는 이 웹 응용 공식 제3자 사용자 나 개발 자가 아 닌 사용자 가 유지 하고 수정 할 수 있 습 니 다.Webhook 을 통 해 지정 한 URL 에 행동 알림 을 사용자 정의 할 수 있 습 니 다.Webhook 의'사용자 정의 리 셋 함수'는 보통 일부 이벤트 에서 발생 합 니 다.예 를 들 어 코드 라 이브 러 리 나 블 로그 에 추 가 된 댓 글 입 니 다.원본 사 이 트 는 Webhook 에 HTTP 요청 URI 설정 을 합 니 다.사용 자 는 설정 을 통 해 한 사이트 의 사건 을 다른 사이트 에 호출 시 킬 수 있 습 니 다.이런 사건 호출 은 모든 사건 일 수 있 지만 시스템 통합 과 메시지 알림 을 사용 합 니 다.
프로젝트 프로 세 스:

그래서 자동 배치 의 주요 실현 방식 은:
-코드 수정 push
-github(기타 창고 플랫폼)이 요청 한 사이트 서버
-사이트 서버 업데이트 요청,자동 배치 스 크 립 트 실행
-자동 배치 스 크 립 트 실행 코드 추출,압축,파일 수정 등 동작 으로 사이트 업데이트 완료
구체 적 실현
Github 창고 설정
GitHub 에 업데이트 할 코드 창고 에 webhooks 를 추가 하고,지정 한 창 고→settings→webhooks

GitHub 푸 시 리 셋 작성
python 웹 서비스 오픈(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)
셸 스 크 립 트 작성(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 는 창고 의 같은 디 렉 터 리 에 있 습 니 다.
서비스 시작
관리자 배치 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;
  }  
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기