Skip to content
This repository has been archived by the owner on Jan 31, 2023. It is now read-only.

snacky101/webhook_autopull

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

68 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Auto pull guide by github webhook

아래의 포스팅과 깃을 참조하였으며, 리눅스(CentOS) 서버를 기준으로 작성하였습니다.

SSH KEY 생성

  • 사용하고자 하는 PC의 home 디렉토리에 .ssh 디렉토리가 있는지 확인합니다. home 디렉토리에서 아래의 커맨드를 이용하면 숨김 파일들까지 확인합니다.

      ls -al ~
    
  • 위 과정에서 이미 .ssh 디렉토리가 있다면 SSH KEY 생성 과정은 그대로 건너 뛰시면 되고, 그렇지 않은 경우에는 아래의 커맨드를 따라서 KEY를 우선 생성해 주셔야 합니다. 중간의 passphrase는 비워둬야 합니다.

      ssh-keygen
    

SSH KEY 등록

  • Github 계정에 해당 키를 추가하기 위해서 ssh-keygen 커맨드로 생성된 ~/.ssh 디렉토리 내부의 id_rsa.pub의 내용을 그대로 복사합니다.
  • Github 계정의 Setting 메뉴로 접근하여 "SSH and GPG keys" 탭으로 들어갑니다.
  • title을 적당히 정해 주신 후, id_rsa.pub 에 있던 내용 그대로를 Key 에 넣고 "Add SSH Key" 버튼을 눌러 저장합니다.

Auto Pull을 적용할 repository clone

  • 아래와 같은 방식으로 pull을 받고자 하는 디렉토리에 github repository를 clone 해 줍니다. 제 경우에는 현재 README.md 파일이 작성되고 있는 이 repository를 기준으로 작성하겠습니다.

      git clone https://github.com/cliche90/webhook_autopull.git
    

hook.sh 파일 생성

  • hook.sh 는 실제로 git pull을 받도록 작성한 sh 파일입니다.

  • 위치는 상관 없으나 편의상 index.js와 같은 위치에 넣어주시면 편합니다.

  • hook.sh 파일에 해당 repository의 위치를 변수에 설정합니다. 제 레포지토리의 이름 그대로 디렉토리를 작성하였습니다.

  • 이후 해당 레포지토리로 이동하여 git pull을 받도록 처리합니다. REPOSITORY 변수의 경우는 원하시는 레포지토리로 설정하시면 됩니다.

      REPOSITORY = "../webhook_autopull"     // REPOSITORY 변수에 git pull 받고자 하는 repository 설정
      cd $REPOSITORY      // 해당 디렉토리로 이동
      git pull            // git pull
    

포트와 Secret Key 설정

  • 해당 내용을 듣고자 하는 포트와 Webhook에 적용할 Secret Key를 아래와 같이 index.js 파일에 작성합니다.

    let secret = "secretkey"; let port = 8081;

Webhook 추가

아래 내용은 읽어만 보신 후 마지막에 하시고, 코드 작성을 우선시 하시는 편을 권장드립니다.

  • Github에서 push를 받을 경우 메세지를 던져주기 위해 해당 repository로 접근합니다.
  • repository의 setting 메뉴의 Webhooks 탭으로 들어가 webhook을 추가합니다.
  • Payload의 경우는 서비스의 url을 적어주시면 됩니다. 문구를 읽어보면 Payload는 POST 형식으로 보내지며, 저는 ~/push라는 식으로 url을 작성하였습니다.
  • Content-Type의 경우 임의대로 설정하셔도 좋지만 제 경우에는 body-parser를 이용하여 json 형태로 받을 것이기 때문에 application/json로 설정해 주었습니다.
  • 마지막으로 Secrey은 위에서 만드셨던 Secret Key를 적어주시면 됩니다. 추후 hash code를 만들 때 사용됩니다.

POST 서비스 작성

이제 해야 할 것은 명백합니다. /push라는 url로 POST 서비스를 작성해야 하며, 여기서 받은 Data를 가지고 hook.sh를 실행시키도록 해야합니다.

  • express : 서비스 작성에 사용
  • body-parser : jsonData parsing 에 사용
  • spawn : sh 파일 실행에 사용
  • crypto : hash code 작성에 사용

위 항목들이 필요하므로 해당 패키지들은 npm을 통해 설치해 줍니다.

npm install express
npm install body-parser
npm install crypto

이후에는 아래의 내용을 수행합니다. 이하 내용은 index.js 파일을 참고하시면 됩니다.

  • body-parser를 이용하여 request body에 담겨있는 data를 수신
  • data의 string 값을 sha1 알고리즘을 통해 hash code로 변경
  • Request의 헤더에 담겨있는 x-hub-signature와 비교하여 Validation 처리
let jsonString = JSON.stringify(req.body)
let hash = 'sha1=' + crypto.createHmac('sha1', secret).update(jsonString).digest('hex');

if (hash != req.get('x-hub-signature')){
    // Exception, Error Return
    ....
}

hash code의 비교가 끝났다면, 올바른 요청임이 확인된 것이므로, 이제 sh 파일을 실행시켜 pull을 받도록 작성하면 됩니다.

let deploySh = spawn('sh', ['hook.sh']);
    deploySh.stdout.on('data', function (data) {
    let buff = new Buffer(data);
    console.log(buff.toString('utf-8'));
});

git pull까지 실행된 후에는 이제 success 한 내용을 data에 담에 response에 담아 보내주면 서비스가 마무리됩니다.

let data = JSON.stringify({ "success": true });
return res.end(data);

서비스 실행 및 확인

이제 필요한 모든 내용의 작성은 종료되었고, 원하는 서버에서 node index.js 커맨드로 node server를 띄운 뒤, 원하는 github repository에 push를 하게되면 자동으로 수정사항이 반영되는 것을 확인 할 수 있습니다.

About

guide for auto pull by github webhook

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published