project-auto-wizard 0.11.0 → 0.12.1

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 (78) hide show
  1. package/README.md +24 -21
  2. package/package.json +2 -2
  3. package/payload/config/breaking-changes.json +1 -1
  4. package/payload/scripts/__pycache__/changelog_manager.cpython-314.pyc +0 -0
  5. package/payload/scripts/__pycache__/issue_helper.cpython-314.pyc +0 -0
  6. package/payload/scripts/__pycache__/version_manager.cpython-314.pyc +0 -0
  7. package/payload/scripts/changelog_manager.py +84 -31
  8. package/payload/scripts/version_manager.py +2 -2
  9. package/payload/version.yml.template +4 -2
  10. package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +30 -10
  11. package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +37 -12
  12. package/payload/workflows/common/PROJECT-COMMON-ISSUE-HELPER.yaml +3 -6
  13. package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +0 -12
  14. package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +27 -6
  15. package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +3 -7
  16. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +7 -34
  17. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +2 -25
  18. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +2 -20
  19. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +5 -30
  20. package/payload/workflows/flutter/PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml +0 -4
  21. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +7 -51
  22. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +5 -29
  23. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +9 -29
  24. package/payload/workflows/go/PROJECT-GO-CI.yaml +5 -28
  25. package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +19 -99
  26. package/payload/workflows/go/PROJECT-GO-SIMPLE-CICD.yaml +18 -89
  27. package/payload/workflows/next/PROJECT-NEXT-CI.yaml +11 -41
  28. package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +9 -45
  29. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +1 -27
  30. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +14 -97
  31. package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +14 -92
  32. package/payload/workflows/react/PROJECT-REACT-CI.yaml +11 -40
  33. package/payload/workflows/react/PROJECT-REACT-CICD.yaml +9 -43
  34. package/payload/workflows/spring/{nexus/PROJECT-SPRING-NEXUS-CI.yml → PROJECT-SPRING-CI.yml} +2 -25
  35. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +19 -63
  36. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +19 -59
  37. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +23 -86
  38. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +20 -80
  39. package/src/cli/args.js +8 -15
  40. package/src/cli/help.js +2 -3
  41. package/src/commands/doctor.js +9 -8
  42. package/src/commands/dry-run.js +1 -1
  43. package/src/commands/full.js +9 -10
  44. package/src/commands/interactive-flutter.js +1 -1
  45. package/src/commands/interactive.js +34 -46
  46. package/src/commands/purge.js +2 -2
  47. package/src/commands/status.js +5 -6
  48. package/src/commands/uninstall.js +3 -4
  49. package/src/context.js +5 -6
  50. package/src/core/assets.js +2 -2
  51. package/src/core/baseline.js +1 -1
  52. package/src/core/branches.js +3 -3
  53. package/src/core/breaking-check.js +1 -1
  54. package/src/core/breaking.js +1 -1
  55. package/src/core/copy/flutter-app.js +2 -2
  56. package/src/core/copy/gitignore.js +8 -8
  57. package/src/core/copy/workflows.js +24 -69
  58. package/src/core/deploy-style.js +2 -2
  59. package/src/core/detect-fs.js +11 -11
  60. package/src/core/detect.js +7 -7
  61. package/src/core/flutter-options.js +1 -1
  62. package/src/core/installed-stores.js +1 -1
  63. package/src/core/logger.js +1 -1
  64. package/src/core/paths-resolve.js +1 -1
  65. package/src/core/removal-plan.js +4 -4
  66. package/src/core/verify.js +4 -4
  67. package/src/core/version-yml.js +27 -34
  68. package/src/core/wizard-env.js +4 -4
  69. package/src/index.js +14 -14
  70. package/src/ui/banner.js +2 -2
  71. package/src/ui/env-plan.js +10 -16
  72. package/src/ui/prompts.js +9 -14
  73. package/src/ui/status-cards.js +10 -12
  74. package/src/ui/summary.js +13 -13
  75. package/payload/workflows/common/secret-backup/PROJECT-COMMON-SECRET-FILE-UPLOAD.yaml +0 -210
  76. package/payload/workflows/spring/nexus/PROJECT-SPRING-GITHUB-PACKAGES-PUBLISH.yml +0 -92
  77. package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-PUBLISH.yml +0 -70
  78. package/src/core/options-ask.js +0 -102
@@ -1,7 +1,5 @@
1
1
  # project-auto-wizard:managed-workflow
2
- # ===================================================================
3
2
  # Flutter iOS TestFlight 자동 배포 워크플로우
4
- # ===================================================================
5
3
  #
6
4
  # 이 워크플로우는 Flutter iOS 앱을 빌드하여 TestFlight에 자동 배포합니다.
7
5
  #
@@ -14,30 +12,26 @@
14
12
  # 3. xcodebuild -exportArchive (IPA 생성, ExportOptions.plist 사용)
15
13
  # 4. fastlane deploy (ios/fastlane/Fastfile 사용, DEPLOY_MODE에 따라 TestFlight/심사 제출)
