CI/CD와 Github Actions로 자동화된 배포 파이프라인 구축 실전 가이드
이 글에서는 CI/CD의 기본 개념부터 Github Actions를 활용한 자동화 배포 파이프라인 구축 실전까지 단계별로 설명합니다. 초보자도 따라할 수 있도록 실제 예제와 함께 상세히 안내합니다. DevOps 역량 향상과 실무 적용을 위한 실전 가이드입니다.
1. CI/CD란 무엇인가?
Continuous Integration(지속적 통합)과 Continuous Delivery/Deployment(지속적 제공/배포)는 현대 소프트웨어 개발에서 필수적인 자동화 프로세스입니다.
- CI(지속적 통합): 개발자가 코드를 자주(하루에도 여러 번) 메인 브랜치에 병합하며, 자동으로 빌드 및 테스트가 수행됩니다.
- CD(지속적 제공/배포): 통합된 코드를 자동으로 배포 환경까지 전달하거나, 실제 운영 환경에 자동으로 배포합니다.
CI/CD를 도입하면 코드 품질 향상, 배포 속도 증가, 휴먼 에러 감소, 협업 효율성 증대
라는 효과를 얻을 수 있습니다.
2. Github Actions란?
Github Actions는 Github에서 제공하는 무료 CI/CD 플랫폼으로, 저장소 내에 .github/workflows/*.yml
파일을 추가해 다양한 자동화 파이프라인을 구성할 수 있습니다.
- 주요 특징
- Github 저장소와 완벽하게 통합
- 다양한 트리거(푸시, PR, 스케줄 등)
- 커스텀 액션 및 마켓플레이스 활용
- Self-hosted Runner 지원
3. 실전: Kotlin 프로젝트 자동 빌드 & 배포 파이프라인 구축
3.1 프로젝트 준비
- Github 저장소 생성
- Kotlin(Spring Boot) 프로젝트 업로드
- 배포 대상 서버(예: AWS EC2, DigitalOcean 등) 준비
3.2 Github Actions Workflow 파일 생성
.github/workflows/deploy.yml
파일을 생성합니다.
name: CI/CD Pipeline
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '17'
- name: Build with Gradle
run: ./gradlew build
- name: Archive JAR
run: |
mkdir -p build-artifacts
cp build/libs/*.jar build-artifacts/
- name: Upload Artifact
uses: actions/upload-artifact@v4
with:
name: app-jar
path: build-artifacts/
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download Artifact
uses: actions/download-artifact@v4
with:
name: app-jar
path: ./
- name: Deploy to Server (scp)
env:
HOST: $
USER: $
KEY: $
run: |
echo "$KEY" > key.pem
chmod 600 key.pem
scp -i key.pem -o StrictHostKeyChecking=no *.jar $USER@$HOST:/home/$USER/app/
3.3 Github Secrets 설정
DEPLOY_HOST
: 배포 대상 서버 IP 또는 도메인DEPLOY_USER
: 배포 계정명DEPLOY_KEY
: SSH 개인키(PEM 형식)
Github 저장소 > Settings > Secrets and variables > Actions에서 위 3가지를 등록합니다.
3.4 서버에서 실행 스크립트 작성
서버에 아래와 같은 실행 스크립트를 준비합니다.
#!/bin/bash
cd /home/ubuntu/app
pkill -f 'java -jar' || true
nohup java -jar *.jar > app.log 2>&1 &
3.5 전체 동작 흐름
- main 브랜치에 push
- Github Actions가 자동으로 빌드 및 테스트
- JAR 파일을 서버로 전송
- 서버에서 실행 스크립트로 앱 재시작
4. 실전 Tips & 문제 해결
4.1 빌드 실패 원인 파악
- 로그를 꼼꼼히 확인 (Actions > Workflow runs)
- 종속성 문제, 테스트 실패, gradle wrapper 권한 문제 등
4.2 서버 접속 오류
- SSH Key 권한(600) 확인
- 서버 방화벽/포트 오픈 상태 확인
4.3 환경변수 관리
- Github Secrets 적극 활용
- 서버에
.env
파일 활용, spring-boot에서는application-prod.yml
등 분리
4.4 Blue-Green/무중단 배포
- 두 개 이상의 서버에 번갈아 배포
- Nginx 등 리버스 프록시로 트래픽 전환
4.5 Slack/Discord 알림 연동
- actions/notify, slackapi/slack-github-action 등 활용
5. Kotlin 코드 예시: 배포 후 헬스체크
import java.net.HttpURLConnection
import java.net.URL
fun checkHealth(url: String): Boolean {
val conn = URL(url).openConnection() as HttpURLConnection
conn.requestMethod = "GET"
return conn.responseCode == 200
}
fun main() {
val health = checkHealth("http://localhost:8080/actuator/health")
println("Health check: ${if (health) "OK" else "FAIL"}")
}
6. CI/CD 도입의 효과와 확장
- 팀 규모와 상관없이
자동화 파이프라인은 개발 효율을 극대화
합니다. - 반복 작업 최소화, 배포 신뢰성 향상, 장애 대응 속도 증가
- Github Actions 외에도 Jenkins, Gitlab CI, CircleCI 등 다양한 도구 존재
- Docker, Kubernetes와 연계하면 진정한 DevOps 환경 구축 가능
7. 참고 자료
CI/CD와 Github Actions를 활용하면 누구나 쉽고 빠르게 자동화된 배포 환경을 구축할 수 있습니다. 꾸준히 파이프라인을 개선하고, DevOps 역량을 키워보세요.