Skip to content

Merge pull request #101 from Tico-Corp/feature-be/TICO-372-update-use… #102

Merge pull request #101 from Tico-Corp/feature-be/TICO-372-update-use…

Merge pull request #101 from Tico-Corp/feature-be/TICO-372-update-use… #102

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 }}