project-auto-wizard 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/bin/project-auto-wizard.js +19 -0
  4. package/package.json +36 -0
  5. package/payload/coderabbit.yaml +19 -0
  6. package/payload/config/breaking-changes.json +1 -0
  7. package/payload/config/wizard-prompts.yml +62 -0
  8. package/payload/scripts/changelog_manager.py +726 -0
  9. package/payload/scripts/version_manager.py +617 -0
  10. package/payload/version.yml.template +48 -0
  11. package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +303 -0
  12. package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +293 -0
  13. package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +289 -0
  14. package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +192 -0
  15. package/payload/workflows/common/secret-backup/PROJECT-COMMON-SECRET-FILE-UPLOAD.yaml +209 -0
  16. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +591 -0
  17. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +700 -0
  18. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +308 -0
  19. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +992 -0
  20. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +689 -0
  21. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +987 -0
  22. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +471 -0
  23. package/payload/workflows/flutter/PROJECT-FLUTTER-SUH-LAB-APP-BUILD-TRIGGER.yaml +500 -0
  24. package/payload/workflows/next/PROJECT-NEXT-CI.yaml +185 -0
  25. package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +271 -0
  26. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +81 -0
  27. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +2191 -0
  28. package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +386 -0
  29. package/payload/workflows/react/PROJECT-REACT-CI.yaml +194 -0
  30. package/payload/workflows/react/PROJECT-REACT-CICD.yaml +255 -0
  31. package/payload/workflows/spring/PROJECT-SPRING-GITHUB-PACKAGES-PUBLISH.yml +84 -0
  32. package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-CI.yml +316 -0
  33. package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-PUBLISH.yml +58 -0
  34. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +535 -0
  35. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +437 -0
  36. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +2277 -0
  37. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +425 -0
  38. package/src/cli/args.js +95 -0
  39. package/src/cli/help.js +27 -0
  40. package/src/commands/full.js +53 -0
  41. package/src/commands/interactive.js +276 -0
  42. package/src/commands/revert.js +60 -0
  43. package/src/commands/version.js +31 -0
  44. package/src/commands/workflows.js +49 -0
  45. package/src/context.js +26 -0
  46. package/src/core/assets.js +47 -0
  47. package/src/core/branches.js +60 -0
  48. package/src/core/branding.js +15 -0
  49. package/src/core/breaking-check.js +65 -0
  50. package/src/core/breaking.js +26 -0
  51. package/src/core/copy/coderabbit.js +26 -0
  52. package/src/core/copy/gitignore.js +55 -0
  53. package/src/core/copy/readme.js +30 -0
  54. package/src/core/copy/simple.js +23 -0
  55. package/src/core/copy/workflows.js +233 -0
  56. package/src/core/detect-fs.js +106 -0
  57. package/src/core/detect.js +62 -0
  58. package/src/core/fsutil.js +46 -0
  59. package/src/core/options-ask.js +99 -0
  60. package/src/core/paths-resolve.js +261 -0
  61. package/src/core/paths.js +16 -0
  62. package/src/core/version-yml.js +190 -0
  63. package/src/core/wizard-env.js +101 -0
  64. package/src/core/wizard-labels.js +107 -0
  65. package/src/index.js +162 -0
  66. package/src/ui/ansi.js +26 -0
  67. package/src/ui/banner.js +29 -0
  68. package/src/ui/env-plan.js +207 -0
  69. package/src/ui/prompts.js +99 -0
  70. package/src/ui/readline-engine.js +257 -0
  71. package/src/ui/status-cards.js +56 -0
  72. package/src/ui/summary.js +127 -0
