티스토리 뷰
GitHub Webhook을 활용한 CI/CD 자동화 시스템 구축
이전 글에서는 GitHub Webhook을 이용한 NestJS 서버 구축 및 이벤트 처리 방법을 다뤘습니다.
이번 글에서는 Webhook을 활용하여 CI/CD(Continuous Integration & Continuous Deployment) 자동화를 구축하는 방법을 설명합니다.
1. CI/CD란? Webhook을 활용한 배포 자동화의 필요성
CI/CD는 코드 변경 사항을 자동으로 빌드, 테스트 및 배포하는 DevOps의 핵심 개념입니다.
GitHub Webhook을 활용하면 Push 또는 Pull Request 이벤트 발생 시 자동으로 빌드 및 배포 프로세스를 실행할 수 있습니다.
✅ Webhook 기반 CI/CD의 장점
✔️ 자동 배포: GitHub에 코드가 푸시되면 자동으로 빌드 및 배포 진행
✔️ 효율성 향상: 수동 배포 없이 최신 코드가 즉시 반영
✔️ 안정성 보장: Webhook 이벤트 기반으로 테스트 자동 실행
2. GitHub Webhook을 활용한 배포 자동화 아키텍처
🔹 전체 자동화 흐름
1️⃣ 개발자가 GitHub에 코드 Push
2️⃣ GitHub Webhook이 NestJS 서버로 이벤트 전송
3️⃣ 서버에서 Webhook 요청을 처리하고 배포 스크립트 실행
4️⃣ Docker 컨테이너를 빌드하여 최신 코드 배포
5️⃣ 배포 완료 후 Slack/Discord 등으로 알림 전송
3. Webhook을 활용한 자동 배포 서버 구축
🔹 3-1. Webhook 이벤트 감지 및 배포 트리거
src/webhook/webhook.controller.ts에 Push 이벤트 감지 후 배포 스크립트를 실행하는 로직을 추가합니다.
import { Controller, Post, Headers, Body } from '@nestjs/common';
import { exec } from 'child_process';
@Controller('webhook')
export class WebhookController {
@Post()
handleWebhook(@Headers('x-github-event') event: string, @Body() payload: any) {
if (event === 'push' && payload.ref === 'refs/heads/main') {
console.log(`🚀 Push detected on main branch! Starting deployment...`);
exec('./deploy.sh', (error, stdout, stderr) => {
if (error) {
console.error(`❌ Deployment Error: ${error.message}`);
return;
}
console.log(`✅ Deployment Success:\n${stdout}`);
});
}
return { message: `Processed ${event} event` };
}
}
💡 exec('./deploy.sh')를 사용해 배포 스크립트를 실행합니다.
특정 브랜치(예: main)에서 Push가 발생하면 자동으로 배포를 진행합니다.
🔹 3-2. 자동 배포 스크립트 작성 (deploy.sh)
#!/bin/bash
echo "🔄 Pulling latest changes from GitHub..."
git pull origin main
echo "📦 Building Docker container..."
docker build -t my-app:latest .
echo "🚀 Stopping existing container..."
docker stop my-app || true
docker rm my-app || true
echo "🔄 Running new container..."
docker run -d --name my-app -p 3000:3000 my-app:latest
echo "✅ Deployment complete!"
💡 deploy.sh는 GitHub에서 최신 코드를 가져와 Docker 컨테이너를 재시작하는 역할을 합니다.
4. Webhook을 활용한 배포 상태 알림 (Slack/Discord 연동)
배포가 완료되면 Slack 또는 Discord에 알림을 전송하여 팀원들에게 공유할 수 있습니다.
🔹 4-1. Slack Webhook 설정 방법
1️⃣ Slack Webhook 설정 페이지에서 Incoming Webhook 생성
2️⃣ Slack 채널과 Webhook URL 연결
3️⃣ 아래와 같이 NestJS에서 Slack Webhook 요청을 전송
🔹 4-2. Slack 알림 기능 추가 (slack.service.ts)
import { Injectable } from '@nestjs/common';
import axios from 'axios';
@Injectable()
export class SlackService {
private slackWebhookUrl = process.env.SLACK_WEBHOOK_URL || 'your_slack_webhook_url';
async sendMessage(message: string) {
await axios.post(this.slackWebhookUrl, { text: message });
}
}
🔹 4-3. 배포 완료 후 Slack 알림 전송
webhook.controller.ts에서 배포 후 Slack 알림을 전송하도록 수정합니다.
import { Controller, Post, Headers, Body } from '@nestjs/common';
import { exec } from 'child_process';
import { SlackService } from '../slack/slack.service';
@Controller('webhook')
export class WebhookController {
constructor(private readonly slackService: SlackService) {}
@Post()
async handleWebhook(@Headers('x-github-event') event: string, @Body() payload: any) {
if (event === 'push' && payload.ref === 'refs/heads/main') {
console.log(`🚀 Push detected on main branch! Starting deployment...`);
exec('./deploy.sh', async (error, stdout, stderr) => {
if (error) {
console.error(`❌ Deployment Error: ${error.message}`);
await this.slackService.sendMessage(`❌ 배포 실패: ${error.message}`);
return;
}
console.log(`✅ Deployment Success:\n${stdout}`);
await this.slackService.sendMessage(`✅ 배포 완료! 최신 코드가 적용되었습니다.`);
});
}
return { message: `Processed ${event} event` };
}
}
💡 배포가 완료되면 Slack으로 알림이 전송됩니다.
배포 실패 시에도 자동으로 Slack에 메시지를 보냅니다.
5. Webhook 서버 배포 및 운영
🔹 5-1. Webhook 서버 Docker 컨테이너화
Webhook 서버도 Docker 컨테이너로 운영하면 배포 및 유지보수가 쉬워집니다.
Dockerfile 작성
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "run", "start"]
EXPOSE 3000
Docker Compose 파일 (docker-compose.yml)
version: '3'
services:
webhook-server:
build: .
ports:
- "3000:3000"
environment:
- SLACK_WEBHOOK_URL=your_slack_webhook_url
🔹 5-2. 서버 실행
docker-compose up -d
💡 Webhook 서버가 컨테이너로 실행되며, 지속적으로 GitHub Webhook 요청을 수신합니다.
6. 마무리 및 다음 글 예고
이번 글에서는 GitHub Webhook을 활용하여 CI/CD 자동화 서버를 구축하고, Docker 배포 및 Slack 알림 기능을 추가했습니다.
다음 글에서는 Webhook 기반으로 GitHub Issue 및 PR을 자동 관리하는 기능을 다룰 예정입니다! 🚀
'모음집 > git' 카테고리의 다른 글
GitHub Webhook을 활용한 GitHub Project 자동화 및 상태 관리 (0) | 2025.03.20 |
---|---|
GitHub Webhook을 활용한 Issue 및 Pull Request 자동 관리 시스템 구축 (0) | 2025.03.19 |
GitHub Webhook을 활용한 NestJS 서버 구축 및 이벤트 처리 (0) | 2025.03.18 |
GitHub Webhook 개념과 자동화 시스템 구축의 필요성 (2) | 2025.03.18 |
[Github] vscode에서 git을 사용 해보자 (0) | 2022.05.23 |
- Total
- Today
- Yesterday
- AI챗봇
- Docker
- llm
- 딥러닝
- SEO최적화
- Next.js
- 파이썬알고리즘
- nextJS
- seo 최적화 10개
- PostgreSQL
- SEO 최적화
- Ktor
- nodejs
- 백엔드개발
- JAX
- 웹개발
- 프론트엔드면접
- kotlin
- 개발블로그
- App Router
- NestJS
- gatsbyjs
- Prisma
- CI/CD
- flax
- 프론트엔드
- REACT
- Python
- fastapi
- rag
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |