From 8c1778de6159dd58ca945dd58ff3e780ca807206 Mon Sep 17 00:00:00 2001 From: LeeCh0129 Date: Sun, 22 Jun 2025 20:20:30 +0900 Subject: [PATCH 1/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20CI/CD=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=B4=ED=94=84=EB=9D=BC=EC=9D=B8=20=EB=A9=94?= =?UTF-8?q?=EB=AA=A8=EB=A6=AC=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 32 ++++++++++---------- .github/workflows/deploy.yml | 58 ++++++++++++++++++------------------ 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a47788a..08b5923 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,24 +9,26 @@ on: jobs: eslint-check: runs-on: self-hosted - timeout-minutes: 10 + timeout-minutes: 2 steps: - # 코드 가져오기 - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - # Node.js 환경 설정 - - name: Setup Node.js - uses: actions/setup-node@v4 - with: - node-version: '18' - cache: 'npm' + - name: Lightning fast lint check + run: | + echo "⚡ Quick lint check..." - # 의존성 설치 - - name: Install dependencies - run: npm ci + # 변경된 파일만 검사(전체가 아닌 2~3개 파일만) + CHANGED_FILES=$(git diff --name-only HEAD~1 -- '*.ts' '*.tsx' '*.js' '*.jsx') - # ESLint 실행 - - name: Run ESLint - run: npm run lint + # 변경사항 없으면 즉시 종료 + if [ -z "$CHANGED_FILES" ]; then + echo "✅ No JS/TS files changed" + exit 0 + fi + + # 글로벌 ESLint 사용 + echo "📝 Checking: $CHANGED_FILES" + npx eslint $CHANGED_FILES + echo "✅ Lint check passed!" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index d9aa8db..a703746 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -6,51 +6,51 @@ on: branches: [main, develop] jobs: - deploy: - if: github.event.pull_request.merged == true + # 환경 체크 단계 분리 + warmup: runs-on: self-hosted - timeout-minutes: 15 + timeout-minutes: 3 + steps: + - name: Environment check + run: | + echo "=== System Check ===" + whoami + docker --version + free -h # 메모리 상태 사전 체크 + docker ps # 현재 컨테이너 상태 + deploy: + needs: warmup # ✅ warmup 완료 후 실행 + runs-on: self-hosted + timeout-minutes: 10 steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - name: Deploy to EC2 + # 스크립트 분리 + - name: Execute deployment script run: | echo "🚀 Starting deployment..." echo "🔄 Branch: ${{ github.ref_name }}" echo "🔄 Commit: ${{ github.sha }}" - # 메모리 정리 - echo "🧹 Cleaning up memory..." - docker system prune -f - - # 앱 디렉토리로 코드 복사 - echo "📂 Copying files..." - rsync -av --delete \ - --exclude='.git' \ - --exclude='node_modules' \ - --exclude='.next' \ - ./ /home/ubuntu/coplan/app/ - - # 배포 디렉토리로 이동 + # 단순히 스크립트만 실행 cd /home/ubuntu/coplan + chmod +x ./deploy.sh + ./deploy.sh - # Docker 컨테이너 재시작 - echo "🔄 Restarting containers..." - docker compose down - docker compose up -d --build - - # 헬스체크 + # 헬스체크 + - name: Health check + run: | echo "🏥 Health checking..." sleep 15 - if docker ps | grep -q coplan-app; then - echo "✅ Deployment completed successfully!" - docker logs --tail 10 coplan-app - echo "🌐 Service available at: http://15.164.127.149" + if docker ps | grep -q $DOCKER_CONTAINER_NAME; then + echo "✅ Deployment completed!" + docker logs --tail 5 $DOCKER_CONTAINER_NAME + echo "🌐 https://coplan.work" # ✅ HTTPS else echo "❌ Deployment failed!" - docker logs coplan-app + docker logs $DOCKER_CONTAINER_NAME 2>/dev/null || echo "No logs" exit 1 fi From 67d35eb0a19a70e1c07835c63ff83cc754a261c1 Mon Sep 17 00:00:00 2001 From: LeeCh0129 Date: Sun, 22 Jun 2025 20:25:43 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=90=9B=20fix:=20CI=EC=97=90=EC=84=9C?= =?UTF-8?q?=20HEAD~1=20=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08b5923..dc3f2a3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,17 +14,27 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 + with: + fetch-depth: 2 # HEAD와 HEAD~1을 모두 가져오기 - name: Lightning fast lint check run: | echo "⚡ Quick lint check..." - # 변경된 파일만 검사(전체가 아닌 2~3개 파일만) - CHANGED_FILES=$(git diff --name-only HEAD~1 -- '*.ts' '*.tsx' '*.js' '*.jsx') + # 더 안전한 변경 파일 감지 + if git rev-parse --verify HEAD~1 >/dev/null 2>&1; then + # HEAD~1이 존재하는 경우 (일반적인 경우) + CHANGED_FILES=$(git diff --name-only HEAD~1 -- '*.ts' '*.tsx' '*.js' '*.jsx') + echo "🔍 Checking changed files since last commit" + else + # 첫 커밋이거나 shallow clone인 경우 + echo "🔍 Checking recent TypeScript/JavaScript files..." + CHANGED_FILES=$(find . -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" | grep -v node_modules | head -10) + fi # 변경사항 없으면 즉시 종료 if [ -z "$CHANGED_FILES" ]; then - echo "✅ No JS/TS files changed" + echo "✅ No JS/TS files to check" exit 0 fi From a230106ab0efb17c1dff63fed4ef9db79fada98e Mon Sep 17 00:00:00 2001 From: LeeCh0129 Date: Sun, 22 Jun 2025 20:35:35 +0900 Subject: [PATCH 3/3] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20CI/CD=20?= =?UTF-8?q?=EB=A9=94=EB=AA=A8=EB=A6=AC=20=EC=B5=9C=EC=A0=81=ED=99=94=20?= =?UTF-8?q?=EB=B0=8F=20=EC=95=88=EC=A0=84=EC=84=B1=20=EA=B0=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 57 +++++++++++++++++++++++++++++------- .github/workflows/deploy.yml | 44 ++++++++++++++++++++-------- 2 files changed, 78 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc3f2a3..809caa3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,21 +15,51 @@ jobs: - name: Checkout code uses: actions/checkout@v4 with: - fetch-depth: 2 # HEAD와 HEAD~1을 모두 가져오기 + fetch-depth: 2 # HEAD와 베이스 브랜치 히스토리 확보 - name: Lightning fast lint check run: | echo "⚡ Quick lint check..." - # 더 안전한 변경 파일 감지 - if git rev-parse --verify HEAD~1 >/dev/null 2>&1; then - # HEAD~1이 존재하는 경우 (일반적인 경우) - CHANGED_FILES=$(git diff --name-only HEAD~1 -- '*.ts' '*.tsx' '*.js' '*.jsx') - echo "🔍 Checking changed files since last commit" + # 메모리 상태 사전 체크 + AVAILABLE_MB=$(free -m | grep ^Mem | awk '{print $7}') + echo "💾 Available memory: ${AVAILABLE_MB}MB" + + if [ "${{ github.event_name }}" = "pull_request" ]; then + # PR인 경우: 베이스 브랜치와 비교 + BASE_BRANCH="${{ github.base_ref }}" + git fetch origin $BASE_BRANCH --depth=1 + + ALL_CHANGED=$(git diff --name-only origin/$BASE_BRANCH...HEAD -- '*.ts' '*.tsx' '*.js' '*.jsx') + FILE_COUNT=$(echo "$ALL_CHANGED" | wc -w) + + echo "📊 Base: $BASE_BRANCH, Changed files: $FILE_COUNT" + + # 🛡️ 메모리 기반 안전장치 + if [ "$AVAILABLE_MB" -lt 200 ]; then + MAX_FILES=10 + echo "⚠️ Low memory mode: checking $MAX_FILES files only" + elif [ "$FILE_COUNT" -gt 30 ]; then + MAX_FILES=30 + echo "⚠️ Large PR detected: checking first $MAX_FILES files for memory safety" + echo "ℹ️ Note: Full project will be built during deployment" + else + MAX_FILES="$FILE_COUNT" + echo "✅ Normal mode: checking all $FILE_COUNT files" + fi + + CHANGED_FILES=$(echo "$ALL_CHANGED" | head -$MAX_FILES) + else - # 첫 커밋이거나 shallow clone인 경우 - echo "🔍 Checking recent TypeScript/JavaScript files..." - CHANGED_FILES=$(find . -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" | grep -v node_modules | head -10) + # Push인 경우: 이전 커밋과 비교 + echo "🔍 Push event detected" + if git rev-parse --verify HEAD~1 >/dev/null 2>&1; then + CHANGED_FILES=$(git diff --name-only HEAD~1 -- '*.ts' '*.tsx' '*.js' '*.jsx') + echo "📝 Checking files changed since last commit" + else + echo "🔍 First commit or shallow clone, checking recent files" + CHANGED_FILES=$(find . -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" | grep -v node_modules | head -5) + fi fi # 변경사항 없으면 즉시 종료 @@ -38,7 +68,12 @@ jobs: exit 0 fi - # 글로벌 ESLint 사용 - echo "📝 Checking: $CHANGED_FILES" + # 최종 실행 정보 + FINAL_COUNT=$(echo $CHANGED_FILES | wc -w) + ESTIMATED_MB=$((FINAL_COUNT * 2)) + echo "🧠 Checking $FINAL_COUNT files (~${ESTIMATED_MB}MB estimated)" + echo "📝 Files: $CHANGED_FILES" + + # 글로벌 ESLint 실행 npx eslint $CHANGED_FILES echo "✅ Lint check passed!" diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a703746..abda3ce 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,54 +3,74 @@ name: Deploy to EC2 on: pull_request: types: [closed] - branches: [main, develop] + branches: [main] # main 브랜치만 배포 + +env: + DOCKER_CONTAINER_NAME: coplan-app jobs: - # 환경 체크 단계 분리 warmup: + # 🛡️ 머지된 경우에만 실행 + if: github.event.pull_request.merged == true runs-on: self-hosted timeout-minutes: 3 steps: - name: Environment check run: | - echo "=== System Check ===" + echo "=== Deployment System Check ===" + echo "📋 Merged PR: ${{ github.event.pull_request.title }}" + echo "👤 Author: ${{ github.event.pull_request.user.login }}" + echo "🔄 From: ${{ github.event.pull_request.head.ref }} → ${{ github.event.pull_request.base.ref }}" + echo "📝 Commit: ${{ github.event.pull_request.merge_commit_sha }}" + echo "" + echo "🖥️ System Status:" whoami docker --version - free -h # 메모리 상태 사전 체크 - docker ps # 현재 컨테이너 상태 + free -h + echo "" + echo "🐳 Container Status:" + docker ps deploy: - needs: warmup # ✅ warmup 완료 후 실행 + needs: warmup runs-on: self-hosted timeout-minutes: 10 steps: - name: Checkout code uses: actions/checkout@v4 - # 스크립트 분리 - name: Execute deployment script run: | echo "🚀 Starting deployment..." echo "🔄 Branch: ${{ github.ref_name }}" echo "🔄 Commit: ${{ github.sha }}" + echo "📦 PR: #${{ github.event.pull_request.number }}" - # 단순히 스크립트만 실행 + # deploy.sh 실행 cd /home/ubuntu/coplan chmod +x ./deploy.sh ./deploy.sh - # 헬스체크 - name: Health check run: | echo "🏥 Health checking..." sleep 15 if docker ps | grep -q $DOCKER_CONTAINER_NAME; then - echo "✅ Deployment completed!" + echo "✅ Deployment completed successfully!" + echo "📊 Container status:" + docker ps | grep $DOCKER_CONTAINER_NAME + echo "" + echo "📝 Recent logs:" docker logs --tail 5 $DOCKER_CONTAINER_NAME - echo "🌐 https://coplan.work" # ✅ HTTPS + echo "" + echo "🌐 Service available at: https://coplan.work" else echo "❌ Deployment failed!" - docker logs $DOCKER_CONTAINER_NAME 2>/dev/null || echo "No logs" + echo "🔍 Checking container logs..." + docker logs $DOCKER_CONTAINER_NAME 2>/dev/null || echo "No container logs available" + echo "🔍 Checking system status..." + docker ps -a + free -h exit 1 fi