CI/CD는 "지속적인 통합(Continuous Integration)"과 "지속적인 배포(Continuous Deployment/Delivery)"를 의미하며, 애플리케이션 개발부터 배포까지의 전체 과정을 자동화하여, 빠르고 안정적으로 서비스를 제공하는 것을 목표로 하는 개발 문화이자 방법론입니다.
CI (Continuous Integration, 지속적 통합):
CD (Continuous Deployment, 지속적 배포):
GitHub Actions는 GitHub에 내장된 CI/CD 도구로, 별도의 서버 없이 .yml (YAML) 설정 파일만으로 파이프라인을 쉽게 구축하고 관리할 수 있습니다.
주요 구성 요소:
Job으로 구성된 전체 자동화 프로세스. .github/workflows 디렉토리 내의 .yml 파일로 정의됩니다.main 브랜치에 push 되었을 때)Step들의 묶음../gradlew build)나 액션(Action)을 실행하는 가장 작은 단위.actions/checkout@v3 - 코드 가져오기)main 브랜치에 코드가 푸시되면, 자동으로 AWS EC2 서버에 최신 버전의 애플리케이션을 배포하는 파이프라인을 구축합니다.AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY: AWS 리소스에 접근하기 위한 자격 증명.EC2_INSTANCE_IP: 배포할 EC2 서버의 IP 주소.EC2_SSH_KEY: EC2 서버에 SSH로 접속하기 위한 Private Key..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 &
.yml 파일을 통해 워크플로우를 선언적으로 정의하여 파이프라인을 쉽게 구축할 수 있습니다.