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. 장점
- 빠른 피드백: 버그를 즉시 발견
- 배포 실수 방지: 수동 배포 과정에서 발생하는 실수 제거
- 개발 속도 향상: 배포 자동화로 개발에 집중
'IT' 카테고리의 다른 글
| 동기 / 비동기 & 블로킹 / 논블로킹 조합 (0) | 2025.05.24 |
|---|---|
| 스레드의 이해 (1) | 2025.02.24 |
| 프로세스 간 통신의 이해 : 소켓과 RPC (1) | 2025.02.23 |
| 프로세스 간 통신의 이해 : 공유 메모리와 파이프 (0) | 2025.02.23 |
| 프로세스 간 통신(IPC) (0) | 2025.02.22 |