Skip to content

[Feat] FREE 모임 참가 이후 토스터 팝업 적용 #580

[Feat] FREE 모임 참가 이후 토스터 팝업 적용

[Feat] FREE 모임 참가 이후 토스터 팝업 적용 #580

name: Deploy Preview to EC2
on:
pull_request:
types: [opened, synchronize, reopened]
permissions:
contents: read
pull-requests: write
concurrency:
group: preview-${{ github.head_ref }}
cancel-in-progress: true
jobs:
preview-deploy:
runs-on: ubuntu-latest
env:
APP_DOMAIN: wego.monster
# 브랜치명 계산 필요
# APP_DIR: wego-production
# 앱 포트 계산 필요
# APP_PORT: 3000
# pm2 앱 이름 계산 필요
# PM2_APP_NAME: wego-production
COMPRESSED_FILE_NAME: nextjs-app.tar.gz
NPMRC_PATH: /home/ubuntu/.npmrc
PNPM_STORE_PATH: /home/ubuntu/.pnpm-store
SCRIPTS_DIR: /home/ubuntu/scripts/ec2
SETUP_SCRIPT: ec2-setup.sh
DEPLOY_SCRIPT: ec2-deploy.sh
NGINX_SCRIPT: ec2-nginx.sh
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Create initial Report
if: success()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const commentPR = require('./.github/scripts/deploy-initial-comment.cjs');
await commentPR({ github, context });
- name: Compute branch name & port
id: meta
run: |
RAW="${{ github.head_ref }}"
SANITIZED="$(echo "$RAW" | tr '[:upper:]' '[:lower:]' | sed 's#[^a-z0-9._-]#-#g')"
PORT=$(( 5000 + $(echo -n "$SANITIZED" | cksum | awk '{print $1 % 1000}') ))
echo "app_dir=preview-$SANITIZED" >> $GITHUB_OUTPUT
echo "branch=$SANITIZED" >> $GITHUB_OUTPUT
echo "app_port=$PORT" >> $GITHUB_OUTPUT
echo "pm2_app_name=preview-$SANITIZED" >> $GITHUB_OUTPUT
echo "[DEBUG][META] ✅ RAW=$RAW"
echo "[DEBUG][META] ✅ SANITIZED=$SANITIZED"
echo "[DEBUG][META] ✅ APP_DIR=preview-$SANITIZED"
echo "[DEBUG][META] ✅ BRANCH=$SANITIZED"
echo "[DEBUG][META] ✅ APP_PORT=$PORT"
echo "[DEBUG][META] ✅ PM2_APP_NAME=preview-$SANITIZED"
- name: Setup pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '24'
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Project
run: pnpm run build
env:
NEXT_PUBLIC_API_BASE_URL: ${{ vars.NEXT_PUBLIC_API_BASE_URL }}
- name: Compress Files
run: tar -czvf ${{ env.COMPRESSED_FILE_NAME }} .next package.json pnpm-lock.yaml public next.config.ts
- name: Send Scripts to EC2
uses: appleboy/[email protected]
with:
host: ${{ secrets.AWS_EC2_HOST }}
username: ${{ secrets.AWS_EC2_USERNAME }}
key: ${{ secrets.AWS_EC2_PEM_KEY }}
source: scripts/
target: /home/ubuntu/
- name: Send Compress Files to EC2
uses: appleboy/[email protected]
env:
APP_DIR: ${{ steps.meta.outputs.app_dir }}
with:
host: ${{ secrets.AWS_EC2_HOST}}
username: ${{ secrets.AWS_EC2_USERNAME }}
key: ${{ secrets.AWS_EC2_PEM_KEY }}
source: ${{ env.COMPRESSED_FILE_NAME }}
target: /home/ubuntu/${{ env.APP_DIR }}/build
- name: Initial EC2 Setup
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.AWS_EC2_HOST}}
username: ${{ secrets.AWS_EC2_USERNAME }}
key: ${{ secrets.AWS_EC2_PEM_KEY }}
envs: >
NPMRC_PATH, PNPM_STORE_PATH, SCRIPTS_DIR, SETUP_SCRIPT
script: |
chmod +x $SCRIPTS_DIR/$SETUP_SCRIPT
$SCRIPTS_DIR/$SETUP_SCRIPT "$NPMRC_PATH" "$PNPM_STORE_PATH"
- name: Deploy Application
uses: appleboy/ssh-action@v1
env:
APP_DIR: ${{ steps.meta.outputs.app_dir }}
APP_PORT: ${{ steps.meta.outputs.app_port }}
PM2_APP_NAME: ${{ steps.meta.outputs.pm2_app_name }}
with:
host: ${{ secrets.AWS_EC2_HOST }}
username: ${{ secrets.AWS_EC2_USERNAME }}
key: ${{ secrets.AWS_EC2_PEM_KEY }}
envs: >
APP_DIR, APP_PORT, PM2_APP_NAME, COMPRESSED_FILE_NAME, SCRIPTS_DIR, DEPLOY_SCRIPT
script: |
chmod +x $SCRIPTS_DIR/$DEPLOY_SCRIPT
$SCRIPTS_DIR/$DEPLOY_SCRIPT \
"$APP_DIR" \
"$APP_PORT" \
"$PM2_APP_NAME" \
"$COMPRESSED_FILE_NAME"
- name: NGINX Setup
uses: appleboy/ssh-action@v1
env:
APP_PORT: ${{ steps.meta.outputs.app_port }}
BRANCH: ${{ steps.meta.outputs.branch }}
with:
host: ${{ secrets.AWS_EC2_HOST }}
username: ${{ secrets.AWS_EC2_USERNAME }}
key: ${{ secrets.AWS_EC2_PEM_KEY }}
envs: >
BRANCH, APP_DOMAIN, APP_PORT, SCRIPTS_DIR, NGINX_SCRIPT
script: |
chmod +x $SCRIPTS_DIR/$NGINX_SCRIPT
$SCRIPTS_DIR/$NGINX_SCRIPT \
"$BRANCH" \
"$APP_DOMAIN" \
"$APP_PORT"
- name: Comment PR - Success
if: success()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const commentPR = require('./.github/scripts/deploy-comment.cjs');
await commentPR({
github,
context,
core,
branch: '${{ steps.meta.outputs.branch }}',
appDomain: '${{ env.APP_DOMAIN }}',
success: true
});
- name: Comment PR - Failure
if: failure()
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const commentPR = require('./.github/scripts/deploy-comment.cjs');
await commentPR({
github,
context,
core,
branch: '${{ steps.meta.outputs.branch }}',
appDomain: '${{ env.APP_DOMAIN }}',
success: false
});