1+ name : Email-Worker Deployment
2+
3+ on :
4+ push :
5+ branches : [ main ]
6+ paths : [ "email-worker/**" ]
7+ workflow_dispatch :
8+
9+ permissions :
10+ contents : read
11+ packages : write
12+
13+ env :
14+ IMAGE_NAME : ghcr.io/boostcampwm-2024/web05-denamu/email-worker
15+ IMAGE_TAG : sha-${{ github.sha }}
16+ SERVICE : email-worker
17+ ENV_DIR : /var/prod_config/email-worker
18+ ENV_FILE : /var/prod_config/email-worker/.env.prod
19+ COMPOSE_FILE : docker-compose/docker-compose.prod.yml
20+ STOP_GRACE_PERIOD : 30
21+
22+ jobs :
23+ build-and-push :
24+ runs-on : ubuntu-latest
25+ steps :
26+ - uses : actions/checkout@v4
27+
28+ - name : QEMU 멀티 아키텍쳐 에뮬레이터
29+ uses : docker/setup-qemu-action@v3
30+
31+ - name : Buildx 멀티 아키텍쳐 빌더
32+ uses : docker/setup-buildx-action@v3
33+
34+ - name : GHCR 로그인
35+ uses : docker/login-action@v3
36+ with :
37+ registry : ghcr.io
38+ username : ${{ github.actor }}
39+ password : ${{ secrets.GHCR_GITHUB_TOKEN }}
40+
41+ - name : Docker 이미지 Build 및 Push
42+ uses : docker/build-push-action@v6
43+ with :
44+ context : ./email-worker
45+ file : ./email-worker/docker/Dockerfile.prod
46+ push : true
47+ platforms : linux/amd64,linux/arm64
48+ tags : |
49+ ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
50+ ${{ env.IMAGE_NAME }}:latest
51+ cache-from : type=gha
52+ cache-to : type=gha,mode=max
53+
54+ deploy :
55+ runs-on : [ self-hosted, prod ]
56+ needs : build-and-push # Build 및 Push가 끝나면 시작
57+ steps :
58+ - name : 코드 체크아웃
59+ uses : actions/checkout@v4
60+
61+ - name : GHCR 로그인 (prod)
62+ uses : docker/login-action@v3
63+ with :
64+ registry : ghcr.io
65+ username : ${{ github.actor }}
66+ password : ${{ secrets.GHCR_GITHUB_TOKEN }}
67+
68+ - name : 환경변수 최신화
69+ run : |
70+ sudo mkdir -p "$ENV_DIR"
71+ sudo install -m 600 /dev/null "$ENV_FILE"
72+ {
73+ echo "EMAIL_USER=${{ secrets.EMAIL_USER }}"
74+ echo "EMAIL_PASSWORD=${{ secrets.EMAIL_PASSWORD }}"
75+ echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
76+ echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
77+ echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
78+ echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
79+ } | sudo tee "$ENV_FILE" >/dev/null
80+
81+ # 인프라용 환경변수 파일 생성 (Redis, MySQL 등)
82+ sudo mkdir -p /var/prod_config/infra
83+ sudo install -m 600 /dev/null /var/prod_config/infra/.env.prod
84+ {
85+ echo "REDIS_USER=${{ secrets.REDIS_USERNAME }}"
86+ echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}"
87+ echo "MYSQL_ROOT_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
88+ echo "MYSQL_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}"
89+ echo "MYSQL_USER=${{ secrets.PRODUCT_DB_USERNAME }}"
90+ echo "MYSQL_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
91+ echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
92+ echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
93+ echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
94+ echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
95+ echo "RABBITMQ_MANAGEMENT_PORT=${{ secrets.PRODUCT_RABBITMQ_MANAGEMENT_PORT }}"
96+ } | sudo tee /var/prod_config/infra/.env.prod >/dev/null
97+
98+ - name : Docker 이미지 Pull
99+ run : |
100+ docker pull "${IMAGE_NAME}:${IMAGE_TAG}" || true
101+ docker pull "${IMAGE_NAME}:latest" || true
102+ docker compose -f "$COMPOSE_FILE" pull "$SERVICE"
103+
104+ - name : Graceful Shutdown & 서비스 재시작
105+ run : |
106+ docker compose -f "$COMPOSE_FILE" stop -t $STOP_GRACE_PERIOD "$SERVICE" || true
107+ docker compose -f "$COMPOSE_FILE" up -d --no-deps --force-recreate "$SERVICE"
108+ docker image prune -f || true
0 commit comments