Skip to content

feat: 토큰과 리프레시토큰을 쿠키에 저장, 토큰 만료시 재발급 로직 구현 #239

feat: 토큰과 리프레시토큰을 쿠키에 저장, 토큰 만료시 재발급 로직 구현

feat: 토큰과 리프레시토큰을 쿠키에 저장, 토큰 만료시 재발급 로직 구현 #239

Workflow file for this run

name: CI/CD
# 트리거: release/** 브랜치에 PR이 생성되거나 merge될 때 실행
on:
pull_request:
branches:
- 'release/**' # release/DODREAM-0.1.0 등
types: [opened, synchronize, reopened]
push:
branches:
- 'release/**' # PR merge 시 자동으로 push 이벤트 발생
jobs:
# Job 1: 빌드 및 테스트 (PR 검증용)
build-and-test:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
steps:
- name: 코드 체크아웃
uses: actions/checkout@v4
- name: JDK 21 설정
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: gradle
- name: Gradle 실행 권한 부여
run: chmod +x gradlew
- name: Gradle 빌드 (테스트 제외)
run: ./gradlew clean build -x test
- name: JAR 파일을 artifacts로 업로드
uses: actions/upload-artifact@v4
with:
name: app-jar
path: build/libs/*.jar
retention-days: 1
# 테스트는 선택적으로 실행 (실패해도 계속 진행)
# - name: 테스트 실행
# run: ./gradlew test
# continue-on-error: true
# Job 2: Docker 이미지 빌드 및 푸시
build-and-push-docker:
runs-on: ubuntu-latest
if: github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release/')
steps:
- name: 코드 체크아웃
uses: actions/checkout@v4
- name: Docker Buildx 설정
uses: docker/setup-buildx-action@v3
- name: Docker Hub 로그인
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: 브랜치명에서 버전 추출
id: extract_version
run: |
# release/DODREAM-0.1.0 → DODREAM-0.1.0
VERSION=${GITHUB_REF#refs/heads/release/}
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
echo "Extracted version: $VERSION"
- name: Docker 이미지 빌드 및 푸시
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ secrets.DOCKER_USERNAME }}/dodream-backend:latest
${{ secrets.DOCKER_USERNAME }}/dodream-backend:${{ steps.extract_version.outputs.VERSION }}
cache-from: type=gha
cache-to: type=gha,mode=max
# Job 3: NCP 서버에 배포
deploy:
needs: build-and-push-docker # Docker 이미지가 푸시된 후 실행
runs-on: ubuntu-latest
steps:
- name: 코드 체크아웃
uses: actions/checkout@v4
- name: NCP 서버에 SSH 접속하여 배포
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.NCP_HOST }}
username: ${{ secrets.NCP_USERNAME }}
key: ${{ secrets.NCP_SSH_KEY }}
port: 22
script: |
# 배포 디렉토리 생성
mkdir -p ~/dodream
cd ~/dodream
# Docker Hub 로그인 (Private Repository 접근용)
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
# 기존 애플리케이션 컨테이너 중지 및 제거
docker stop dodream-app || true
docker rm dodream-app || true
# 최신 Docker 이미지 pull
docker pull ${{ secrets.DOCKER_USERNAME }}/dodream-backend:latest
# 새 애플리케이션 컨테이너 실행 (host 네트워크 모드 사용)
# host 네트워크를 사용하면 서버의 localhost로 포트가 노출된 다른 Docker 컨테이너에 접근 가능
# MySQL, Redis, Elasticsearch, Qdrant는 모두 서버에서 Docker로 실행 중이며 포트가 호스트에 매핑되어 있음
# SPRING_DATASOURCE_URL에서 mysql 호스트명을 localhost로 변경 (host 네트워크 사용 시)
DATASOURCE_URL="${{ secrets.SPRING_DATASOURCE_URL }}"
DATASOURCE_URL=$(echo "$DATASOURCE_URL" | sed 's|mysql:3306|localhost:3306|g')
docker run -d --name dodream-app --restart unless-stopped --network host -e SPRING_PROFILES_ACTIVE=prod -e SPRING_DATASOURCE_URL="$DATASOURCE_URL" -e SPRING_DATASOURCE_USERNAME="${{ secrets.MYSQL_USER }}" -e SPRING_DATASOURCE_PASSWORD="${{ secrets.MYSQL_PASSWORD }}" -e SPRING_DATA_REDIS_HOST=localhost -e SPRING_DATA_REDIS_PORT=6379 -e SPRING_ELASTICSEARCH_URIS=http://localhost:9200 -e QDRANT_HOST=localhost -e GOOGLE_CLIENT_ID="${{ secrets.GOOGLE_CLIENT_ID }}" -e GOOGLE_CLIENT_SECRET="${{ secrets.GOOGLE_CLIENT_SECRET }}" -e NAVER_CLIENT_ID="${{ secrets.NAVER_CLIENT_ID }}" -e NAVER_CLIENT_SECRET="${{ secrets.NAVER_CLIENT_SECRET }}" -e JWT_SECRET="${{ secrets.JWT_SECRET }}" -e JWT_ACCESS_TOKEN_EXPIRATION=1800000 -e JWT_REFRESH_TOKEN_EXPIRATION=604800000 -e NCP_CLOVA_API_KEY="${{ secrets.NCP_CLOVA_API_KEY }}" ${{ secrets.DOCKER_USERNAME }}/dodream-backend:latest
# 컨테이너가 실행되었는지 확인 (이미지 정리 전에 확인)
sleep 5
if docker ps | grep -q dodream-app; then
echo "✅ 컨테이너가 성공적으로 실행되었습니다"
# 사용하지 않는 dangling 이미지만 정리 (사용 중인 이미지는 보존)
docker image prune -f --filter "dangling=true"
else
echo "⚠️ 컨테이너 실행 실패. 로그 확인:"
docker logs dodream-app 2>&1 || echo "컨테이너 로그를 확인할 수 없습니다"
exit 1
fi
echo "✅ 배포 완료!"