16
14
  #
17
- # ===================================================================
18
- # 🔑 필수 GitHub Secrets
19
- # ===================================================================
15
+ # 필수 GitHub Secrets
20
16
  #
21
- # 🔐 Apple 인증서 & 프로비저닝 프로파일:
17
+ # Apple 인증서 & 프로비저닝 프로파일:
22
18
  # APPLE_CERTIFICATE_BASE64: .p12 인증서 (base64 인코딩)
23
19
  # APPLE_CERTIFICATE_PASSWORD: .p12 인증서 비밀번호
24
20
  # APPLE_PROVISIONING_PROFILE_BASE64: .mobileprovision 파일 (base64 인코딩)
25
21
  # IOS_PROVISIONING_PROFILE_NAME: 프로비저닝 프로파일 이름
26
22
  #
27
- # 🔑 App Store Connect API:
23
+ # App Store Connect API:
28
24
  # APP_STORE_CONNECT_API_KEY_ID: API Key ID (10자리)
29
25
  # APP_STORE_CONNECT_ISSUER_ID: Issuer ID (UUID 형식)
30
26
  # APP_STORE_CONNECT_API_KEY_BASE64: AuthKey_XXXXXX.p8 파일 (base64 인코딩)
31
27
  # IOS_BUNDLE_ID (Secret 우선, 없으면 Variable): 앱 번들 ID —
32
28
  # store_prepare/store_submit을 쓰면 필수(비어 있으면 Fastfile이 명확한 오류로 중단)
33
29
  #
34
- # 📝 환경 설정 (선택):
30
+ # 환경 설정 (선택):
35
31
  # ENV_FILE (선택): .env 파일 내용
36
32
  # SECRETS_XCCONFIG (선택): ios/Flutter/Secrets.xcconfig 내용
37
33
  #
38
- # ===================================================================
39
- # 🛠️ 초기 설정 방법
40
- # ===================================================================
34
+ # 초기 설정 방법
41
35
  #
42
36
  # 1. GitHub Secrets 설정 (위 목록 참고)
43
37
  #
@@ -46,8 +40,6 @@
46
40
  # git commit -m "chore: iOS TestFlight 배포 설정"
47
41
  #
48
42
  # 3. {{MAIN_BRANCH}} 브랜치로 푸시하여 배포 시작
49
- #
50
- # ===================================================================
51
43
 
52
44
  name: PROJECT-iOS-TestFlight-Deploy
53
45
 
@@ -67,9 +59,7 @@ on:
67
59
  - store_prepare
68
60
  - store_submit
69
61
 
70
- # ============================================
71
- # 🔧 프로젝트별 설정 (아래 값들을 수정하세요)
72
- # ============================================
62
+ # 프로젝트별 설정 (아래 값들을 수정하세요)
73
63
  env:
74
64
  FLUTTER_PROJECT_DIR: "." # @wizard auto:flutter-root
75
65
  # 환경변수 전달 방식 (dart-define | dotenv) — 설치 시 선택값으로 자동 설정
@@ -78,20 +68,14 @@ env:
78
68
  XCODE_VERSION: "26.0"
79
69
  PROJECT_TYPE: "flutter"
80
70
 
81
- # ============================================
82
- # 📝 환경 파일 설정
83
- # ============================================
71
+ # 환경 파일 설정
84
72
  # dotenv 모드에서 .env 파일을 만들 경로 (Flutter 루트 기준)
85
73
  ENV_FILE_PATH: ".env"
86
74
 
87
- # ============================================
88
- # 📝 TestFlight Changelog 설정
89
- # ============================================
75
+ # TestFlight Changelog 설정
90
76
  SKIP_WAITING_FOR_BUILD_PROCESSING: "false"
91
77
 
92
- # ============================================
93
- # 📝 배포 모드 (store_only | store_prepare | store_submit)
94
- # ============================================
78
+ # 배포 모드 (store_only | store_prepare | store_submit)
95
79
  DEPLOY_MODE: ${{ github.event.inputs.deploy_mode || vars.IOS_DEPLOY_MODE || 'store_only' }} # @wizard fallback:ios-deploy-mode
96
80
 
97
81
  jobs:
@@ -230,9 +214,7 @@ jobs:
230
214
  retention-days: 1
231
215
  if-no-files-found: error
232
216
 
233
- # ============================================
234
217
  # iOS 빌드 (xcodebuild 직접 사용)
235
- # ============================================
236
218
  build-ios:
237
219
  name: iOS 앱 빌드
238
220
  runs-on: macos-26
@@ -392,9 +374,7 @@ jobs:
392
374
  retention-days: 1
393
375
  if-no-files-found: error
394
376
 
395
- # ============================================
396
377
  # TestFlight 배포 (ios/fastlane/Fastfile 사용)
397
- # ============================================
398
378
  deploy-testflight:
399
379
  name: TestFlight 배포
400
380
  runs-on: macos-26