@@ -0,0 +1,308 @@
1
+ # ===================================================================
2
+ # Flutter Android 자체 서버(SMB) 배포 워크플로우
3
+ # ===================================================================
4
+ #
5
+ # {{MAIN_BRANCH}} 브랜치 푸시 시 Android APK를 빌드하고
6
+ # 자체 서버(예: Synology NAS·NAS·Linux)의 SMB 공유에 APK를 배포합니다.
7
+ #
8
+ # ===================================================================
9
+ # 🔑 필수 GitHub Secrets
10
+ # ===================================================================
11
+ # ENV_FILE 또는 ENV: .env 파일 내용 (둘 중 하나, ENV_FILE 우선)
12
+ # RELEASE_KEYSTORE_BASE64: 서명용 keystore (base64)
13
+ # RELEASE_KEYSTORE_PASSWORD: keystore 비밀번호
14
+ # RELEASE_KEY_ALIAS: key alias
15
+ # RELEASE_KEY_PASSWORD: key 비밀번호
16
+ # GOOGLE_SERVICES_JSON (선택): Firebase google-services.json
17
+ # SERVER_HOST: 서버 호스트(SMB 접속 주소)
18
+ # SERVER_USER: SMB 사용자명
19
+ # SERVER_PASSWORD: SMB 비밀번호
20
+ # ===================================================================
21
+
22
+ name: PROJECT-Android-SelfHosted-CICD
23
+
24
+ on:
25
+ push:
26
+ branches: ["{{MAIN_BRANCH}}"]
27
+ workflow_dispatch: # 수동 실행 옵션 추가
28
+
29
+ # ============================================
30
+ # 🔧 프로젝트별 설정 (아래 값들을 수정하세요)
31
+ # ============================================
32
+ env:
33
+ # 프로젝트 이름 (APK 파일명, 아티팩트명, 히스토리 파일명에 사용)
34
+ APP_ARTIFACT_NAME: "__APP_ARTIFACT_NAME__" # @wizard ask:@repo
35
+ FLUTTER_VERSION: "3.35.5"
36
+ JAVA_VERSION: "__JAVA_VERSION__" # @wizard ask:17
37
+ # SMB 서버 설정 (자체 서버 — Synology NAS·Linux 등)
38
+ SMB_PORT: "44445" # 기본 445
39
+ SMB_SHARE: "web"
40
+ SMB_PATH_IOS: "/your-project/ios/download" # SMB 경로: /{APP_ARTIFACT_NAME}/ios/download 형식으로 사용
41
+ jobs:
42
+ build-android:
43
+ name: Build Android APK
44
+ runs-on: ubuntu-latest
45
+ # CHANGELOG 워크플로우가 성공한 경우에만 실행
46
+ if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name != 'workflow_run' }}
47
+
48
+ steps:
49
+ # Repository 체크아웃 및 목록 출력
50
+ - name: Check out repository
51
+ uses: actions/checkout@v5
52
+ with:
53
+ fetch-depth: 0
54
+
55
+ - name: List repository contents
56
+ run: |
57
+ echo "Repository checked out"
58
+ ls -la
59
+
60
+ # Debug Keystore 설정 (디버깅 용도 유지)
61
+ - name: Setup Debug Keystore
62
+ run: |
63
+ mkdir -p ~/.android
64
+ echo "${{ secrets.DEBUG_KEYSTORE }}" | base64 -d > ~/.android/debug.keystore || echo "Base64 decoding failed"
65
+ echo "Debug Keystore created (for debugging)"
66
+ ls -la ~/.android/
67
+ keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android || echo "Keytool failed"
68
+
69
+ # .env 파일 생성
70
+ - name: Create .env file from GitHub Secret
71
+ env:
72
+ ENV_CONTENT: ${{ secrets.ENV_FILE || secrets.ENV }}
73
+ run: |
74
+ printf '%s\n' "$ENV_CONTENT" > .env
75
+ echo ".env file created"
76
+ ls -la
77
+
78
+ # Keystore와 key.properties 설정
79
+ - name: Setup Keystore and key.properties
80
+ run: |
81
+ mkdir -p android/app/keystore
82
+ echo "${{ secrets.DEBUG_KEYSTORE }}" | base64 -d > android/app/keystore/key.jks || echo "Base64 decoding failed"
83
+ echo "Keystore created from DEBUG_KEYSTORE"
84
+ ls -la android/app/keystore
85
+ echo "storeFile=app/keystore/key.jks" > android/key.properties
86
+ echo "storePassword=android" >> android/key.properties
87
+ echo "keyAlias=androiddebugkey" >> android/key.properties
88
+ echo "keyPassword=android" >> android/key.properties
89
+ echo "key.properties created"
90
+ ls -la android/
91
+
92
+ # Google-services.json 생성
93
+ - name: Create Google-services.json
94
+ run: |
95
+ cat << 'EOF' > android/app/google-services.json
96
+ ${{ secrets.GOOGLE_SERVICES_JSON }}
97
+ EOF
98
+ echo "✅ Google-services.json 생성 완료"
99
+ ls -la android/app/
100
+
101
+ # Flutter 설정 및 버전 확인
102
+ - name: Set up Flutter
103
+ uses: subosito/flutter-action@v2
104
+ with:
105
+ flutter-version: ${{ env.FLUTTER_VERSION }}
106
+ cache: true
107
+ cache-key: flutter-${{ runner.os }}-${{ env.FLUTTER_VERSION }}
108
+
109
+ - name: Verify Flutter version
110
+ run: |
111
+ echo "Flutter setup completed"
112
+ flutter --version
113
+
114
+ # Flutter 및 Gradle 캐시
115
+ - name: Cache Flutter dependencies
116
+ uses: actions/cache@v4
117
+ with:
118
+ path: ~/.pub-cache
119
+ key: ${{ runner.os }}-flutter-pub-${{ hashFiles('**/pubspec.lock') }}
120
+ restore-keys: ${{ runner.os }}-flutter-pub-
121
+
122
+ - name: Cache Gradle dependencies
123
+ uses: actions/cache@v4
124
+ with:
125
+ path: |
126
+ ~/.gradle/caches
127
+ ~/.gradle/wrapper
128
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/build.gradle', '**/gradle-wrapper.properties') }}
129
+ restore-keys: |
130
+ ${{ runner.os }}-gradle-
131
+
132
+ # 프로젝트 의존성 설치
133
+ - name: Install dependencies
134
+ run: |
135
+ flutter pub get
136
+ echo "Dependencies installed"
137
+ ls -la
138
+
139
+ # Gradle 셋업
140
+ - name: Setup Gradle
141
+ working-directory: android
142
+ run: |
143
+ chmod +x gradlew
144
+ echo "Gradle wrapper permissions set"
145
+
146
+ # Java 설정 및 버전 확인
147
+ - name: Set up Java
148
+ uses: actions/setup-java@v3
149
+ with:
150
+ distribution: "temurin"
151
+ java-version: ${{ env.JAVA_VERSION }}
152
+
153
+ - name: Verify Java version
154
+ run: |
155
+ echo "Java setup completed"
156
+ java -version
157
+
158
+ # Ruby 설정 및 확인
159
+ - name: Set up Ruby
160
+ uses: ruby/setup-ruby@v1
161
+ with:
162
+ ruby-version: "3.4.1"
163
+
164
+ - name: Verify Ruby version
165
+ run: |
166
+ echo "Ruby setup completed"
167
+ ruby -v
168
+
169
+ # Fastlane 설치 (Bundler 방식 - gem 충돌 방지)
170
+ - name: Install Fastlane
171
+ working-directory: android
172
+ run: |
173
+ # multi_json: google-apis transitive 의존성이 선언 누락한 upstream 버그 회피 (gemspec 미선언 → Gem::LoadError)
174
+ printf 'source "https://rubygems.org"\ngem "fastlane"\ngem "multi_json"\n' > Gemfile
175
+ bundle install
176
+ echo "Fastlane installed (Bundler)"
177
+ bundle exec fastlane --version
178
+
179
+ # 현재 버전 정보 및 짧은 커밋 해시 계산
180
+ - name: Get version info and calculate short commit hash
181
+ id: version_info
182
+ run: |
183
+ CURRENT_VERSION=$(grep 'version:' pubspec.yaml | sed 's/version: //' | tr -d ' ')
184
+ VERSION=$(echo $CURRENT_VERSION | cut -d'+' -f1)
185
+ BUILD_NUMBER=$(echo $CURRENT_VERSION | cut -d'+' -f2)
186
+ SHORT_COMMIT_HASH=$(echo ${{ github.sha }} | cut -c1-7)
187
+
188
+ echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV
189
+ echo "VERSION=$VERSION" >> $GITHUB_ENV
190
+ echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITHUB_ENV
191
+ echo "SHORT_COMMIT_HASH=$SHORT_COMMIT_HASH" >> $GITHUB_ENV
192
+
193
+ echo "현재 버전: $CURRENT_VERSION"
194
+ echo "짧은 커밋 해시: $SHORT_COMMIT_HASH"
195
+
196
+ # Fastlane을 이용하여 APK 빌드 (릴리스 빌드 유지)
197
+ - name: Build APK with Fastlane
198
+ run: |
199
+ cd android
200
+ bundle exec fastlane build --verbose
201
+ ls -la ../build/app/outputs/flutter-apk/ || true
202
+ echo "APK built with Fastlane"
203
+
204
+ # APK 파일 이름 변경 및 준비
205
+ - name: Rename and Prepare APK
206
+ run: |
207
+ mkdir -p ./android/app/build/outputs/apk/release/
208
+ mv ./build/app/outputs/flutter-apk/app-release.apk ./android/app/build/outputs/apk/release/${{ env.APP_ARTIFACT_NAME }}-v${{ env.VERSION }}-${{ env.SHORT_COMMIT_HASH }}.apk
209
+ echo "APK renamed to ${{ env.APP_ARTIFACT_NAME }}-v${{ env.VERSION }}-${{ env.SHORT_COMMIT_HASH }}.apk"
210
+ ls -la ./android/app/build/outputs/apk/release/
211
+
212
+ # APK를 아티팩트로 업로드
213
+ - name: Upload APK as Artifact
214
+ uses: actions/upload-artifact@v4
215
+ with:
216
+ name: ${{ env.APP_ARTIFACT_NAME }}-apk
217
+ path: ./android/app/build/outputs/apk/release/${{ env.APP_ARTIFACT_NAME }}-v${{ env.VERSION }}-${{ env.SHORT_COMMIT_HASH }}.apk
218
+ retention-days: 1
219
+
220
+ deploy-android:
221
+ name: Deploy Android APK
222
+ runs-on: ubuntu-latest
223
+ needs: build-android
224
+ if: github.ref == 'refs/heads/{{MAIN_BRANCH}}'
225
+
226
+ steps:
227
+ - name: Checkout code
228
+ uses: actions/checkout@v5
229
+
230
+ - name: List repository contents for deploy
231
+ run: |
232
+ echo "Repository checked out for deploy"
233
+ ls -la
234
+
235
+ - name: Install dependencies
236
+ run: |
237
+ sudo apt-get update
238
+ sudo apt-get install -y smbclient jq
239
+ echo "SMB and jq dependencies installed"
240
+
241
+ - name: Download build artifacts
242
+ uses: actions/download-artifact@v4
243
+ with:
244
+ name: ${{ env.APP_ARTIFACT_NAME }}-apk
245
+ path: android/app/build/outputs/
246
+
247
+ - name: List downloaded structure (Debug)
248
+ run: |
249
+ ls -alR android/app/build/outputs
250
+ echo "Downloaded structure listed"
251
+
252
+ - name: Find APK file
253
+ run: |
254
+ APK_FILE=$(find android/app/build/outputs/ -name "*.apk" | head -n 1)
255
+ echo "APK_FILE=$APK_FILE" >> $GITHUB_ENV
256
+ APK_NAME=$(basename "$APK_FILE")
257
+ echo "APK_NAME=$APK_NAME" >> $GITHUB_ENV
258
+ echo "APK file found: $APK_FILE"
259
+
260
+ - name: Upload files to server via SMB
261
+ env:
262
+ SMB_USERNAME: ${{ secrets.SERVER_USER }}
263
+ SMB_PASSWORD: ${{ secrets.SERVER_PASSWORD }}
264
+ run: |
265
+ SMB_SERVER=${{ secrets.SERVER_HOST }}
266
+ SMB_PORT=${{ env.SMB_PORT }}
267
+ SMB_SHARE=${{ env.SMB_SHARE }}
268
+ SMB_PATH="/${{ env.APP_ARTIFACT_NAME }}${{ env.SMB_PATH_ANDROID }}"
269
+ echo "Uploading APK file ${{ env.APK_NAME }} to SMB..."
270
+ echo "SMB Path: $SMB_PATH"
271
+ smbclient "//$SMB_SERVER/$SMB_SHARE" -p "$SMB_PORT" -U "$SMB_USERNAME%$SMB_PASSWORD" -m SMB3 -d 10 -c "mkdir $SMB_PATH; cd $SMB_PATH; put ${{ env.APK_FILE }} ${{ env.APK_NAME }}"
272
+ echo "APK uploaded to SMB"
273
+
274
+ - name: Update CICD history JSON
275
+ env:
276
+ SMB_USERNAME: ${{ secrets.SERVER_USER }}
277
+ SMB_PASSWORD: ${{ secrets.SERVER_PASSWORD }}
278
+ run: |
279
+ export TZ='Asia/Seoul'
280
+ BUILD_DATE=$(date +"%Y-%m-%d %H:%M")
281
+ FILE_SIZE=$(stat -c%s "${{ env.APK_FILE }}")
282
+ COMMIT_LINK="https://github.com/${{ github.repository }}/commit/${{ github.sha }}"
283
+ FULL_COMMIT_HASH="${{ github.sha }}"
284
+ HISTORY_FILE="${{ env.APP_ARTIFACT_NAME }}-android-cicd-history.json"
285
+
286
+ NEW_BUILD_INFO=$(jq -n \
287
+ --arg apk_name "${{ env.APK_NAME }}" \
288
+ --arg file_size "$FILE_SIZE" \
289
+ --arg build_date "$BUILD_DATE" \
290
+ --arg commit_link "$COMMIT_LINK" \
291
+ --arg full_commit_hash "$FULL_COMMIT_HASH" \
292
+ '{apk_name: $apk_name, file_size: $file_size, build_date: $build_date, commit_link: $commit_link, full_commit_hash: $full_commit_hash}')
293
+
294
+ SMB_SERVER=${{ secrets.SERVER_HOST }}
295
+ SMB_PORT=${{ env.SMB_PORT }}
296
+ SMB_SHARE=${{ env.SMB_SHARE }}
297
+ SMB_PATH="/${{ env.APP_ARTIFACT_NAME }}${{ env.SMB_PATH_ANDROID }}"
298
+
299
+ smbclient "//$SMB_SERVER/$SMB_SHARE" -p "$SMB_PORT" -U "$SMB_USERNAME%$SMB_PASSWORD" -m SMB3 -d 10 -c "cd $SMB_PATH; get $HISTORY_FILE" || echo '{"files": []}' > $HISTORY_FILE
300
+ echo "Downloaded or initialized $HISTORY_FILE"
301
+ cat $HISTORY_FILE
302
+
303
+ jq --argjson new_build "$NEW_BUILD_INFO" '.files += [$new_build]' $HISTORY_FILE > updated.json
304
+ echo "Updated $HISTORY_FILE with new build info"
305
+ cat updated.json
306
+
307
+ smbclient "//$SMB_SERVER/$SMB_SHARE" -p "$SMB_PORT" -U "$SMB_USERNAME%$SMB_PASSWORD" -m SMB3 -d 10 -c "cd $SMB_PATH; put updated.json $HISTORY_FILE"
308
+ echo "Updated $HISTORY_FILE uploaded to SMB"