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;
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.