Git Webhook 사용

YOBY·2024년 6월 12일
0

간단한 프로젝트 CICD를 위해서 Jenkins를 설치할 정도의 서버의 CPU/MEM이 확보 되지 않고
간단한 빌드만 필요한 시점에 자동화하기 위해서 Git Webhook을 클라우드 서버로 POST요청을 보내서 요청받으면 hook.json 설정파일을 수정해서 shell을 실행시키도록 구상한다.


1. Webhook 테스트를 하기 위해서 래파지토리를 생성 하기


2. Webhook setting 하기

  • 해당 클라우드 서버의 방화벽을 http 프로토콜만 허용하게 해놔서 80과 해당 service endpoint url주소를 붙여서 설정한다.

  • secret key는 해시 암호화 세팅으로 필요하다면 부여하면 된다.


3. 웹서비스 (Nginx) 80포트 사용

  1. nginx를 다운받는다.
apt install nginx
  1. ufw 설정이 활성화가 되어있다면 해당 서비스를 허용한다.
ufw allow 'Nginx HTTP'
  1. 엔진엑스 새로운 설정파일을 생성해서 아래와 같이 세팅한다.
touch /etc/nginx/conf.d/default.conf
upstream backend {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name public IP $ domain name;

    #tomcat service
    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    #git webhook service
    location /hooks/deploy-webapp {
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
  • 해당 conf설정은 nginx.conf 설정파일에 include되어서 읽혀지게된다.
  • 엔진엑스는 80으로 서비스가 오픈되어서 80포트로 들어오는 트래픽을 읽게된다.
  • 80으로 들어오는 로케이션중 / 로 가르키면 backend 서비스를 호출하여 8080포트로 포워딩시켜주는걸 볼수있다. WAS 포트를 8080으로 열어서 해당 WAS에서 프로젝트를 실행시킬 예정이다.
  • 그리고 /hooks/deploy-webapp이거는 깃에서 webhook세팅할때 설정한 url주소인것을 확인할수 있다.
  • 80포트이지만 해당 서비스 엔드포인트로 요청이 들어올시 해당 location을 타겠금 설정한다.
  • 이때 9000번으로 포워딩 시켜준걸 확인할수 있다.

upstream backend 설정을 통하여 load balancing도 가능케 하는것이 엔진엑스의 장점이라고 생각한다.

  1. systemctl start nginx
  • 엔진엑스가 구동되면서 해당 설정값을 읽고 실행하게 된다.

1. webhook 사용하기

  1. webhook 다운받는다.
apt install webhook
  1. ufw 설정이 활성화가 되어있다면 해당 서비스를 허용한다.
ufw allow 9000/tcp
  1. webhook 설정 세팅한다.
touch /etc/webhook.conf

# 웹훅 서비스 구성
port = 9000

# 로깅 옵션
log_file = /var/log/webhook.log
log_level = debug
  1. 사용할 hook 설정을 한다.
touch /etc/webhook/hooks.json

[
  {
    "id": "deploy-webapp",
    "execute-command": "/root/shell/test.sh",
    "command-working-directory": "/root/work",
    "response-message": "Deploy script executed.",
    "trigger-rule": {
      "match": { <=== 이부분은 깃에서 시크릿 비밀번호 설정할때랑 맞춰줘야한다.
        "type": "payload-hash-sha256",
        "secret": "secret key", 
        "parameter": {
          "source": "header",
          "name": "X-Hub-Signature"
        }
      }
    }
  }
]
  1. webhook이 해당 설정 파일을 읽고 실행시키기
webhook -hooks /etc/webhook/hooks.json -verbose -ip 127.0.0.1 &
  • 엔진엑스에서 설정을 localhost:9000으로 세팅했기 때문에 위와 같이 백그라운드로 실행시켰다.

1. 깃배쉬로 index.html을 해당 래파지토리에 커밋하기

  • index.html을 생성한후 git bash를 통해서 해당 래파지토리에 commit을 진행하면...
  • 깃에서 정상적으로 webhook이 post요청을 하게되고...
  • 엔진엑스 access.log를 보게되면
[12/Jun/2024:13:45:26 +0900] "POST /hooks/deploy-webapp HTTP/1.1" 200 23 "-" "GitHub-Hookshot/bd63eb1"
  • 정상적으로 Post요청을 받는것을 확인할수 있다.
  • "execute-command": "/root/shell/test.sh" 그리고 webhook에 설정했던 해당 쉘을 정상적으로 실행시켰다.
  • "response-message": "Deploy script executed." 정상적으로 응답받은것을 확인할수 있다.

즉, 이렇게 세팅해서 힘들게 war로 빌드하고 클라우드 서버로 전송해서 WAS를 재구동하면서 배포하기 귀찮은 일을 커밋만 하게 되면 webhook으로 변경되었다는것을 서버로 통신하고 서버에서는 변경되었다는걸 알고 git의 프로젝트를 가져와서 war빌드해서 WAS 런타임 환경에 새롭게 배포 및 재구동까지 스크립트로 정리하면 사람이 하는일이 없어져서 훨씬 편하게 배포할수있다.

주로 Jenkins를 통해서 많은 기록들이 있지만 이런 기록은 찾아보기 힘들어서 이렇게 블로그로 정리 해보았다.

0개의 댓글

관련 채용 정보