feat: 실시간 지하철 도착 정보 조회 기능 구현 (#132) #87
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
| name: Pace Project CI/CD # 워크플로우 이름 설정 | |
| on: | |
| push: | |
| branches: [ "main", "develop" ] # 해당 브랜치에 코드가 push될 때만 실행 | |
| jobs: | |
| deploy: | |
| runs-on: ubuntu-latest # 깃허브가 제공하는 최신 우분투 가상 환경에서 작업 | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 # 깃허브 서버로 내 소스 코드를 가져옴 | |
| - name: Login to Docker Hub | |
| uses: docker/login-action@v3 # 도커 허브 접속 시도 | |
| with: | |
| username: ${{ secrets.DOCKERHUB_USERNAME }} # 깃허브 시크릿에서 아이디 가져옴 | |
| password: ${{ secrets.DOCKERHUB_TOKEN }} # 깃허브 시크릿에서 토큰 가져옴 | |
| - name: Build and push Docker image | |
| uses: docker/build-push-action@v5 # 도커 이미지 빌드 및 전송 | |
| with: | |
| context: . # 현재 위치의 파일을 바탕으로 빌드 | |
| push: true # 빌드 성공 시 도커 허브로 즉시 보냄 | |
| tags: ${{ secrets.DOCKERHUB_USERNAME }}/pace-project:latest # 이미지 이름과 태그 붙임 | |
| - name: Prepare directory on EC2 | |
| uses: appleboy/ssh-action@v1.0.3 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USERNAME }} | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| script: mkdir -p ~/pace-project/nginx | |
| - name: Copy docker-compose.yml via scp | |
| uses: appleboy/scp-action@v0.1.7 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} | |
| username: ${{ secrets.EC2_USERNAME }} | |
| key: ${{ secrets.EC2_SSH_KEY }} | |
| source: "docker-compose.yml,nginx/default.conf" # 내 깃허브에 있는 파일 이름 | |
| target: "~/pace-project" # 서버에 저장될 폴더 이름 | |
| - name: Deploy to EC2 | |
| uses: appleboy/ssh-action@v1.0.3 # SSH를 통해 AWS EC2 서버에 접속 | |
| with: | |
| host: ${{ secrets.EC2_HOST }} # EC2의 IP 주소로 연결 | |
| username: ${{ secrets.EC2_USERNAME }} # 접속 계정(보통 ubuntu) 사용 | |
| key: ${{ secrets.EC2_SSH_KEY }} # .pem 키 내용으로 인증 | |
| script: | # 접속 후 실행할 명령어들 시작 | |
| mkdir -p ~/pace-project # 프로젝트 폴더가 없으면 생성 | |
| cd ~/pace-project # 해당 폴더로 이동 | |
| docker pull ${{ secrets.DOCKERHUB_USERNAME }}/pace-project:latest # 창고에서 새 이미지 가져옴 | |
| # 서버에서 사용할 비밀 장부(.env)를 시크릿 값으로 새로 만듦 | |
| echo "MYSQL_ROOT_PASSWORD=${{ secrets.MYSQL_ROOT_PASSWORD }}" > .env | |
| echo "MYSQL_DATABASE=${{ secrets.MYSQL_DATABASE }}" >> .env | |
| echo "MYSQL_USER=${{ secrets.MYSQL_USER }}" >> .env | |
| echo "MYSQL_PASSWORD=${{ secrets.MYSQL_PASSWORD }}" >> .env | |
| echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}" >> .env | |
| echo "JWT_SECRET=${{ secrets.JWT_SECRET }}" >> .env | |
| echo "KAKAO_CLIENT_ID=${{ secrets.KAKAO_CLIENT_ID }}" >> .env | |
| echo "KAKAO_REDIRECT_URI=${{ secrets.KAKAO_REDIRECT_URI }}" >> .env | |
| echo "GOOGLE_MAPS_API_KEY=${{ secrets.GOOGLE_MAPS_API_KEY }}" >> .env | |
| echo "SEOUL_SUBWAY_API_KEY=${{ secrets.SEOUL_SUBWAY_API_KEY }}" >> .env | |
| docker-compose up -d --remove-orphans # 새 이미지로 세트 메뉴(DB+앱) 다시 실행 | |
| docker image prune -f | |
| # 헬스 체크: 서버가 제대로 떴는지 10번 확인함 | |
| echo "Starting health check..." | |
| for i in {1..10}; do | |
| RESPONSE=$(curl -s -H "Host: pace-server.kro.kr" http://localhost/health) # 내 서버에 안부를 물어봄 | |
| if [ "$RESPONSE" = "OK" ]; then # 대답이 "OK"면 성공 | |
| echo "Health check passed!" | |
| exit 0 | |
| fi | |
| echo "Waiting for server... ($i/10)" # 아직 안 떴으면 10초 기다림 | |
| sleep 10 | |
| done | |
| echo "Health check failed." # 10번 다 실패하면 배포 실패 처리 | |
| exit 1 |