간단한 프로젝트 CICD를 위해서 Jenkins를 설치할 정도의 서버의 CPU/MEM이 확보 되지 않고
간단한 빌드만 필요한 시점에 자동화하기 위해서 Git Webhook을 클라우드 서버로 POST요청을 보내서 요청받으면 hook.json 설정파일을 수정해서 shell을 실행시키도록 구상한다.
해당 클라우드 서버의 방화벽을 http 프로토콜만 허용하게 해놔서 80과 해당 service endpoint url주소를 붙여서 설정한다.
secret key는 해시 암호화 세팅으로 필요하다면 부여하면 된다.
apt install nginx
ufw allow 'Nginx HTTP'
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;
}
}
upstream backend 설정을 통하여 load balancing도 가능케 하는것이 엔진엑스의 장점이라고 생각한다.
apt install webhook
ufw allow 9000/tcp
touch /etc/webhook.conf
# 웹훅 서비스 구성
port = 9000
# 로깅 옵션
log_file = /var/log/webhook.log
log_level = debug
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"
}
}
}
}
]
webhook -hooks /etc/webhook/hooks.json -verbose -ip 127.0.0.1 &
[12/Jun/2024:13:45:26 +0900] "POST /hooks/deploy-webapp HTTP/1.1" 200 23 "-" "GitHub-Hookshot/bd63eb1"
즉, 이렇게 세팅해서 힘들게 war로 빌드하고 클라우드 서버로 전송해서 WAS를 재구동하면서 배포하기 귀찮은 일을 커밋만 하게 되면 webhook으로 변경되었다는것을 서버로 통신하고 서버에서는 변경되었다는걸 알고 git의 프로젝트를 가져와서 war빌드해서 WAS 런타임 환경에 새롭게 배포 및 재구동까지 스크립트로 정리하면 사람이 하는일이 없어져서 훨씬 편하게 배포할수있다.
주로 Jenkins를 통해서 많은 기록들이 있지만 이런 기록은 찾아보기 힘들어서 이렇게 블로그로 정리 해보았다.