Skip to content

Merge pull request #487 from boostcampwm-2024/feat/create-email-worker #1

Merge pull request #487 from boostcampwm-2024/feat/create-email-worker

Merge pull request #487 from boostcampwm-2024/feat/create-email-worker #1

name: Email-Worker Deployment
on:
push:
branches: [ main ]
paths: [ "email-worker/**" ]
workflow_dispatch:
permissions:
contents: read
packages: write
env:
IMAGE_NAME: ghcr.io/boostcampwm-2024/web05-denamu/email-worker
IMAGE_TAG: sha-${{ github.sha }}
SERVICE: email-worker
ENV_DIR: /var/prod_config/email-worker
ENV_FILE: /var/prod_config/email-worker/.env.prod
COMPOSE_FILE: docker-compose/docker-compose.prod.yml
STOP_GRACE_PERIOD: 30
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: QEMU 멀티 아키텍쳐 에뮬레이터
uses: docker/setup-qemu-action@v3
- name: Buildx 멀티 아키텍쳐 빌더
uses: docker/setup-buildx-action@v3
- name: GHCR 로그인
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_GITHUB_TOKEN }}
- name: Docker 이미지 Build 및 Push
uses: docker/build-push-action@v6
with:
context: ./email-worker
file: ./email-worker/docker/Dockerfile.prod
push: true
platforms: linux/amd64,linux/arm64
tags: |
${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }}
${{ env.IMAGE_NAME }}:latest
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
runs-on: [ self-hosted, prod ]
needs: build-and-push # Build 및 Push가 끝나면 시작
steps:
- name: 코드 체크아웃
uses: actions/checkout@v4
- name: GHCR 로그인 (prod)
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GHCR_GITHUB_TOKEN }}
- name: 환경변수 최신화
run: |
sudo mkdir -p "$ENV_DIR"
sudo install -m 600 /dev/null "$ENV_FILE"
{
echo "EMAIL_USER=${{ secrets.EMAIL_USER }}"
echo "EMAIL_PASSWORD=${{ secrets.EMAIL_PASSWORD }}"
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
} | sudo tee "$ENV_FILE" >/dev/null
# 인프라용 환경변수 파일 생성 (Redis, MySQL 등)
sudo mkdir -p /var/prod_config/infra
sudo install -m 600 /dev/null /var/prod_config/infra/.env.prod
{
echo "REDIS_USER=${{ secrets.REDIS_USERNAME }}"
echo "REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }}"
echo "MYSQL_ROOT_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
echo "MYSQL_DATABASE=${{ secrets.PRODUCT_DB_DATABASE }}"
echo "MYSQL_USER=${{ secrets.PRODUCT_DB_USERNAME }}"
echo "MYSQL_PASSWORD=${{ secrets.PRODUCT_DB_PASSWORD }}"
echo "RABBITMQ_DEFAULT_USER=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_USER }}"
echo "RABBITMQ_DEFAULT_PASS=${{ secrets.PRODUCT_RABBITMQ_DEFAULT_PASS }}"
echo "RABBITMQ_HOST=${{ secrets.PRODUCT_RABBITMQ_HOST }}"
echo "RABBITMQ_PORT=${{ secrets.PRODUCT_RABBITMQ_PORT }}"
echo "RABBITMQ_MANAGEMENT_PORT=${{ secrets.PRODUCT_RABBITMQ_MANAGEMENT_PORT }}"
} | sudo tee /var/prod_config/infra/.env.prod >/dev/null
- name: Docker 이미지 Pull
run: |
docker pull "${IMAGE_NAME}:${IMAGE_TAG}" || true
docker pull "${IMAGE_NAME}:latest" || true
docker compose -f "$COMPOSE_FILE" pull "$SERVICE"
- name: Graceful Shutdown & 서비스 재시작
run: |
docker compose -f "$COMPOSE_FILE" stop -t $STOP_GRACE_PERIOD "$SERVICE" || true
docker compose -f "$COMPOSE_FILE" up -d --no-deps --force-recreate "$SERVICE"
docker image prune -f || true