TIL - 20260205

juni·2026년 2월 5일

TIL

목록 보기
259/316

0205 스프링 부트 프로젝트 (7/N): CI/CD를 이용한 배포 자동화


✅ 1. CI/CD란 무엇인가?

  • CI/CD"지속적인 통합(Continuous Integration)""지속적인 배포(Continuous Deployment/Delivery)"를 의미하며, 애플리케이션 개발부터 배포까지의 전체 과정을 자동화하여, 빠르고 안정적으로 서비스를 제공하는 것을 목표로 하는 개발 문화이자 방법론입니다.

  • CI (Continuous Integration, 지속적 통합):

    • 개발자가 작성한 코드를 Git과 같은 중앙 리포지토리에 주기적으로 통합(Merge)하는 프로세스입니다.
    • 코드가 통합될 때마다 자동으로 빌드(Build)되고 테스트(Test)가 실행되어, 코드의 결함을 조기에 발견할 수 있습니다.
    • CI의 결과물: 실행 가능한 애플리케이션 파일 (e.g., Spring Boot의 JAR 파일, Docker 환경의 Docker 이미지)
  • CD (Continuous Deployment, 지속적 배포):

    • CI 단계가 성공적으로 완료되면, 그 결과물이 자동으로 실제 운영 서버에 배포(Deploy)되는 과정입니다.
    • 사람의 개입 없이, 코드 변경 사항이 자동으로 사용자에게 전달됩니다.

✅ 2. GitHub Actions: CI/CD 파이프라인 구축 도구

  • GitHub Actions는 GitHub에 내장된 CI/CD 도구로, 별도의 서버 없이 .yml (YAML) 설정 파일만으로 파이프라인을 쉽게 구축하고 관리할 수 있습니다.

  • 주요 구성 요소:

    • Workflow: 하나 이상의 Job으로 구성된 전체 자동화 프로세스. .github/workflows 디렉토리 내의 .yml 파일로 정의됩니다.
    • Event: 워크플로우를 실행시키는 특정 이벤트. (e.g., main 브랜치에 push 되었을 때)
    • Job: 하나의 가상 환경(Runner)에서 실행되는 여러 Step들의 묶음.
    • Step: 개별적인 명령어(e.g., ./gradlew build)나 액션(Action)을 실행하는 가장 작은 단위.
    • Action: 워크플로우에서 재사용 가능한 명령어의 묶음. (e.g., actions/checkout@v3 - 코드 가져오기)

✅ 3. Spring Boot 배포 자동화 파이프라인 구축 (GitHub Actions)

  • main 브랜치에 코드가 푸시되면, 자동으로 AWS EC2 서버에 최신 버전의 애플리케이션을 배포하는 파이프라인을 구축합니다.

➕ 1단계: GitHub Secrets 설정

  • 워크플로우 파일에 비밀번호나 SSH 키와 같은 민감한 정보를 직접 작성하는 것은 매우 위험합니다. GitHub Secrets에 이러한 정보들을 안전하게 저장하고, 워크플로우에서는 변수 형태로 참조합니다.
  • 필요한 Secrets:
    • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY: AWS 리소스에 접근하기 위한 자격 증명.
    • EC2_INSTANCE_IP: 배포할 EC2 서버의 IP 주소.
    • EC2_SSH_KEY: EC2 서버에 SSH로 접속하기 위한 Private Key.

➕ 2단계: 워크플로우 파일 작성 (.github/workflows/deploy.yml)

name: Deploy to AWS EC2

# 1. 이벤트 트리거: main 브랜치에 push가 발생했을 때 실행
on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest # 가상 환경 지정

    steps:
      # 2. 코드 체크아웃: 리포지토리의 코드를 가상 환경으로 가져옴
      - name: Checkout
        uses: actions/checkout@v3

      # 3. JDK 설정: 빌드를 위해 Java 17 환경 설정
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      # 4. Gradle 실행 권한 부여
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew

      # 5. Spring Boot 애플리케이션 빌드
      - name: Build with Gradle
        run: ./gradlew build

      # 6. AWS 자격 증명 설정
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-2

      # 7. 빌드된 JAR 파일을 S3에 업로드 (EC2로 직접 보내는 것보다 안정적)
      - name: Upload to S3
        run: aws s3 cp build/libs/*.jar s3://your-s3-bucket-name/

      # 8. SSH를 통해 EC2에 접속하여 배포 스크립트 실행
      - name: Deploy to EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_INSTANCE_IP }}
          username: ec2-user
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            # EC2에서 실행될 명령어들
            # S3에서 JAR 파일 다운로드
            aws s3 cp s3://your-s3-bucket-name/your-app.jar .
            
            # 기존에 실행 중인 프로세스 종료
            PID=$(pgrep -f your-app.jar)
            if [ -n "$PID" ]; then
              kill -15 $PID
              sleep 5
            fi

            # 새 버전의 애플리케이션 실행
            nohup java -jar -Dspring.profiles.active=prod your-app.jar > app.log 2>&1 &
  • 배포 전략: 위 예시에서는 빌드된 JAR 파일을 S3를 경유하여 EC2로 전달했습니다. 이는 EC2에 직접 파일을 보내는 것보다 더 안정적이고, 나중에 여러 서버로 확장할 때도 용이한 구조입니다.

📌 요약

  • CI/CD는 코드 변경 사항을 자동으로 빌드, 테스트, 배포하여 개발 생산성과 서비스 안정성을 높이는 현대적인 개발 문화입니다.
  • GitHub Actions는 GitHub에 내장된 CI/CD 도구로, .yml 파일을 통해 워크플로우를 선언적으로 정의하여 파이프라인을 쉽게 구축할 수 있습니다.
  • Spring Boot 배포 파이프라인은 일반적으로 [코드 푸시 → 빌드(JAR 생성) → (S3 업로드) → EC2 접속 → 기존 프로세스 종료 → 새 프로세스 실행]의 흐름으로 구성됩니다.
  • SSH 키, AWS 자격 증명과 같은 민감한 정보는 반드시 GitHub Secrets를 통해 안전하게 관리해야 합니다.

0개의 댓글