본문 바로가기

IT

GitHub Actions CI/CD

1. CI/CD란

CI (Continuous Integration): 코드를 Git에 푸시하면 자동으로 빌드/테스트
CD (Continuous Deployment): 테스트 통과하면 자동으로 서버에 배포

왜 필요한가?

  • 버그를 빨리 발견 (자동 테스트)
  • 배포 실수 방지 (자동화)

 

2. GitHub Actions로 기본 CI/CD 만들기

2.1 프로젝트 구조

your-project/
├── .github/
│   └── workflows/
│       └── ci.yml          # 이 파일만 만들면 됨!
├── src/
├── build.gradle
└── gradlew

 

2.2 기본 CI/CD 파일 생성

# .github/workflows/cicd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [ main, master, develop ]
  pull_request:
    branches: [ main, master ]

jobs:
  # 1단계: 테스트 (CI)
  test:
    runs-on: ubuntu-latest
    
    steps:
      - name: 코드 체크아웃
        uses: actions/checkout@v4

      - name: Java 17 설치
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Gradle 캐시
        uses: actions/cache@v3
        with:
          path: |
            ~/.gradle/caches
            ~/.gradle/wrapper
          key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*') }}

      - name: 테스트 실행
        run: |
          chmod +x ./gradlew
          ./gradlew test

      - name: 테스트 결과 업로드
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-results
          path: build/reports/tests/

  # 2단계: 배포 (CD) - main 브랜치에만
  deploy:
    runs-on: ubuntu-latest
    needs: test  # 테스트가 성공해야 배포 실행
    if: github.ref == 'refs/heads/master'  # master 브랜치에만 배포
    
    steps:
      - name: 코드 체크아웃
        uses: actions/checkout@v4

      - name: Java 17 설치
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: JAR 빌드
        run: |
          chmod +x ./gradlew
          ./gradlew bootJar

      - name: 배포 시뮬레이션
        run: |
          echo "🚀 배포 시작..."
          echo "📦 JAR 파일: $(ls build/libs/)"
          echo "✅ 배포 완료! (시뮬레이션)"
          echo "🌐 서비스 URL: https://my-app.example.com"

 

3 CI/CD 워크플로우 실행 과정 상세

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest  # ← GitHub의 Ubuntu 서버 할당
    
    steps:
    # 1단계: GitHub Actions 러너가 GitHub에서 코드를 가져옴 (액션 자체는 Node.js로 작성됨)
    - name: 코드 체크아웃
      uses: actions/checkout@v4  # ← Node.js 도구
      # 내부적으로: git clone 수행
    
    # 2단계: GitHub Actions 엔진이 Java를 설치
    - name: Java 17 설치  
      uses: actions/setup-java@v4  # ← Node.js 도구
      with:
        java-version: '17'
      # 내부적으로: 
      # - Java 17 다운로드
      # - PATH 환경변수 설정
      # - JAVA_HOME 설정
    
    # 3단계: 이제부터는 순수 Java/Gradle 명령어들
    - name: Gradle 권한 설정
      run: chmod +x ./gradlew     # ← Linux 명령어
    
    - name: 테스트 실행
      run: ./gradlew test         # ← Gradle 명령어 (Java 기반)
      # 내부적으로:
      # - Java로 Gradle 실행
      # - Spring Boot 테스트 실행
      # - JUnit 테스트 실행
    
    - name: JAR 빌드
      run: ./gradlew bootJar      # ← Gradle 명령어 (Java 기반)
      # 내부적으로:
      # - Java 소스 컴파일
      # - Spring Boot JAR 생성
    
    # 4단계: 다시 GitHub Actions 도구 사용
    - name: 빌드 결과 업로드
      uses: actions/upload-artifact@v4  # ← Node.js 도구
      with:
        name: jar-file
        path: build/libs/*.jar
      # 내부적으로:
      # - JAR 파일을 GitHub에 업로드
      # - 압축 및 저장
# 각 단계별 실행 환경

## GitHub Actions Runner (Ubuntu 서버)
# 서버 초기 상태
$ uname -a
Linux runner-xxx 5.15.0 Ubuntu 22.04.3 LTS

$ node --version
v20.x.x  # GitHub Actions 엔진

$ java --version
# 처음에는 Java 없음

## Java 설치 후
$ java --version
openjdk 17.0.x

$ echo $JAVA_HOME
/opt/hostedtoolcache/Java_Temurin-Hotspot_jdk/17.0.x/x64

$ which gradle
# Gradle 없음 (gradlew 사용)

## 프로젝트 빌드 시
$ ./gradlew --version
Gradle 8.13
Build time: 2024-xx-xx
JVM: OpenJDK 64-Bit Server VM 17.0.x

$ ./gradlew test
> Task :compileJava      # Java 컴파일러 실행
> Task :processResources
> Task :classes
> Task :compileTestJava  # 테스트 Java 컴파일
> Task :processTestResources
> Task :testClasses
> Task :test             # JUnit 테스트 실행 (Java)
BUILD SUCCESSFUL

 

4.  결과 확인

 

  • GitHub → Actions 탭
  • 두 개의 Job이 실행되는 것 확인:
    • ✅ test (CI 부분)
    • ✅ deploy (CD 부분, main 브랜치에만)

 

5. 개발 프로세스

개발자가 코드 수정
     ↓
Git에 push
     ↓
CI: 자동 테스트 실행 ✅
     ↓
테스트 통과하면
     ↓
CD: 자동으로 서버에 배포 🚀
     ↓
사용자가 바로 새 기능 사용 가능!

 

 

6. 장점

  1. 빠른 피드백: 버그를 즉시 발견
  2. 배포 실수 방지: 수동 배포 과정에서 발생하는 실수 제거
  3. 개발 속도 향상: 배포 자동화로 개발에 집중