Jello's development blog

Jello's development blog

Flask를 이용한 github webhook 걸기

이 글은 Mac, Ubuntu의 환경에서 python이 설치되어 있다고 가정하고 작성되었다.

Flask란 무엇인가?

플라스크(Flask)는 아주 가벼운 마이크로(Micro) 서버 프레임워크이다. 마이크로라는 이름에 걸맞게 아주 작고 가벼우며, 빠르게 동작한다. Flask는 서버 프레임워크에 필요한 핵심 기능만 제공하고, 나머지는 개발자가 직접 개발하거나 다른 패키지로 확장시켜서 사용되도록 유연하게 설계되어있다.

기본 틀 만들기

Flask는 아주 빠르게 기본 틀을 설계할 수 있다. Github에서 요청이 들어올 하나의 주소만 만들어주면 되므로 Flask는 여기에 안성맞춤이다.

먼저 virtualenv를 생성해야 하는데, 이는 다른 포스팅에 자세히 나와있으므로 생략하도록 하고, 생성된 virtualenv에 flask를 설치한다.

(virtualenv)$ pip install flask

프로젝트 디렉토리를 만들고(/), 여기에 app.py를 생성하여 틀을 만들어준다.

/app.py

from flask import Flask, request
app = Flask(__name__)

@app.route("/", methods=['post'])
def default():
	data = request.get_json()
	return 'success'
	
	
if __name__ == '__main__':
    app.run(host='0.0.0.0')
    

먼저 @app.route를 보면, 가장 루트(/)에 POST로 라우팅을 받게 설정했다. request.get_json()은 넘어온 데이터를 json 형식으로 읽어들여서 dictionary형식으로 쓸 수 있게 해준다. 그리고 맨 밑의 if문은 python 명령어로 이 파일을 실행했을 때에만 적용되는데, 그 때에 서버를 실행시켜준다. 디버그 모드가 아니고 외부의 요청을 받아야 할 때에는 run()함수에 host='0.0.0.0' 매개변수를 넣어줘야 한다.

이제 위의 기본 틀에, 여러분이 요청(Push, Pull request)이 왔을 때에 해야 할 일을 만들어준다면 쉽게 자동화가 가능하다.

서버에 배포

자신의 서버(여기서는 Ubuntu)로 들어가서 Git이나 SVN 등을 이용해 프로젝트를 배포한 뒤에 gunicorn으로 WSGI app을 실행해보자.

먼저 gunicorn을 설치한다. gunicorn은 범용적인 패키지이므로 virtualenv 밖에다가 설치해주는 것이 좋다.

$ pip install gunicorn

다음으로 virtualenv 환경을 생성하고, flask를 설치하여 dependency를 동기화한 뒤에, 해당 환경으로 들어가서 gunicorn을 실행한다.

(virtualenv)$ gunicorn app:app
[...]

Github webhook 설정

Github은 webhook이라는 서비스를 제공하는데, 한 번 repository에 등록해놓으면 pushpull request 등과 같은 이벤트가 발생할 때마다 설정해놓은 주소로 관련 데이터들을 담아서 POST요청을 보낸다.

webhook을 추가하기 위해서는 사용할 repository에 들어가서, 상단 탭의 settings > webhooks으로 들어가서, Add webhook 버튼을 누르면 된다.

Webhook 추가하기
Webhook configuration

버튼을 누르면 Webhook을 등록하는 form이 나타난다. Payload URL은 이벤트가 발생했을 때에 Github이 POST요청을 보낼 주소를 말한다. 이 곳에 app.py를 실행할 서버 주소를 넣으면 되므로 자신의 서버 주소를 넣는다.
Content type은 Github이 보낼 데이터의 형식을 말한다. application/jsonapplication/x-www-form-urlencoded 중의 하나로 설정할 수 있다. 지금은 app.py가 json으로 받도록 했으니 json으로 선택한다.
Secret은 데이터의 헤더에 추가되는 값인데, repository의 고유 값을 설정해야 할 때 사용한다.
그 밑에는 어떠한 이벤트에서 트리거가 발동될 것인지 설정해주는 항목이 있다.

Add webhook버튼을 눌러 Webhook을 등록하게 되면 시험적으로 한 번 요청이 가는데, 다시 webhook 설정 페이지로 들어가게 되면 전달된 데이터를 볼 수 있다.

Webhook delivery

여기에는 직접적인 데이터들이 들어가 있는 것이 아니라, Github의 API 주소가 들어있어서 commit이나 issue에 대한 정보를 얻으려면 그에 대한 URL을 한 번 더 호출해야한다.

혹시나 문제가 생겨서 요청이 제대로 가지 않았다면, 상단의 Redeliver버튼을 통해 수동으로 요청을 보낼 수도 있으니 참고하도록 하자.