Skip to content

Merge pull request #75 from AI-SIP/develop #23

Merge pull request #75 from AI-SIP/develop

Merge pull request #75 from AI-SIP/develop #23

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 파일 생성: dev 환경의 설정 파일을 생성하고 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 }}/ono:latest # 이미지를 Docker Hub 저장소로 태깅
docker push ${{ secrets.DOCKER_USERNAME }}/ono:latest # 이미지를 Docker Hub에 푸시
# Bastion 서버를 통해 스프링 서버로 배포
- name: Deploy via Bastion Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.PROD_BASTION_HOST }} # Bastion 서버의 퍼블릭 IP 또는 DNS 주소
username: ubuntu # Bastion 서버의 사용자 이름
key: ${{ secrets.PROD_BASTION_PRIVATE_KEY }} # Bastion 서버의 SSH 개인 키 (GitHub Secrets에서 가져옴)
port: 22 # SSH 연결에 사용할 포트 (기본값 22)
script: |
sudo usermod -aG docker ubuntu
sudo chmod 666 /var/run/docker.sock
# Bastion 서버에서 스프링 서버로 SSH 연결 및 도커 작업 수행
ssh -o StrictHostKeyChecking=no -i /home/ubuntu/dev-an2-ono-test-spring-key.pem ubuntu@${{ secrets.PROD_SPRING_SERVER_IP }} << "EOSSH"
# 스프링 서버에서 Docker Hub에 로그인
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
# 최신 Docker 이미지를 Docker Hub에서 Pull
docker pull ${{ secrets.DOCKER_USERNAME }}/ono:latest
# 실행 중인 모든 컨테이너를 중지 (실행 중인 컨테이너가 없을 경우 오류 무시)
docker stop $(docker ps -a -q) || true
# 중지된 모든 컨테이너를 제거 (없을 경우 오류 무시)
docker rm $(docker ps -a -q) || true
# 새로 받은 이미지를 기반으로 컨테이너 실행 (8080 포트 사용)
docker run -d --restart unless-stopped --log-driver=syslog -p 8080:8080 ${{ secrets.DOCKER_USERNAME }}/ono:latest
# 24시간 동안 사용되지 않은 모든 Docker 이미지를 삭제하여 공간 확보
docker image prune -a -f --filter "until=24h"
EOSSH