이 글에서는 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 전체 동작 흐름
  1. main 브랜치에 push
  2. Github Actions가 자동으로 빌드 및 테스트
  3. JAR 파일을 서버로 전송
  4. 서버에서 실행 스크립트로 앱 재시작

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 역량을 키워보세요.