#DevStudy/Git

Github - Webhook을 이용하여 배포 자동화

검은_백조 2020. 12. 1. 17:16

Github에 코드가 푸시되면 서버에서 자동으로 pull을 받아 최신화 하도록 세팅하였음.

 

이 레포지토리를 기본 베이스로 진행.

https://github.com/mboynes/github-deploy

 

mboynes/github-deploy

A simple PHP script to auto-deploy from github. Contribute to mboynes/github-deploy development by creating an account on GitHub.

github.com

원리는 간단하게 아래와 같음.

1. GitHub 레포지토리에 커밋이 푸시된다

2. GitHub Webhook으로 배포 서버(deploy.php)에 전달된다.

3. 배포 서버에서 git pull을 실행한다.

 

서버에 Apache2 , PHP 환경이 구성되어 있다는 가정하에 진행.


1. 배포서버에서 Webhook용 계정 생성(www-data) 및 ssh 인증서 생성

sudo mkdir /var/www/.ssh/
sudo chown www-data:www-data /var/www/.ssh
sudo -Hu www-data ssh-keygen -t rsa
# ssh 생성시 패스워드는 입력하지 않는다.
sudo cat /var/www/.ssh/id_rsa.pub

 

2. Github 레포지토리에 webhook을 추가

-Payload URL : webhook이 신호를 쏠 경로. [서버주소]/deploy.php?auth=[아이디]

-Secret : ssh 인증서 내용을 복붙한다. "ssh-rsa ~~~~~~" 의 형태로 되어있음. 그대로 복사하면 됨.

-나머지는 기본 세팅대로.

3. 위에 링크 github-deploy에서 deploy.php를 복사해서 배포서버 /var/www/html 경로에 추가함.

(Apache2 설치시 기본경로이고, 커스텀했다면 해당 경로에 추가)

 

4. 같은 경로에 deploy-config.php 파일을 생성해서 아래 내용 입력.

deploy.php가 실행될때 이 옵션값들을 읽어서 작동될거임.

<?php

 # 자동화를 사용할 브랜치 이름. refs/heads/main에 Push되면 자동화가 실행됨.
 define( 'REF_REGEX', '#^refs/heads/main$#' );

 # Log파일 경로. deploy.php의 상위 폴더/logs/deploy.log
 define( 'LOG', '../logs/deploy.log' );

 # 배포 서버의 레포지토리 경로. %s에는 레포지토리 이름이 들어감.
 define( 'REPO_DIR', dirname( __FILE__ ) . "/%s/" );

 # If set to true, $_POST gets logged
 define( 'DUMP_POSTDATA', false );

 # webhook등록시 ?auth=아이디 에 적은 것과 동일한 것 입력
 define( 'AUTH_KEY', '아이디' );

 # git pull 명령. sudo 권한이 필요해서 이렇게 세팅함.
 define( 'GIT_COMMAND', 'sudo -u www-data git pull' );

 # 특정 ip만 허용할지 여부. false로 했음.
 define( 'VERIFY_IP', false );
 
 ?>

 

5. deploy.php를 위한 각종 세팅

- ../logs/deploy.log 폴더 및 파일 생성 후 권한 부여

- www-data 유저에게 /var/www 경로에 권한 부여

cd /var/www
sudo mkdir logs
sudo vim logs/deploy.log
# 로그 파일은 빈내용으로 저장

sudo chown -R www-data /var/www/
sudo chmod 777 /var/www

 

6. Github 토큰 발급

-필요한 기능만 활성화된 토큰을 받아야하는데 잘 몰라서 일단 아래 항목들 체크했음.

-repo, workflow, write:packages, delete:packages

-발급 후 나오는 토큰키는 잘 복사해둔다.

 

7. Git checkout

- /var/www/레포지토리_이름 경로에 clone 받음.

sudo git clone https://[깃헙아이디]:[토큰키]@github.com/[깃헙아이디]/[레포지토리_이름].git

 

8. Github에 푸시했을 때 webhook이 잘 작동하는지 확인.

- 성공 표시가 나와도 실제로 pull 작동이 안되는 경우도 있음.

- 제대로 확인하려면 logs/deploy.log 파일을 확인할 것

- 성공하면 log파일에 아래와 같이 적혀있음.

2020-12-01 16:37:24
==============================
`refs/heads/main` matches, executing:
sudo -u www-data git pull
bash> sudo -u www-data git pull
From https://github.com/!@#!@#!@#!@#/!@#!@
   bae074e..82afeb7  main       -> origin/main
Updating bae074e..82afeb7
Fast-forward
 index.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
Over and out!

 

 

여기저기 헤메다보니 잘 정리해둬야겠다고 생각했지만 정작 빠진 내용이 많은 것 같음.