CD - Deploy to Production #26
This file contains hidden or 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
| # .github/workflows/deploy-prod.yml | |
| name: CD - Deploy to Production | |
| # 이 워크플로는 prod 브랜치에서 실행된 build.yml 워크플로가 | |
| # 성공적으로 완료되었을 때만 트리거됩니다. | |
| on: | |
| workflow_run: | |
| workflows: ["CI - Build and Test Spring Boot App"] # build.yml의 'name' 필드와 일치 | |
| types: [completed] # build.yml이 완료되었을 때 트리거 | |
| branches: [prod] # prod 브랜치에서 build.yml이 성공했을 때만 실행 | |
| permissions: | |
| contents: read # 저장소 콘텐츠 읽기 권한 | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest # 배포를 실행할 GitHub 호스팅 러너 | |
| # 위 workflow_run 이벤트 중에서도, | |
| # build.yml이 prod 브랜치에서 성공한 경우에만 이 Job이 실행됩니다. | |
| if: github.event.workflow_run.conclusion == 'success' && | |
| github.event.workflow_run.head_branch == 'prod' | |
| steps: | |
| - name: Checkout Repository # Dockerfile, 배포 스크립트 등의 위해 리포지토리 체크아웃 | |
| uses: actions/checkout@v4 | |
| - name: Download JAP artifact # build.yml에서 업로드한 JAR 아티팩트 다운로드 | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: spring-app-jar # build.yml에서 업로드한 아티팩트 이름 | |
| path: . # 현재 워크플로의 루트 디렉터리에 다운로드 | |
| run-id: ${{ github.event.workflow_run.id }} | |
| github-token: ${{ secrets.TOKEN_GITHUB_ACTIONS }} | |
| - name: Prepare JAR for Docker Build # 다운로드된 JAR 파일을 Dockerfile에서 쉽게 참조하도록 준비 | |
| run: mv *.jar app.jar | |
| - name: Docker Login # Docker Hub에 인증 | |
| run: docker login -u ${{secrets.DOCKER_USER}} -p ${{secrets.DOCKER_TOKEN}} | |
| - name: Build Docker Image for Production # Docker 이미지 빌드 (prod 태그 적용) | |
| run: docker build -t ${{ secrets.DOCKER_REPOSITORY }}:prod . # prod 태그 사용 | |
| - name: Push Docker Image to Registry # 빌드된 Docker 이미지 푸시 | |
| run: docker push ${{ secrets.DOCKER_REPOSITORY }}:prod # prod 태그 푸시 | |
| - name: Deploy to Production Server # SSH 접속 및 배포 스크립트 실행 | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{secrets.HOST}} | |
| username: ${{secrets.USERNAME}} | |
| key: ${{ secrets.PRIVATE_KEY }} | |
| port: 22 # SSH 포트 (기본값) | |
| envs: GITHUB_SHA | |
| script: | | |
| # 이 스크립트는 Production 서버에서 실행됩니다. | |
| echo "Deploying to Production Server..." | |
| # 환경 변수 설정 | |
| export DOCKER_REPOSITORY=${{ secrets.DOCKER_REPOSITORY }} | |
| export DOCKER_TAG=prod | |
| export SPRING_PROFILES_ACTIVE=prod | |
| export DB_USERNAME=${{ secrets.DB_USERNAME }} | |
| export DB_PASSWORD=${{ secrets.DB_PASSWORD }} | |
| export JWT_SECRET=${{ secrets.JWT_SECRET }} | |
| export OAUTH_CLIENT_ID=${{ secrets.OAUTH_CLIENT_ID }} | |
| export OAUTH_CLIENT_SECRET=${{ secrets.OAUTH_CLIENT_SECRET }} | |
| export SLACK_WEBHOOK_URL=${{ secrets.SLACK_WEBHOOK_URL }} | |
| export APP_DATA_PATH=/mnt/data/LegalDongCode_List.txt:/app/data/LegalDongCode_List.txt | |
| # 기존 컨테이너 중지 및 삭제 (오류 발생 시 무시하도록 '|| true' 추가) | |
| sudo docker stop springboot || true | |
| sudo docker rm -f springboot || true | |
| echo "Pulling Docker image: $DOCKER_REPOSITORY:$DOCKER_TAG" | |
| sudo docker pull $DOCKER_REPOSITORY:$DOCKER_TAG | |
| echo "Running new Docker container..." | |
| sudo docker run -d --net=host --name springboot \ | |
| -v $APP_DATA_PATH \ | |
| -e TZ=Asia/Seoul \ | |
| -e SPRING_PROFILES_ACTIVE=$SPRING_PROFILES_ACTIVE \ | |
| -e DB_USERNAME=$DB_USERNAME \ | |
| -e DB_PASSWORD=$DB_PASSWORD \ | |
| -e JWT_SECRET=$JWT_SECRET \ | |
| -e OAUTH_CLIENT_ID=$OAUTH_CLIENT_ID \ | |
| -e OAUTH_CLIENT_SECRET=$OAUTH_CLIENT_SECRET \ | |
| -e SLACK_WEBHOOK_URL=$SLACK_WEBHOOK_URL \ | |
| $DOCKER_REPOSITORY:$DOCKER_TAG | |
| echo "Pruning old Docker images..." | |
| sudo docker image prune -f | |
| echo "Deployment to Production completed." |