name: Release on: push: branches: [main] workflow_dispatch: inputs: release_type: description: "Release type" required: true default: "auto" type: choice options: - auto - patch - minor - major env: NODE_VERSION: "18" jobs: # 기존 CI 체크들 quality-checks: name: Quality Checks runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - name: Install dependencies run: npm ci - name: Type check run: npm run type-check - name: Lint run: npm run lint - name: Test run: npm run test:run # 빌드 검증 build-verification: name: Build Verification runs-on: ubuntu-latest needs: quality-checks steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - name: Install dependencies run: npm ci - name: Build web run: npm run build - name: Build mobile (sync only) run: npm run mobile:sync # Linear 이슈 검증 linear-validation: name: Linear Issue Validation runs-on: ubuntu-latest needs: quality-checks if: github.event_name == 'push' steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Validate Linear issues in commits run: | echo "🔍 Checking for Linear issues in recent commits..." # 마지막 릴리즈 이후 커밋들에서 Linear 이슈 추출 COMMITS=$(git log --pretty=format:"%H %s" --since="7 days ago") LINEAR_ISSUES=$(echo "$COMMITS" | grep -oE 'ZEL-[0-9]+' | sort -u || true) if [[ -n "$LINEAR_ISSUES" ]]; then echo "✅ Found Linear issues:" echo "$LINEAR_ISSUES" | sed 's/^/ - /' # 환경 변수로 설정하여 릴리즈에서 사용 echo "LINEAR_ISSUES_FOUND=true" >> $GITHUB_ENV echo "LINEAR_ISSUE_COUNT=$(echo "$LINEAR_ISSUES" | wc -l)" >> $GITHUB_ENV else echo "ℹ️ No Linear issues found in recent commits" echo "LINEAR_ISSUES_FOUND=false" >> $GITHUB_ENV echo "LINEAR_ISSUE_COUNT=0" >> $GITHUB_ENV fi # Semantic Release release: name: Semantic Release runs-on: ubuntu-latest needs: [quality-checks, build-verification] if: github.ref == 'refs/heads/main' outputs: new-release-published: ${{ steps.semantic-release.outputs.new-release-published }} new-release-version: ${{ steps.semantic-release.outputs.new-release-version }} new-release-notes: ${{ steps.semantic-release.outputs.new-release-notes }} steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" - name: Install dependencies run: npm ci - name: Configure Git run: | git config --global user.name "github-actions[bot]" git config --global user.email "github-actions[bot]@users.noreply.github.com" - name: Semantic Release id: semantic-release run: npx semantic-release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} - name: Release Summary if: steps.semantic-release.outputs.new-release-published == 'true' run: | echo "🎉 새로운 릴리즈가 생성되었습니다!" echo "Version: v${{ steps.semantic-release.outputs.new-release-version }}" echo "Release notes: ${{ github.server_url }}/${{ github.repository }}/releases/tag/v${{ steps.semantic-release.outputs.new-release-version }}" # 릴리즈 후 Linear 동기화 post-release-linear: name: Post-Release Linear Sync runs-on: ubuntu-latest needs: release if: needs.release.outputs.new-release-published == 'true' steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: Linear Release Notification run: | echo "🔗 Updating Linear issues for release v${{ needs.release.outputs.new-release-version }}" # Linear 이슈들에 릴리즈 완료 알림 (이미 semantic-release에서 처리됨) echo "✅ Linear integration completed via semantic-release" env: LINEAR_API_KEY: ${{ secrets.LINEAR_API_KEY }} # 배포 알림 deployment-notification: name: Deployment Notification runs-on: ubuntu-latest needs: [release, post-release-linear] if: needs.release.outputs.new-release-published == 'true' steps: - name: Deployment Success Notification run: | echo "🚀 릴리즈 v${{ needs.release.outputs.new-release-version }} 배포 완료" echo "" echo "배포된 내용:" echo "- 웹 애플리케이션: Vercel에 자동 배포" echo "- 모바일 앱: 스토어 배포 대기 중" echo "- Linear 이슈: 릴리즈 완료 알림 전송" echo "" echo "다음 단계:" echo "1. 프로덕션 환경 동작 확인" echo "2. Linear 이슈 상태 확인" echo "3. 사용자 피드백 모니터링" # 릴리즈 실패 시 롤백 준비 rollback-preparation: name: Rollback Preparation runs-on: ubuntu-latest needs: release if: failure() && github.ref == 'refs/heads/main' steps: - name: Rollback Information run: | echo "❌ 릴리즈 프로세스에서 오류가 발생했습니다." echo "" echo "확인 사항:" echo "1. Quality checks 통과 여부" echo "2. Build verification 성공 여부" echo "3. Linear API 연결 상태" echo "4. GitHub token 권한" echo "" echo "복구 방법:" echo "1. 로그에서 정확한 오류 원인 파악" echo "2. 필요시 이전 릴리즈로 수동 롤백" echo "3. 문제 해결 후 재배포"