[PHP] github webhook을 이용한 소스코드 서버 자동배포

  • 우분투 16.04, git 2.7.4 환경을 기준으로 테스트 했습니다.

서비스에 사용되는 서버가 소수 일 때는 각 서버에 접속해서 git pull 명령어를 실행하면 됐지만 점점 더 많아지니까 소스 배포도 일이 되기에 github 를 이용해 소스코드를 서버에 자동 배포할 수 있는 환경을 구축하기로 했다. github 에서 제공하는 webhook 을 이용하면 문제를 해결할 수 있다. 환경 구축에 참고한 내용은 https://github.com/mboynes/github-deploy 이다.

#0. 준비

보통 웹서버는 www-data 등의 사용자로 실행이 된다. 웹루트의 소유자가 www-data 등의 사용자가 아니라면 퍼미션이 없기 때문에 바로 git pull 의 명령어를 실행시킬 수 없다. 이를 위해 www-data 사용자가 sudo 명령어를 사용할 수 있도록 수정했다. 배포 명령을 실행하는 deploy.php 파일은 웹루트에 위치한다.

위 명령어를 실행한 후 아래 라인을 추가한다. www-data 사용자에게 비밀번호 입력없이 git 명령어를 사용할 수 있도록 한다.

다음으로 각 서버에서 git 사용을 위한 기본적인 설정을 한다.

위에서 이메일과 이름은 변경한다. deploy 로그를 기록하기 위해 deploy.php 파일의 상위 디렉토리에 logs 디렉토리를 생성하고 www-data 사용자가 파일을 쓸 수 있도록 퍼미션을 수정한다. 보통은 chmod 707 logs 와 같이  실행한다. logs 디렉토리 안에 deploy.log 파일을 생성해 둔다. 소유권은 www-data 에게 준다.

#1. git pull 명령어를 실행할 php 추가

deploy.php 의 코드는 위와 같다. 그리고 아래는 deploy-config.php 의 코드이다. 위 코드 중 if( preg_match(‘#[deployment]#i’, $payload->commits[0]->message)) { 라고 한 부분은 배포 업무 스타일에 따라서 변경이 되어야 한다. 저의 경우는 우선 commit 하고 push 를 한 후 개발서버에서 pull 을 실행해 테스트를 하고 이상이 없다면 실서버에 배포를 하게 되는데 이 때는 마지막 commit 메세지를 git commit –amend 명령을 통해 수정하면서 [deployment] 문구를 추가한 후 다시 push를 하기 때문에 위와 같은 코드가 된 것이다. 처리 과정이 다르다면 이 부분은 payload 값을 확인하면서 그에 맞게 코드를 수정해야 한다.

#2. webhook 등록

github.com 에서 repo 설정에 webhook 을 등록한다. webhook 등록 때 url은 아래와 같은 형식으로 등록해야 한다.

 

위의 과정을 거친 후 commit 메세지에 [deployment] 문구가 들어가면 webhook 이 실행되어 git pull 명령을 실행하게 된다. 제대로 실행되지 않는다면 log 파일의 내용을 확인해서 조치한다.

편리

PHP와 MariaDB, jQuery 등을 사용해 게시판, 쇼핑몰 솔루션을 개발합니다. 그누보드5와 영카트5 개발에 참여 했습니다. Linux와 Nginx는 물론 WordPress, Git 등에도 관심이 많습니다. 자전거 타기 및 사진 촬영을 취미로 하고 있습니다.

Leave a Reply

Your email address will not be published. Required fields are marked *