@@ -1,20 +1,11 @@
1
1
  # project-auto-wizard:managed-workflow
2
- # ===================================================================
3
2
  # Go 빌드 검증 워크플로우 (CI Only)
4
- # ===================================================================
5
- #
6
- # 설명:
7
3
  # - {{DEVELOP_BRANCH}} 브랜치에 push/PR 시 go build/vet/test/lint로 검증
8
4
  # - Dockerfile이 필요 없어 CLI 도구·라이브러리 등 배포하지 않는 Go 프로젝트도 사용 가능
9
5
  # - go.mod의 go 지시자 버전을 자동으로 사용 (버전 하드코딩 없음)
10
- #
11
- # ===================================================================
12
6
 
13
7
  name: PROJECT-GO-CI
14
8
 
15
- # ===================================================================
16
- # 트리거 설정
17
- # ===================================================================
18
9
  on:
19
10
  push:
20
11
  branches:
@@ -24,9 +15,6 @@ on:
24
15
  - "{{DEVELOP_BRANCH}}" # {{DEVELOP_BRANCH}} 브랜치로의 PR 시 빌드 검증
25
16
  workflow_dispatch: # 수동 실행 허용
26
17
 
27
- # ===================================================================
28
- # 환경 변수 설정
29
- # ===================================================================
30
18
  env:
31
19
  # 프로젝트 고유 식별자
32
20
  PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
@@ -34,9 +22,7 @@ env:
34
22
  PROJECT_PATH: "." # @wizard auto:project-path
35
23
 
36
24
  jobs:
37
- # ===================================================================
38
25
  # 변경 감지 (모노레포에서 이 프로젝트 경로가 바뀌었는지 판별)
39
- # ===================================================================
40
26
  changes:
41
27
  name: 변경 감지
42
28
  runs-on: ubuntu-latest
@@ -58,9 +44,7 @@ jobs:
58
44
  project:
