Skip to content

feat: 실시간 지하철 도착 정보 조회 기능 구현 (#132) #87

feat: 실시간 지하철 도착 정보 조회 기능 구현 (#132)

feat: 실시간 지하철 도착 정보 조회 기능 구현 (#132) #87

Workflow file for this run

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