반응형
Spring Boot 애플리케이션을 위한 CI/CD 파이프라인을 설정하는 과정은 크게 빌드, 테스트, 배포의 3단계로 나눠집니다. 이 파이프라인을 GitHub Actions와 같은 CI/CD 도구를 이용해 자동화할 수 있습니다.
1. Continuous Integration (CI) - GitHub Actions 설정
CI 목적:
- 코드 푸시 후 자동으로 빌드, 테스트를 진행합니다.
- 배포 준비 상태에서의 코드 품질을 체크합니다.
Spring Boot CI 설정 - GitHub Actions 예시
먼저, GitHub에 Spring Boot 프로젝트가 있다고 가정하고, .github/workflows/ 디렉토리 내에 YAML 파일을 작성하여 CI 파이프라인을 설정할 수 있습니다.
ci.yml 예시 (GitHub Actions 워크플로우 설정)
name: Spring Boot CD
on:
push:
branches:
- main # main 브랜치에 푸시될 때마다 실행
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
- name: Build with Maven
run: mvn clean install
- name: Dockerize application
run: |
docker build -t my-spring-boot-app .
docker tag my-spring-boot-app myrepo/my-spring-boot-app:v1.0 # Docker 이미지 태깅
- name: Deploy to AWS Elastic Beanstalk
run: |
# AWS CLI 명령어를 사용하여 AWS Elastic Beanstalk에 배포
eb init -p java --region us-west-2 my-app
eb deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
워크플로우 설명:
- GitHub 이벤트: push 이벤트로 main 브랜치에 푸시될 때마다 워크플로우가 실행됩니다.
- 빌드 환경 설정: JDK 11을 사용하여 Maven으로 빌드 및 테스트를 진행합니다.
- 자동화된 테스트: mvn test 명령어로 테스트를 자동으로 실행하여, 모든 단위 테스트를 통과하는지 확인합니다.
- 아카이브: 빌드가 성공하면, 생성된 .jar 파일을 GitHub Actions의 Artifact로 업로드하여 다른 단계에서 활용할 수 있습니다.
2. Continuous Delivery (CD) - 배포 준비
CI 프로세스가 완료되면, Continuous Delivery (CD) 단계로 넘어가는데, 이 단계에서 코드가 배포 준비 상태로 스테이징 환경에 배포됩니다.
CD 목적:
- 배포 준비 상태로 코드를 유지하고, 스테이징 환경에서 배포가 가능한지 확인합니다.
Spring Boot CD 설정 - GitHub Actions 예시
다음은 배포 준비 및 스테이징 환경에 배포하는 과정입니다. 일반적으로 Docker나 Cloud(예: AWS, GCP, Heroku)에 배포할 수 있습니다.
cd.yml 예시
name: Spring Boot CD
on:
push:
branches:
- main # main 브랜치에 푸시될 때마다 실행
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
- name: Build with Maven
run: mvn clean install
- name: Dockerize application
run: |
docker build -t my-spring-boot-app .
docker tag my-spring-boot-app myrepo/my-spring-boot-app:v1.0 # Docker 이미지 태깅
- name: Deploy to AWS Elastic Beanstalk
run: |
# AWS CLI 명령어를 사용하여 AWS Elastic Beanstalk에 배포
eb init -p java --region us-west-2 my-app
eb deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
워크플로우 설명:
- Dockerize application: Spring Boot 애플리케이션을 Docker 이미지로 빌드하여, 이를 컨테이너화합니다.
- AWS Elastic Beanstalk에 배포: AWS Elastic Beanstalk에 자동으로 배포됩니다. AWS CLI를 사용하여 Elastic Beanstalk에 배포합니다.
- 환경 변수: AWS 접근 키는 GitHub Secrets에 저장하여 보안을 유지합니다.
3. Continuous Deployment (CD) - 자동 배포
Continuous Deployment (CD)는 배포 준비 상태로 자동으로 프로덕션에 배포되는 프로세스입니다.
CD 목표:
- 수동 승인 없이, 코드가 자동으로 프로덕션에 배포됩니다.
- 개발자가 코드를 푸시하면 자동으로 프로덕션 환경에 배포됩니다.
CD 예시 - GitHub Actions
cd.yml에서 수동 승인을 생략하고, 프로덕션 서버에 자동으로 배포하는 방식으로 설정합니다.
name: Spring Boot Continuous Deployment
on:
push:
branches:
- main # main 브랜치에 푸시될 때마다 트리거
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
- name: Build with Maven
run: mvn clean install
- name: Dockerize application
run: |
docker build -t my-spring-boot-app .
docker tag my-spring-boot-app myrepo/my-spring-boot-app:v1.0
- name: Deploy to Production (AWS EC2)
run: |
scp -i /path/to/your/key.pem target/my-app.jar ec2-user@your-ec2-ip:/path/to/deploy/
ssh -i /path/to/your/key.pem ec2-user@your-ec2-ip "java -jar /path/to/deploy/my-app.jar"
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
Continuous Deployment 특징:
- 코드가 푸시되면 자동으로 빌드, 테스트, 배포가 이루어집니다.
- 수동 승인 없이 프로덕션에 자동 배포됩니다.
- 모니터링 및 롤백 전략이 필요하며, 오류 발생 시 자동으로 롤백할 수 있도록 설정할 수 있습니다.
Spring Boot CI/CD 파이프라인을 통한 이점
- 자동화: 코드 변경 시 자동으로 빌드하고 테스트하며, 배포까지 자동으로 진행되므로 수동 작업을 최소화할 수 있습니다.
- 빠른 피드백: 빌드 및 테스트가 자동으로 진행되므로, 즉시 피드백을 받을 수 있습니다.
- 안정성: 자동화된 테스트로 버그를 사전에 발견할 수 있으며, 수동 배포에서 발생할 수 있는 실수를 방지합니다.
- 빠른 배포: 배포가 자동화되어 빈번하고 빠른 배포가 가능하며, 배포 주기 단축으로 빠르게 사용자에게 피드백을 받을 수 있습니다.
반응형
'백엔드 공부일지 > 스프링부트 공부일지' 카테고리의 다른 글
Spring MVC 패턴과 REST API (1) | 2025.04.02 |
---|---|
[Spring] JWT (JSON Web Token) (0) | 2024.12.28 |