|
| 1 | +--- |
| 2 | +name: deploy-eatssu |
| 3 | +description: EAT-SSU Android 앱 릴리즈 자동화. 버전 범프, 릴리즈 노트 작성, release 브랜치 생성, PR 생성까지 전체 배포 플로우를 실행한다. "배포", "릴리즈", "release", "deploy", "출시", "버전 올려" 등의 키워드에 반응. |
| 4 | +version: 1.0.0 |
| 5 | +--- |
| 6 | + |
| 7 | +# Deploy EAT-SSU |
| 8 | + |
| 9 | +EAT-SSU Android 앱의 Google Play Store 릴리즈를 자동화하는 스킬. |
| 10 | + |
| 11 | +## 트리거 |
| 12 | + |
| 13 | +사용자가 다음과 같이 요청할 때 이 스킬을 사용한다: |
| 14 | +- "배포해줘", "릴리즈 만들어줘", "출시해줘" |
| 15 | +- "버전 올려줘", "X.Y.Z 버전 만들어줘" |
| 16 | +- "release 브랜치 만들어줘" |
| 17 | +- "deploy", "release", "publish" |
| 18 | + |
| 19 | +## 전제 조건 |
| 20 | + |
| 21 | +- `develop` 브랜치가 최신 상태여야 한다 |
| 22 | +- 새 버전 번호가 필요하다 (사용자 지정 또는 자동 결정) |
| 23 | + |
| 24 | +## 릴리즈 플로우 |
| 25 | + |
| 26 | +### Step 1: 버전 결정 |
| 27 | + |
| 28 | +사용자가 버전을 지정하지 않았으면, 현재 버전을 확인하고 적절한 다음 버전을 제안한다. |
| 29 | + |
| 30 | +```bash |
| 31 | +# 현재 버전 확인 |
| 32 | +grep 'versionName' app/build.gradle.kts | head -1 |
| 33 | +grep 'versionCode' app/build.gradle.kts | head -1 |
| 34 | + |
| 35 | +# 최신 태그 확인 |
| 36 | +git tag --list | sort -V | tail -5 |
| 37 | +``` |
| 38 | + |
| 39 | +버전 규칙: |
| 40 | +- `versionName`: Semantic Versioning (`X.Y.Z`) |
| 41 | +- `versionCode`: 정수, 항상 +1 증가 |
| 42 | +- 태그 형식: `X.Y.Z` (v 접두사 없음) |
| 43 | +- 릴리즈 노트 파일명: `release-notes/v<버전>.yml` (v 접두사 포함) |
| 44 | +→ 태그는 v 없이, 릴리즈 노트 파일명은 v 포함 |
| 45 | + |
| 46 | +### Step 2: 변경사항 파악 |
| 47 | + |
| 48 | +직전 릴리즈 태그 이후의 커밋을 분석한다. |
| 49 | + |
| 50 | +```bash |
| 51 | +# 이전 태그 이후 커밋 목록 (머지 커밋 제외) |
| 52 | +git log <이전태그>..develop --oneline --no-merges |
| 53 | + |
| 54 | +# 변경된 파일 통계 |
| 55 | +git diff <이전태그>..develop --stat |
| 56 | +``` |
| 57 | + |
| 58 | +각 커밋의 의미를 파악하여: |
| 59 | +- 사용자에게 보이는 변경 (Feat, Fix) → 릴리즈 노트에 포함 |
| 60 | +- 내부 변경 (Refactor, CI/CD, Chore) → 릴리즈 노트에서 제외하되 PR 본문에는 포함 |
| 61 | + |
| 62 | +### Step 3: develop 브랜치에서 release 브랜치 생성 |
| 63 | + |
| 64 | +```bash |
| 65 | +git checkout develop |
| 66 | +git pull origin develop |
| 67 | +git checkout -b release/<버전> |
| 68 | +``` |
| 69 | + |
| 70 | +### Step 4: 버전 범프 |
| 71 | + |
| 72 | +`app/build.gradle.kts`의 `defaultConfig` 블록에서: |
| 73 | + |
| 74 | +```kotlin |
| 75 | +versionCode = <기존 + 1> |
| 76 | +versionName = "<새 버전>" |
| 77 | +``` |
| 78 | + |
| 79 | +### Step 5: 릴리즈 노트 작성 |
| 80 | + |
| 81 | +`release-notes/v<버전>.yml` 파일을 생성한다. |
| 82 | + |
| 83 | +형식: |
| 84 | +```yaml |
| 85 | +ko: | |
| 86 | + - 한국어 릴리즈 노트 항목 |
| 87 | +en: | |
| 88 | + - English release note item |
| 89 | +``` |
| 90 | +
|
| 91 | +규칙 (반드시 준수): |
| 92 | +1. 각 항목은 `-`로 시작 |
| 93 | +2. **한국어와 영어 모두 작성 필수** |
| 94 | +3. 개발자 용어 사용 금지 — 사용자 친화적 언어 사용 |
| 95 | +4. 최소 10자 이상의 내용 |
| 96 | +5. CI/CD, 리팩토링 등 사용자에게 보이지 않는 변경은 "앱의 안정성과 성능을 개선했어요" 류로 통합 |
| 97 | +6. 이 내용이 **Google Play Store에 그대로 업로드**됨 (ko → Korea, en → Global) |
| 98 | + |
| 99 | +### Step 6: 커밋 |
| 100 | + |
| 101 | +```bash |
| 102 | +git add app/build.gradle.kts release-notes/v<버전>.yml |
| 103 | +git commit -m "release: <버전>" |
| 104 | +``` |
| 105 | + |
| 106 | +커밋 메시지는 반드시 `release: X.Y.Z` 형식을 사용한다. |
| 107 | + |
| 108 | +### Step 7: 푸시 & PR 생성 |
| 109 | + |
| 110 | +```bash |
| 111 | +git push -u origin release/<버전> |
| 112 | +``` |
| 113 | + |
| 114 | +PR 생성: |
| 115 | +- **base**: `develop` |
| 116 | +- **head**: `release/<버전>` |
| 117 | +- **title**: `release: <버전>` |
| 118 | +- **body**: 아래 템플릿 사용 |
| 119 | + |
| 120 | +```markdown |
| 121 | +## Release <버전> |
| 122 | +
|
| 123 | +### 변경사항 (<이전버전> → <새버전>) |
| 124 | +
|
| 125 | +| 커밋 | 설명 | PR | |
| 126 | +|------|------|----| |
| 127 | +| `<hash>` | <커밋 메시지> | #<PR번호> | |
| 128 | +| ... | ... | ... | |
| 129 | + |
| 130 | +### 릴리즈 노트 (Play Store) |
| 131 | + |
| 132 | +**한국어** |
| 133 | +- <릴리즈 노트 항목들> |
| 134 | + |
| 135 | +**English** |
| 136 | +- <릴리즈 노트 항목들> |
| 137 | + |
| 138 | +### 버전 정보 |
| 139 | +- `versionCode`: <이전> → <새> |
| 140 | +- `versionName`: <이전버전> → <새버전> |
| 141 | +``` |
| 142 | +
|
| 143 | +## PR 머지 후 자동 처리 |
| 144 | +
|
| 145 | +PR이 `develop`에 머지되면 GitHub Actions (`release.yml`)가 자동으로: |
| 146 | + |
| 147 | +1. Fastlane으로 Release AAB 빌드 |
| 148 | +2. Google Play Store `production` 트랙에 배포 |
| 149 | +3. GitHub Release 생성 (태그 + 자동 릴리즈 노트 + AAB 첨부) |
| 150 | +4. Slack 알림 전송 |
| 151 | + |
| 152 | +## 수동 배포 (workflow_dispatch) |
| 153 | + |
| 154 | +GitHub Actions 탭에서 직접 실행도 가능: |
| 155 | +1. Actions → **Production Release** 워크플로우 |
| 156 | +2. **Run workflow** 클릭 |
| 157 | +3. `version`, `track` (internal/alpha/beta/production), `release_notes` 입력 |
| 158 | + |
| 159 | +## 주의사항 |
| 160 | + |
| 161 | +- **절대 `main`/`master`에 직접 푸시하지 않는다** — 항상 PR을 통해 머지 |
| 162 | +- 릴리즈 노트 YAML 파일이 없거나 내용이 부족하면 Play Store 배포가 실패할 수 있다 |
| 163 | +- `versionCode`는 Play Store에서 고유해야 하므로 **반드시 증가**시킨다 |
| 164 | +- GitHub Secrets가 올바르게 설정되어 있어야 CI/CD가 동작한다 |
0 commit comments