Skip to content

Merge pull request #89 from ON-GI/develop #12

Merge pull request #89 from ON-GI/develop

Merge pull request #89 from ON-GI/develop #12

Workflow file for this run

name: DOCKER CI IN PRODUCTION SERVER # 워크플로우의 이름 설정
on:
push:
branches: ["main"] # main 브랜치에 푸시될 때 워크플로우 실행
permissions:
contents: read # 워크플로우의 권한 설정 (read-only)
jobs:
build:
runs-on: ubuntu-latest # 워크플로우가 실행될 환경 설정 (Ubuntu 최신 버전)
steps:
# 코드 체크아웃: GitHub Actions가 현재 리포지토리의 코드를 가져옵니다.
- uses: actions/checkout@v3
# JDK 17 설정: Java 17 버전을 사용하기 위해 JDK를 설치합니다.
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17' # JDK 버전 17 설정
distribution: 'temurin' # Temurin JDK 배포판 사용
# application.properties 파일 생성: prod 환경의 설정 파일을 생성하고 secrets에서 값을 가져와 입력합니다.
- name: make application.properties
run: |
cd ./src/main/resources # resources 디렉토리로 이동
touch ./application.properties # application.properties 파일 생성
echo "${{ secrets.APPLICATION_PROD }}" > ./application.properties # GitHub Secrets에서 설정값을 가져와 파일에 저장
# Gradle Wrapper 실행 권한 부여: gradlew에 실행 권한을 부여합니다.
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Gradle 빌드: Gradle을 사용해 프로젝트를 빌드하되, 테스트는 생략합니다.
- name: Build with Gradle
run: ./gradlew build -x test # 테스트는 실행하지 않고 빌드만 수행
# Docker 이미지 빌드 및 푸시
- name: Docker build
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} # Docker Hub에 로그인
docker build -t app . # Docker 이미지를 'app'이라는 이름으로 빌드
docker tag app ${{ secrets.DOCKER_USERNAME }}/backend:latest # 이미지를 Docker Hub 저장소로 태깅
docker push ${{ secrets.DOCKER_USERNAME }}/backend:latest # 이미지를 Docker Hub에 푸시
# EC2에서 직접 Docker 배포
- name: Deploy to EC2
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SPRING_EC2_IP }} # EC2 퍼블릭 IP
username: ubuntu # EC2의 사용자 이름 (기본적으로 `ubuntu`)
key: ${{ secrets.SPRING_EC2_PEMKEY }} # EC2의 SSH 개인 키 (GitHub Secrets 사용)
port: 22 # 기본 SSH 포트
script: |
# Docker 사용을 위한 권한 설정
sudo usermod -aG docker ubuntu
sudo chmod 666 /var/run/docker.sock
# Docker Hub 로그인
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
# 최신 Docker 이미지 Pull
docker pull ${{ secrets.DOCKER_USERNAME }}/backend:latest
# 실행 중인 컨테이너 중 backend 컨테이너가 있으면 중지 및 삭제
docker stop backend || true
docker rm backend || true
# 새로운 컨테이너 실행
docker run -d --restart unless-stopped --log-driver=syslog -p 8080:8080 --name backend ${{ secrets.DOCKER_USERNAME }}/backend:latest
# 24시간 이상 사용되지 않은 Docker 이미지 정리
docker image prune -a -f --filter "until=24h"