Skip to content

캘린더 날짜/시간 수정 가능, 타임존 변환 추가 #30

캘린더 날짜/시간 수정 가능, 타임존 변환 추가

캘린더 날짜/시간 수정 가능, 타임존 변환 추가 #30

Workflow file for this run

name: CD to EC2 (RightMark)
on:
push:
branches: [ develop ]
jobs:
build-and-deploy:
# PR이 'closed' 되어도 merge가 아니면 스킵
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.pull_request.merged == true)
runs-on: ubuntu-latest
env:
TARGET_DIR: ${{ secrets.TARGET_DIR }}
SERVICE_NAME: ${{ secrets.SERVICE_NAME }}
EC2_HOST: ${{ secrets.EC2_HOST }}
EC2_USER: ${{ secrets.EC2_USER }}
EC2_PORT: ${{ secrets.EC2_PORT }}
HEALTH_URL: ${{ secrets.HEALTH_URL }}
REL_NAME: rightmark-${{ github.sha }}
JAR_PATH: build/libs/*.jar
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*','**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Build with Gradle
run: |
chmod +x ./gradlew
./gradlew clean build -x test
ls -al build/libs
- name: Prepare SSH key
run: |
mkdir -p ~/.ssh
echo "${{ secrets.EC2_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan -H "${{ secrets.EC2_HOST }}" >> ~/.ssh/known_hosts
- name: Create release dir on EC2
env:
PORT: ${{ env.EC2_PORT }}
run: |
ssh -p "${PORT:-22}" "${EC2_USER}@${EC2_HOST}" \
"mkdir -p '${TARGET_DIR}/releases/${REL_NAME}' '${TARGET_DIR}/logs'"
- name: Upload JAR to EC2
env:
PORT: ${{ env.EC2_PORT }}
run: |
# 가장 일반적인 부트 JAR 한 개만 선택
JAR_FILE=$(ls build/libs/*-SNAPSHOT.jar 2>/dev/null || ls build/libs/*.jar | head -n1)
echo "Uploading: $JAR_FILE"
scp -P "${PORT:-22}" "$JAR_FILE" "${EC2_USER}@${EC2_HOST}":"${TARGET_DIR}/releases/${REL_NAME}/app.jar"
- name: Switch symlink (atomic) & restart service
env:
PORT: ${{ env.EC2_PORT }}
run: |
ssh -p "${PORT:-22}" "${EC2_USER}@${EC2_HOST}" /bin/bash <<EOF
set -euo pipefail
TARGET_DIR="${TARGET_DIR}"
REL_NAME="${REL_NAME}"
SERVICE="${SERVICE_NAME}"
# 이전 릴리스 경로 (symlink였을 때만 기록)
if [ -L "\$TARGET_DIR/current" ]; then
readlink -f "\$TARGET_DIR/current" > "\$TARGET_DIR/previous_release.path" || true
fi
# current가 디렉터리면 제거(첫 배포에서 흔함)
if [ -d "\$TARGET_DIR/current" ] && [ ! -L "\$TARGET_DIR/current" ]; then
rm -rf "\$TARGET_DIR/current"
fi
# 새 릴리스로 current 링크 생성/갱신
ln -sfn "\$TARGET_DIR/releases/\$REL_NAME" "\$TARGET_DIR/current"
# 서비스 재시작
sudo systemctl restart "\$SERVICE"
sudo systemctl is-active "\$SERVICE"
EOF
- name: Health check over SSH (optional)
if: env.HEALTH_URL != ''
env:
PORT: ${{ env.EC2_PORT }}
run: |
# EC2 내부에서 localhost로 헬스체크
ssh -p "${PORT:-22}" "${EC2_USER}@${EC2_HOST}" "for i in {1..10}; do curl -fsS '${HEALTH_URL}' && exit 0; sleep 3; done; exit 1"
- name: Rollback on failure
if: failure()
env:
PORT: ${{ env.EC2_PORT }}
run: |
ssh -p "${PORT:-22}" "${EC2_USER}@${EC2_HOST}" /bin/bash <<EOF
set -euo pipefail
TARGET_DIR="${TARGET_DIR}"
SERVICE="${SERVICE_NAME}"
if [ -f "\$TARGET_DIR/previous_release.path" ]; then
PREV=\$(cat "\$TARGET_DIR/previous_release.path")
echo "Rolling back to: \$PREV"
ln -sfn "\$PREV" "\$TARGET_DIR/current"
sudo systemctl restart "\$SERVICE"
sudo systemctl is-active "\$SERVICE" || true
else
echo "No previous release info; cannot rollback."
exit 1
fi
EOF
- name: Done
run: echo "✅ Deployment finished"