Merge pull request #78 from AI-SIP/develop #26
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: 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 |