Merge branch 'main' of https://github.com/prgrms-be-devcourse/NBB1_2_… #113
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: Java & React CI/CD | |
on: | |
push: | |
branches: [ "main", "release" ] | |
pull_request: | |
branches: [ "main", "release" ] | |
jobs: | |
build: | |
if: github.repository == 'prgrms-be-devcourse/NBB1_2_3_Team10' | |
runs-on: ubuntu-latest | |
permissions: | |
contents: read | |
steps: | |
- uses: actions/checkout@v4 | |
# JDK 설정 | |
- name: Set up JDK 17 | |
uses: actions/setup-java@v4 | |
with: | |
java-version: '17' | |
distribution: 'temurin' | |
# application-prod.properties 암호화 | |
- name: Add secrets into properties | |
run: | | |
echo "${{ secrets.APPLICATION_PROD }}" | base64 --decode > ./src/main/resources/application-prod.properties | |
# Gradle 설정 | |
- name: Setup Gradle | |
uses: gradle/setup-gradle@v2 | |
# Gradlew 실행 권한 부여 | |
- name: Grant execute permission for Gradlew | |
run: chmod +x gradlew | |
# 프로젝트 빌드 | |
- name: Build with Gradle Wrapper | |
run: ./gradlew build | |
# Docker Hub 로그인 | |
- name: Log in to Docker Hub | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_PASSWORD }} | |
# Docker 이미지 빌드 및 푸시 | |
- name: Build and push Docker image | |
run: | | |
docker build -t ${{ secrets.DOCKER_USERNAME }}/bitta-kotlin:latest . | |
docker push ${{ secrets.DOCKER_USERNAME }}/bitta-kotlin:latest | |
deploy: | |
if: github.repository == 'prgrms-be-devcourse/NBB1_2_3_Team10' && github.ref == 'refs/heads/release' | |
needs: build | |
runs-on: ubuntu-latest | |
permissions: | |
contents: write | |
steps: | |
- uses: actions/checkout@v4 | |
# EC2 서버 배포 | |
- name: Deploy to EC2 | |
uses: appleboy/[email protected] | |
with: | |
host: ${{ secrets.EC2_HOST }} | |
username: ${{ secrets.EC2_USER }} | |
key: ${{ secrets.EC2_SSH_KEY }} | |
script: | | |
# Docker 로그인 및 최신 이미지 가져오기 | |
echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin | |
docker pull ${{ secrets.DOCKER_USERNAME }}/bitta-kotlin:latest | |
# blue/green 컨테이너 전환 | |
CURRENT_CONTAINER=$(docker ps --filter "name=backend-blue" -q) | |
TARGET_CONTAINER="backend-green" | |
[ -z "$CURRENT_CONTAINER" ] && TARGET_CONTAINER="backend-blue" | |
# 새 컨테이너 실행 | |
docker stop $TARGET_CONTAINER || true | |
docker rm $TARGET_CONTAINER || true | |
docker run -d --name $TARGET_CONTAINER -p 8080:80 \ | |
-e NODE_ENV=production \ | |
${{ secrets.DOCKER_USERNAME }}/bitta-kotlin:latest | |
# Nginx 리로드하여 트래픽 전환 | |
sudo systemctl reload nginx |