Merge pull request #101 from Tico-Corp/feature-be/TICO-372-update-use… #102
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI/CD with Gradle, Docker, AWS | |
# develop-be 브랜치에 push 또는 PR 이벤트가 발생하면 워크플로우가 실행된다. | |
# backend 폴더 내의 변경 사항이 있을 때만 워크플로우가 실행 | |
on: | |
push: | |
branches: [ "develop-be" ] | |
paths: | |
- 'backend/**' | |
pull_request: | |
branches: [ "develop-be" ] | |
paths: | |
- 'backend/**' | |
env: | |
IMAGE_NAME: ${{ secrets.DOCKER_IMAGE_NAME }}pomorodo:latest | |
CONTAINER_NAME: pomorodo-server | |
# 해당 Workflow의 Job 목록 | |
jobs: | |
build: | |
# 이 작업이 실행되는 환경을 정의: 최신 Ubuntu 환경 | |
runs-on: ubuntu-latest | |
# 리포지토리에 대한 읽기 권한을 부여한다. | |
permissions: | |
contents: read | |
# build Job 내의 step 목록 | |
steps: | |
### CI | |
# 레포지토리 체크아웃하여 레포지토리에 접근할 수 있게 한다. | |
- name: Checkout Repository | |
uses: actions/checkout@v4 | |
# JDK 버전 17 설정 (temurin 배포판 사용) | |
- name: Set up JDK 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
# Gradle 캐싱 설정으로 의존성 다운로드 시간을 줄인다. | |
- name: Gradle Caching | |
uses: actions/cache@v3 | |
with: | |
path: | | |
~/.gradle/caches | |
~/.gradle/wrapper | |
key: ${{ runner.os }}-gradle-${{ hashFiles('backend/pomoro-do/**/*.gradle*', 'backend/pomoro-do/**/gradle-wrapper.properties') }} | |
restore-keys: | | |
${{ runner.os }}-gradle- | |
# Gradle 래퍼 스크립트에 실행 권한 부여 | |
- name: Grant Execute Permission For Gradlew | |
run: chmod +x backend/pomoro-do/gradlew | |
# 테스트를 제외한 Gradle 빌드 수행 (CI 단계) | |
- name: Build with Gradle | |
run: cd backend/pomoro-do && ./gradlew build -x test | |
### CD | |
# Docker Hub에 로그인 (보안) (CD 단계 준비) | |
- name: Log in to Docker Hub | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
# SpringBoot 어플리케이션의 Docker 이미지를 빌드하고 Docker Hub에 푸시 (CD 단계 준비) | |
- name: Build and Push Docker Image for SpringBoot | |
run: | | |
cd backend/pomoro-do | |
set -e # 명령 실패 시 스크립트 종료 | |
# 현재 디렉토리에 있는 Dockerfile을 사용하여 Docker 이미지를 빌드 | |
docker build -t ${{ env.IMAGE_NAME }} . | |
# Docker Hub에 이미지 푸시 | |
docker push ${{ env.IMAGE_NAME }} | |
deploy: | |
# 이 작업은 build 작업이 성공적으로 완료된 후에만 실행다. | |
needs: build | |
runs-on: ubuntu-latest | |
steps: | |
# SSH를 통해 원격 서버에서 명령을 실행하여 Docker 컨테이너 배포 | |
- name: Docker Run | |
uses: appleboy/[email protected] | |
with: | |
host: ${{ secrets.SSH_HOST }} # 원격 서버의 호스트명 | |
username: ${{ secrets.SSH_USERNAME }} # 원격 서버의 사용자명 | |
key: ${{ secrets.SSH_PRIVATE_KEY }} # 원격 서버의 비밀 키 | |
port: 22 # SSH 포트 | |
sync: false | |
use_insecure_cipher: false | |
timeout: 30s | |
command_timeout: 10m | |
debug: true # 디버그 모드 활성화 | |
script: | | |
set -ex # 명령 실패 시 스크립트 종료 및 각 명령어 실행 전 출력 | |
docker stop ${{ env.CONTAINER_NAME }} || true # 실행 중인 pomorodo-server 컨테이너 중지 | |
docker rm ${{ env.CONTAINER_NAME }} || true # 기존 컨테이너 삭제 | |
docker rmi ${{ env.IMAGE_NAME }} || true # 기존 이미지 삭제 | |
docker pull ${{ env.IMAGE_NAME }} # 최신 이미지 다운로드 | |
# 새로운 컨테이너 시작 | |
docker run -d -p 8080:8080 --name ${{ env.CONTAINER_NAME }} \ | |
-e DB_URL="${{ secrets.DB_URL }}" \ | |
-e DB_USERNAME=${{ secrets.DB_USERNAME }} \ | |
-e DB_PASSWORD=${{ secrets.DB_PASSWORD }} \ | |
-e JWT_SECRET=${{ secrets.JWT_SECRET }} \ | |
-e OAUTH2_GOOGLE_CLIENT_ID=${{ secrets.OAUTH2_GOOGLE_CLIENT_ID }} \ | |
-e S3_BUCKET_NAME=${{ secrets.S3_BUCKET_NAME }} \ | |
-e S3_REGION=${{ secrets.S3_REGION }} \ | |
-e S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }} \ | |
-e S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }} \ | |
${{ env.IMAGE_NAME }} |