59
45
  - '${{ env.PROJECT_PATH == '.' && '**' || format('{0}/**', env.PROJECT_PATH) }}'
60
46
 
61
- # ===================================================================
62
- # 빌드 검증 작업
63
- # ===================================================================
47
+ # Job: 빌드 검증
64
48
  build-check:
65
49
  name: Go 빌드 검증
66
50
  runs-on: ubuntu-latest
@@ -68,37 +52,32 @@ jobs:
68
52
  if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.project == 'true' }}
69
53
 
70
54
  steps:
71
- # 1. 소스코드 체크아웃
72
55
  - name: 코드 체크아웃
73
56
  uses: actions/checkout@v7
74
57
 
75
- # 2. Go 툴체인 설정 (go.mod의 go 지시자 버전 자동 사용)
58
+ # go.mod의 go 지시자 버전 자동 사용
76
59
  - name: Go 설정
77
60
  uses: actions/setup-go@v7
78
61
  with:
79
62
  go-version-file: go.mod
80
63
  cache: true
81
64
 
82
- # 3. 빌드 검증
83
65
  - name: go build 검증
84
66
  run: go build ./...
85
67
 
86
- # 4. 정적 분석
87
68
  - name: go vet 검증
88
69
  run: go vet ./...
89
70
 
90
- # 5. 테스트 실행
91
71
  - name: go test 실행
92
72
  run: go test ./...
93
73
 
94
- # 6. 린트 (v8은 golangci-lint v2 계열을 요구 — .golangci.yml이 v1 형식이면
95
- # 프로젝트에서 별도 조정 필요. version: latest는 v2 최신 패치를 자동으로 받는다)
74
+ # golangci-lint v8은 golangci-lint v2 계열을 요구 — .golangci.yml이 v1 형식이면
75
+ # 프로젝트에서 별도 조정 필요. version: latest는 v2 최신 패치를 자동으로 받는다
96
76
  - name: golangci-lint
97
77
  uses: golangci/golangci-lint-action@v8
98
78
  with:
99
79
  version: latest
100
80
 
101
- # 7. 빌드 검증 완료 메시지
102
81
  - name: 빌드 검증 완료
103
82
  run: |
104
83
  echo "✅ Go 빌드 검증이 성공적으로 완료되었습니다!"
@@ -109,9 +88,7 @@ jobs:
109
88
  echo " 📝 커밋: ${{ github.sha }}"
110
89
  echo " ⏰ 검증 시간: $(date '+%Y-%m-%d %H:%M:%S')"
111
90
 
112
- # ===================================================================
113
- # CI Gate (required check로 등록할 단일 job)
114
- # ===================================================================
91
+ # Job: CI Gate (required check로 등록할 단일 job)
115
92
  ci-gate:
116
93
  name: CI Gate
117
94
  if: ${{ always() }}
@@ -1,42 +1,30 @@
1
1
  # project-auto-wizard:managed-workflow
2
- # ===================================================================
3
2
  # Go PR Preview (SSH + Docker + Traefik)
4
- # ===================================================================
3
+ # PR 또는 Issue 코멘트 명령어를 통해 Preview 환경을 자동으로 관리합니다. Traefik 리버스 프록시로 동적 라우팅됩니다.
5
4
  #
6
- # PR 또는 Issue 코멘트 명령어를 통해 Preview 환경을 자동으로 관리합니다.
7
- # Traefik 리버스 프록시를 통해 동적 라우팅됩니다.
8
- #
9
- # ===================================================================
10
- # 🔑 필수 GitHub Secrets
11
- # ===================================================================
5
+ # 필수 GitHub Secrets
12
6
  # ENV_FILE: .env 파일 전체 내용
13
- # DOCKERHUB_USERNAME: Docker Hub 사용자명
14
- # DOCKERHUB_TOKEN: Docker Hub 액세스 토큰
15
- # SERVER_HOST: 서버 호스트(SSH 접속 주소)
16
- # SERVER_USER: SSH 사용자명
7
+ # DOCKERHUB_USERNAME / DOCKERHUB_TOKEN: Docker Hub 사용자명 / 액세스 토큰
8
+ # SERVER_HOST / SERVER_USER: 서버 호스트(SSH 접속 주소) / SSH 사용자명
17
9
  # SERVER_PASSWORD: SSH 비밀번호 (SSH_AUTH_METHOD=password일 때)
18
10
  # SSH_KEY: SSH 개인키 .pem 내용 (SSH_AUTH_METHOD=key일 때, AWS EC2 등)
19
- # ===================================================================
20
11
  #
21
- # 🚀 사용법:
12
+ # 사용법
22
13
  # /wizard server build - Preview 빌드 및 배포
23
14
  # /wizard server destroy - Preview 환경 삭제
24
15
  # /wizard server status - 현재 상태 확인
25
16
  #
26
- # 📊 리소스 네이밍:
17
+ # 리소스 네이밍
27
18
  # - 컨테이너: {PROJECT_NAME}-pr-{번호}
28
19
  # - 도메인: {PROJECT_NAME}-pr-{번호}.pr.example.com
29
20
  #
30
- # 📋 사전 요구사항:
21
+ # 사전 요구사항
31
22
  # - Traefik 컨테이너 실행 중 (traefik-network)
32
23
  # - 와일드카드 DNS 설정: *.pr.example.com → 서버
33
- # ===================================================================
34
24
 
35
25
  name: PROJECT-GO-PR-PREVIEW
36
26
 
37
- # ===================================================================
38
- # ⚠️ [영역 1] 프로젝트별 설정 - 다른 프로젝트에서 사용 시 이 섹션만 수정하세요
39
- # ===================================================================
27
+ # [영역 1] 프로젝트별 설정 - 다른 프로젝트에서 사용 시 이 섹션만 수정하세요
40
28
  env:
41
29
  # 프로젝트 고유 식별자 (컨테이너명, 이미지명, 도메인에 사용)
42
30
  PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
@@ -45,7 +33,7 @@ env:
45
33
  DOCKERFILE_PATH: './Dockerfile'
46
34
  INTERNAL_PORT: '8080'
47
35
 
48
- # 🗂️ 볼륨 마운트 설정 (프로젝트별 수정 필요, 빈값이면 마운트 안함)
36
+ # 볼륨 마운트 설정 (프로젝트별 수정 필요, 빈값이면 마운트 안함)
49
37
  PROJECT_TARGET_DIR: "__PROJECT_TARGET_DIR__" # @wizard ask:/volume1/projects/__PROJECT_NAME__
50
38
  PROJECT_MNT_DIR: "__PROJECT_MNT_DIR__" # @wizard ask:/mnt/__PROJECT_NAME__
51
39
 
@@ -54,7 +42,7 @@ env:
54
42
  PREVIEW_DOMAIN_SUFFIX: "__PREVIEW_DOMAIN_SUFFIX__" # @wizard ask:pr.example.com
55
43
  PREVIEW_PORT: '8079'
56
44
 
57
- # 🔐 SSH 인증 방식: "password"(Synology·일반 서버) | "key"(AWS EC2·.pem)
45
+ # SSH 인증 방식: "password"(Synology·일반 서버) | "key"(AWS EC2·.pem)
58
46
  # password → SERVER_PASSWORD secret 사용
59
47
  # key → SSH_KEY secret 사용 (.pem 파일 전체 내용을 secret 값으로)
60
48
  SSH_AUTH_METHOD: "password" # @wizard ask:password
@@ -80,9 +68,6 @@ env:
80
68
  HEALTH_CHECK_LOG_PATTERN: 'listening on'
81
69
  API_DOCS_PATH: ''
82
70
 
83
- # ===================================================================
84
- # 트리거 설정
85
- # ===================================================================
86
71
  on:
87
72
  issue_comment:
88
73
  types: [created] # PR 댓글 + Issue 댓글
@@ -96,13 +81,8 @@ permissions:
96
81
  pull-requests: write
97
82
  issues: write
98
83
 
99
- # ===================================================================
100
- # Jobs
101
- # ===================================================================
102
84
  jobs:
103
- # -----------------------------------------------------------------
104
85
  # Job 1: 명령어 파싱 (PR 댓글 + Issue 댓글 모두 지원)
105
- # -----------------------------------------------------------------
106
86
  check-command:
107
87
  name: 명령어 확인
108
88
  if: github.event_name == 'issue_comment'
@@ -182,9 +162,7 @@ jobs:
182
162
  echo "ℹ️ /wizard server 명령어가 아님"
183
163
  fi
184
164
 
185
- # -----------------------------------------------------------------
186
165
  # Job 2-1: 빌드 & 배포 (PR 댓글에서 실행)
187
- # -----------------------------------------------------------------
188
166
  build-preview-pr:
189
167
  name: Preview 빌드 & 배포 (PR)
190
168
  needs: check-command
@@ -209,9 +187,7 @@ jobs:
209
187
  core.setOutput('sha', pr.data.head.sha.substring(0, 7));
210
188
  return pr.data.number;
211
189
 
212
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
213
190
  # 진행 상황 댓글 시스템
214
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
215
191
  - name: 진행 상황 댓글 생성
216
192
  id: progress
217
193
  uses: actions/github-script@v9
@@ -251,17 +227,13 @@ jobs:
251
227
  with:
252
228
  ref: ${{ steps.pr.outputs.ref }}
253
229
 
254
- # =================================================================
255
- # ⚠️ [영역 2] 환경변수 파일 생성
256
- # =================================================================
230
+ # [영역 2] 환경변수 파일 생성
257
231
  - name: "[필수] .env 파일 생성"
258
232
  run: |
259
233
  cat << 'EOF' > .env
260
234
  ${{ secrets.ENV_FILE }}
261
235
  EOF
262
- # =================================================================
263
- # ⚠️ [영역 2 끝] 환경변수 파일 생성 끝
264
- # =================================================================
236
+ # [영역 2 끝] 환경변수 파일 생성 끝
265
237
 
266
238
  - name: Docker 로그인
267
239
  uses: docker/login-action@v3
@@ -334,11 +306,10 @@ jobs:
334
306
  script: |
335
307
  set -e
336
308
 
337
- # 환경 변수 설정 (배포 서버용)
338
309
  export PATH=$PATH:/usr/local/bin
339
310
  export PW="${{ secrets.SERVER_PASSWORD }}"
340
311
 
341
- # 🔐 SSH 인증 방식에 따른 sudo 추상화
312
+ # SSH 인증 방식에 따른 sudo 추상화
342
313
  SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
343
314
  if [ "${SSH_AUTH_METHOD}" = "key" ]; then
344
315
  SUDO() { sudo "$@"; }
@@ -347,7 +318,6 @@ jobs:
347
318
  fi
348
319
  echo "🔐 SSH 인증 방식: ${SSH_AUTH_METHOD}"
349
320
 
350
- # 변수 설정
351
321
  PR_NUMBER=${{ github.event.issue.number }}
352
322
  PROJECT_NAME="${{ env.PROJECT_NAME }}"
353
323
  CONTAINER_NAME="${PROJECT_NAME}-pr-${PR_NUMBER}"
@@ -365,21 +335,17 @@ jobs:
365
335
  echo "🌐 도메인: ${DOMAIN}"
366
336
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
367
337
 
368
- # 이미지 Pull
369
338
  echo "📥 Docker 이미지 Pull 중..."
370
339
  SUDO docker pull "${IMAGE}"
371
340
 
372
- # 기존 컨테이너 삭제
373
341
  echo "🗑️ 기존 컨테이너 정리 중..."
374
342
  SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
375
343
 
376
- # 볼륨 마운트 옵션 구성
377
344
  VOLUME_OPTS="-v /etc/localtime:/etc/localtime:ro"
378
345
  if [ -n "${{ env.PROJECT_TARGET_DIR }}" ] && [ -n "${{ env.PROJECT_MNT_DIR }}" ]; then
379
346
  VOLUME_OPTS="$VOLUME_OPTS -v ${{ env.PROJECT_TARGET_DIR }}:${{ env.PROJECT_MNT_DIR }}"
380
347
  fi
381
348
 
382
- # 새 컨테이너 실행
383
349
  echo "🐳 새 컨테이너 실행 중..."
384
350
  SUDO docker run -d \
385
351
  --name "${CONTAINER_NAME}" \
@@ -393,11 +359,9 @@ jobs:
393
359
  $VOLUME_OPTS \
394
360
  "${IMAGE}"
395
361
 
396
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
397
362
  # Health Check (최대 120초 대기) - 하이브리드 방식
398
363
  # 1. HEALTH_CHECK_PATH가 설정되어 있으면 HTTP 체크 시도
399
364
  # 2. 폴백: 로그 패턴 매칭 (HEALTH_CHECK_LOG_PATTERN)
400
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
401
365
  echo ""
402
366
  echo "⏳ Health Check 시작 (최대 120초 대기)..."
403
367
  HEALTH_PATH="${{ env.HEALTH_CHECK_PATH }}"
@@ -617,9 +581,7 @@ jobs:
617
581
  });
618
582
  }
619
583
 
620
- # -----------------------------------------------------------------
621
584
  # Job 2-2: Issue에서 브랜치명 추출
622
- # -----------------------------------------------------------------
623
585
  get-branch-from-issue:
624
586
  name: Issue에서 브랜치 추출
625
587
  needs: check-command
@@ -707,9 +669,7 @@ jobs:
707
669
  body: body
708
670
  });
709
671
 
710
- # -----------------------------------------------------------------
711
672
  # Job 2-3: 빌드 & 배포 (Issue 댓글에서 실행)
712
- # -----------------------------------------------------------------
713
673
  build-preview-issue:
714
674
  name: Preview 빌드 & 배포 (Issue)
715
675
  needs: [check-command, get-branch-from-issue]
@@ -788,9 +748,7 @@ jobs:
788
748
  # 브랜치의 최신 커밋 SHA 가져오기
789
749
  echo "sha=$(git ls-remote https://github.com/${{ github.repository }}.git refs/heads/${{ needs.get-branch-from-issue.outputs.branch_name }} | cut -c1-7)" >> $GITHUB_OUTPUT
790
750
 
791
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
792
751
  # 진행 상황 댓글 시스템
793
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
794
752
  - name: 진행 상황 댓글 생성
795
753
  if: steps.check_branch.outputs.exists == 'true'
796
754
  id: progress
@@ -835,18 +793,14 @@ jobs:
835
793
  with:
836
794
  ref: ${{ needs.get-branch-from-issue.outputs.branch_name }}
837
795
 
838
- # =================================================================
839
- # ⚠️ [영역 2] 환경변수 파일 생성
840
- # =================================================================
796
+ # [영역 2] 환경변수 파일 생성
841
797
  - name: "[필수] .env 파일 생성"
842
798
  if: steps.check_branch.outputs.exists == 'true'
843
799
  run: |
844
800
  cat << 'EOF' > .env
845
801
  ${{ secrets.ENV_FILE }}
846
802
  EOF
847
- # =================================================================
848
- # ⚠️ [영역 2 끝] 환경변수 파일 생성 끝
849
- # =================================================================
803
+ # [영역 2 끝] 환경변수 파일 생성 끝
850
804
 
851
805
  - name: Docker 로그인
852
806
  if: steps.check_branch.outputs.exists == 'true'
@@ -927,11 +881,10 @@ jobs:
927
881
  script: |
928
882
  set -e
929
883
 
930
- # 환경 변수 설정 (배포 서버용)
931
884
  export PATH=$PATH:/usr/local/bin
932
885
  export PW="${{ secrets.SERVER_PASSWORD }}"
933
886
 
934
- # 🔐 SSH 인증 방식에 따른 sudo 추상화
887
+ # SSH 인증 방식에 따른 sudo 추상화
935
888
  SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
936
889
  if [ "${SSH_AUTH_METHOD}" = "key" ]; then
937
890
  SUDO() { sudo "$@"; }
@@ -940,7 +893,6 @@ jobs:
940
893
  fi
941
894
  echo "🔐 SSH 인증 방식: ${SSH_AUTH_METHOD}"
942
895
 
943
- # 변수 설정
944
896
  ISSUE_NUMBER=${{ needs.get-branch-from-issue.outputs.issue_number }}
945
897
  PROJECT_NAME="${{ env.PROJECT_NAME }}"
946
898
  CONTAINER_NAME="${PROJECT_NAME}-pr-${ISSUE_NUMBER}"
@@ -958,21 +910,17 @@ jobs:
958
910
  echo "🌐 도메인: ${DOMAIN}"
959
911
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
960
912
 
961
- # 이미지 Pull
962
913
  echo "📥 Docker 이미지 Pull 중..."
963
914
  SUDO docker pull "${IMAGE}"
964
915
 
965
- # 기존 컨테이너 삭제
966
916
  echo "🗑️ 기존 컨테이너 정리 중..."
967
917
  SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
968
918
 
969
- # 볼륨 마운트 옵션 구성
970
919
  VOLUME_OPTS="-v /etc/localtime:/etc/localtime:ro"
971
920
  if [ -n "${{ env.PROJECT_TARGET_DIR }}" ] && [ -n "${{ env.PROJECT_MNT_DIR }}" ]; then
972
921
  VOLUME_OPTS="$VOLUME_OPTS -v ${{ env.PROJECT_TARGET_DIR }}:${{ env.PROJECT_MNT_DIR }}"
973
922
  fi
974
923
 
975
- # 새 컨테이너 실행
976
924
  echo "🐳 새 컨테이너 실행 중..."
977
925
  SUDO docker run -d \
978
926
  --name "${CONTAINER_NAME}" \
@@ -986,11 +934,9 @@ jobs:
986
934
  $VOLUME_OPTS \
987
935
  "${IMAGE}"
988
936
 
989
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
990
937
  # Health Check (최대 120초 대기) - 하이브리드 방식
991
938
  # 1. HEALTH_CHECK_PATH가 설정되어 있으면 HTTP 체크 시도
992
939
  # 2. 폴백: 로그 패턴 매칭 (HEALTH_CHECK_LOG_PATTERN)
993
- # ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
994
940
  echo ""
995
941
  echo "⏳ Health Check 시작 (최대 120초 대기)..."
996
942
  HEALTH_PATH="${{ env.HEALTH_CHECK_PATH }}"
@@ -1210,9 +1156,7 @@ jobs:
1210
1156
  });
1211
1157
  }
1212
1158
 
1213
- # -----------------------------------------------------------------
1214
1159
  # Job 3: Preview 삭제 (PR/Issue 닫힘 또는 destroy 명령)
1215
- # -----------------------------------------------------------------
1216
1160
  destroy-preview:
1217
1161
  name: Preview 삭제
1218
1162
  # needs 의존성 제거: PR/Issue 닫힘 이벤트에서도 독립적으로 실행되도록 함
@@ -1248,11 +1192,10 @@ jobs:
1248
1192
  port: ${{ env.SSH_PORT }}
1249
1193
  envs: SSH_AUTH_METHOD
1250
1194
  script: |
1251
- # 환경 변수 설정 (배포 서버용)
1252
1195
  export PATH=$PATH:/usr/local/bin
1253
1196
  export PW="${{ secrets.SERVER_PASSWORD }}"
1254
1197
 
1255
- # 🔐 SSH 인증 방식에 따른 sudo 추상화
1198
+ # SSH 인증 방식에 따른 sudo 추상화
1256
1199
  SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
1257
1200
  if [ "${SSH_AUTH_METHOD}" = "key" ]; then
1258
1201
  SUDO() { sudo "$@"; }
@@ -1273,11 +1216,9 @@ jobs:
1273
1216
  echo "🔢 PR 번호: #${PR_NUMBER}"
1274
1217
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1275
1218
 
1276
- # 컨테이너 삭제
1277
1219
  echo "🐳 컨테이너 삭제 중..."
1278
1220
  SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
1279
1221
 
1280
- # 이미지 삭제
1281
1222
  echo "🖼️ 이미지 삭제 중..."
1282
1223
  SUDO docker rmi "${IMAGE}" 2>/dev/null || true
1283
1224
 
@@ -1315,9 +1256,7 @@ jobs:
1315
1256
  body: body
1316
1257
  });
1317
1258
 
1318
- # -----------------------------------------------------------------
1319
1259
  # Job 4: 상태 확인 (PR/Issue 모두 지원)
1320
- # -----------------------------------------------------------------
1321
1260
  check-status:
1322
1261
  name: Preview 상태 확인
1323
1262
  needs: check-command
@@ -1334,7 +1273,6 @@ jobs:
1334
1273
  key: ${{ secrets.SSH_KEY }}
1335
1274
  port: ${{ env.SSH_PORT }}
1336
1275
  script: |
1337
- # 환경 변수 설정 (배포 서버용)
1338
1276
  export PATH=$PATH:/usr/local/bin
1339
1277
 
1340
1278
  NUMBER=${{ github.event.issue.number }}
@@ -1365,7 +1303,6 @@ jobs:
1365
1303
  key: ${{ secrets.SSH_KEY }}
1366
1304
  port: ${{ env.SSH_PORT }}
1367
1305
  script: |
1368
- # 환경 변수 설정 (배포 서버용)
1369
1306
  export PATH=$PATH:/usr/local/bin
1370
1307
 
1371
1308
  NUMBER=${{ github.event.issue.number }}
@@ -1430,9 +1367,7 @@ jobs:
1430
1367
  body: body
1431
1368
  });
1432
1369
 
1433
- # -----------------------------------------------------------------
1434
1370
  # Job 5: 커스텀 브랜치 빌드 & 배포
1435
- # -----------------------------------------------------------------
1436
1371
  build-preview-custom-branch:
1437
1372
  name: Preview 빌드 & 배포 (Custom Branch)
1438
1373
  needs: check-command
@@ -1526,7 +1461,6 @@ jobs:
1526
1461
  SHA=$(git ls-remote https://github.com/${{ github.repository }}.git refs/heads/${{ needs.check-command.outputs.custom_branch }} | cut -c1-7)
1527
1462
  echo "sha=$SHA" >> $GITHUB_OUTPUT
1528
1463
 
1529
- # 진행 상황 댓글 생성
1530
1464
  - name: 진행 상황 댓글 생성
1531
1465
  if: steps.branch_info.outputs.branch_exists == 'true'
1532
1466
  id: progress
@@ -1571,7 +1505,6 @@ jobs:
1571
1505
  with:
1572
1506
  ref: ${{ needs.check-command.outputs.custom_branch }}
1573
1507
 
1574
- # 환경변수 파일 생성
1575
1508
  - name: "[필수] .env 파일 생성"
1576
1509
  if: steps.branch_info.outputs.branch_exists == 'true'
1577
1510
  run: |
@@ -1670,11 +1603,10 @@ jobs:
1670
1603
  script: |
1671
1604
  set -e
1672
1605
 
1673
- # 환경 변수 설정 (배포 서버용)
1674
1606
  export PATH=$PATH:/usr/local/bin
1675
1607
  export PW="${{ secrets.SERVER_PASSWORD }}"
1676
1608
 
1677
- # 🔐 SSH 인증 방식에 따른 sudo 추상화
1609
+ # SSH 인증 방식에 따른 sudo 추상화
1678
1610
  SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
1679
1611
  if [ "${SSH_AUTH_METHOD}" = "key" ]; then
1680
1612
  SUDO() { sudo "$@"; }
@@ -1683,7 +1615,6 @@ jobs:
1683
1615
  fi
1684
1616
  echo "🔐 SSH 인증 방식: ${SSH_AUTH_METHOD}"
1685
1617
 
1686
- # 변수 설정
1687
1618
  PROJECT_NAME="${{ env.PROJECT_NAME }}"
1688
1619
  CONTAINER_NAME="${{ steps.container.outputs.name }}"
1689
1620
  CONTAINER_SUFFIX="${{ steps.container.outputs.suffix }}"
@@ -1700,21 +1631,17 @@ jobs:
1700
1631
  echo "🌐 도메인: ${DOMAIN}"
1701
1632
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
1702
1633
 
1703
- # 이미지 Pull
1704
1634
  echo "📥 Docker 이미지 Pull 중..."
1705
1635
  SUDO docker pull "${IMAGE}"
1706
1636
 
1707
- # 기존 컨테이너 삭제
1708
1637
  echo "🗑️ 기존 컨테이너 정리 중..."
1709
1638
  SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
1710
1639
 
1711
- # 볼륨 마운트 옵션 구성
1712
1640
  VOLUME_OPTS="-v /etc/localtime:/etc/localtime:ro"
1713
1641
  if [ -n "${{ env.PROJECT_TARGET_DIR }}" ] && [ -n "${{ env.PROJECT_MNT_DIR }}" ]; then
1714
1642
  VOLUME_OPTS="$VOLUME_OPTS -v ${{ env.PROJECT_TARGET_DIR }}:${{ env.PROJECT_MNT_DIR }}"
1715
1643
  fi
1716
1644
 
1717
- # 새 컨테이너 실행
1718
1645
  echo "🐳 새 컨테이너 실행 중..."
1719
1646
  SUDO docker run -d \
1720
1647
  --name "${CONTAINER_NAME}" \
@@ -1943,9 +1870,7 @@ jobs:
1943
1870
  });
1944
1871
  }
1945
1872
 
1946
- # -----------------------------------------------------------------
1947
1873
  # Job 6: 커스텀 브랜치 Preview 삭제
1948
- # -----------------------------------------------------------------
1949
1874
  destroy-preview-custom-branch:
1950
1875
  name: Preview 삭제 (Custom Branch)
1951
1876
  needs: check-command
@@ -1998,11 +1923,10 @@ jobs:
1998
1923
  port: ${{ env.SSH_PORT }}
1999
1924
  envs: SSH_AUTH_METHOD
2000
1925
  script: |
2001
- # 환경 변수 설정 (배포 서버용)
2002
1926
  export PATH=$PATH:/usr/local/bin
2003
1927
  export PW="${{ secrets.SERVER_PASSWORD }}"
2004
1928
 
2005
- # 🔐 SSH 인증 방식에 따른 sudo 추상화
1929
+ # SSH 인증 방식에 따른 sudo 추상화
2006
1930
  SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
2007
1931
  if [ "${SSH_AUTH_METHOD}" = "key" ]; then
2008
1932
  SUDO() { sudo "$@"; }
@@ -2025,11 +1949,9 @@ jobs:
2025
1949
  echo "📛 컨테이너: ${CONTAINER_NAME}"
2026
1950
  echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
2027
1951
 
2028
- # 컨테이너 삭제
2029
1952
  echo "🐳 컨테이너 삭제 중..."
2030
1953
  SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
2031
1954
 
2032
- # 이미지 삭제
2033
1955
  echo "🖼️ 이미지 삭제 중..."
2034
1956
  SUDO docker rmi "${IMAGE}" 2>/dev/null || true
2035
1957
 
@@ -2064,9 +1986,7 @@ jobs:
2064
1986
  body: body
2065
1987
  });
2066
1988
 
2067
- # -----------------------------------------------------------------
2068
1989
  # Job 7: 커스텀 브랜치 Preview 상태 확인
2069
- # -----------------------------------------------------------------
2070
1990
  check-status-custom-branch:
2071
1991
  name: Preview 상태 확인 (Custom Branch)
2072
1992
  needs: check-command