project-auto-wizard 0.9.1 → 0.10.0
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.
- package/package.json +1 -1
- package/payload/scripts/__pycache__/changelog_manager.cpython-314.pyc +0 -0
- package/payload/scripts/__pycache__/issue_helper.cpython-314.pyc +0 -0
- package/payload/scripts/__pycache__/version_manager.cpython-314.pyc +0 -0
- package/payload/scripts/changelog_manager.py +2 -2
- package/payload/scripts/version_manager.py +2 -2
- package/payload/workflows/common/secret-backup/PROJECT-COMMON-SECRET-FILE-UPLOAD.yaml +12 -12
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +1 -1
- package/payload/workflows/flutter/{PROJECT-FLUTTER-SUH-LAB-APP-BUILD-TRIGGER.yaml → PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml} +38 -38
- package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +1 -1
- package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +40 -40
- package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +40 -40
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +39 -39
- package/src/core/verify.js +2 -2
package/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -277,7 +277,7 @@ def classify_commits(lines: list[str]) -> dict:
|
|
|
277
277
|
"""
|
|
278
278
|
커밋 제목 목록을 3단계 규칙으로 분류.
|
|
279
279
|
|
|
280
|
-
1단계:
|
|
280
|
+
1단계: 제목 컨벤션 — "제목 : type : 내용 [URL]"
|
|
281
281
|
2단계: Conventional Commits — "type(scope)!: 내용"
|
|
282
282
|
(perf/style/build/ci → chore 버킷으로 매핑)
|
|
283
283
|
3단계: 위 두 형식에 매칭되지 않으면 "changes" 버킷 (자유 형식)
|
|
@@ -298,7 +298,7 @@ def classify_commits(lines: list[str]) -> dict:
|
|
|
298
298
|
# 1단계가 2단계보다 먼저다 — 트레이드오프: "제목 : feat : 내용" 형식은
|
|
299
299
|
# "feat: ..." Conventional Commits와 겹칠 수 없지만(타입 앞에 제목 필수),
|
|
300
300
|
# 제목이 있는 줄에 " : type : "가 우연히 들어가면 tier-2 해석 기회 없이
|
|
301
|
-
# tier-1로 확정된다.
|
|
301
|
+
# tier-1로 확정된다. 이 컨벤션을 쓰는 레포에서는 이것이 의도된 우선순위다.
|
|
302
302
|
tier1 = _TIER1_RE.match(line)
|
|
303
303
|
if tier1:
|
|
304
304
|
title = tier1.group(1).strip()
|
|
@@ -5,8 +5,8 @@ version_manager.py — general-purpose version management script (stdlib only).
|
|
|
5
5
|
This script is copied into user repos (.github/scripts/) by project-auto-wizard
|
|
6
6
|
and runs standalone on GitHub Actions ubuntu runners (python3, no third-party deps).
|
|
7
7
|
|
|
8
|
-
It is a Python rewrite of the battle-tested bash
|
|
9
|
-
|
|
8
|
+
It is a Python rewrite of the battle-tested bash reference implementation
|
|
9
|
+
(version_manager.sh). Behavioral equivalence with that script is the design goal:
|
|
10
10
|
- version.yml is the single source of truth for `version` and `version_code`.
|
|
11
11
|
- version.yml is edited via line-based regex replacements that preserve all
|
|
12
12
|
comments and formatting (never rewritten wholesale, never parsed with a YAML lib).
|
|
@@ -135,17 +135,17 @@ jobs:
|
|
|
135
135
|
# ============================================
|
|
136
136
|
|
|
137
137
|
# --- ENV_FILE → .env ---
|
|
138
|
-
cat << '
|
|
138
|
+
cat << '__WIZARD_SECRET_CHECK_EOF__' > /tmp/_secret_check
|
|
139
139
|
${{ secrets.ENV_FILE }}
|
|
140
|
-
|
|
140
|
+
__WIZARD_SECRET_CHECK_EOF__
|
|
141
141
|
if [ -s /tmp/_secret_check ] && [ -n "$(tr -d '[:space:]' < /tmp/_secret_check)" ]; then
|
|
142
142
|
echo "ENV_FILE → .env 업로드 중..."
|
|
143
|
-
cat << '
|
|
143
|
+
cat << '__WIZARD_FILE_CONTENT_EOF__' | sudo tee "${BASE_DIR}/.env" > /dev/null
|
|
144
144
|
${{ secrets.ENV_FILE }}
|
|
145
|
-
|
|
146
|
-
cat << '
|
|
145
|
+
__WIZARD_FILE_CONTENT_EOF__
|
|
146
|
+
cat << '__WIZARD_FILE_CONTENT_EOF__' | sudo tee "${BASE_DIR}/${TIMESTAMP}/.env" > /dev/null
|
|
147
147
|
${{ secrets.ENV_FILE }}
|
|
148
|
-
|
|
148
|
+
__WIZARD_FILE_CONTENT_EOF__
|
|
149
149
|
echo ".env 업로드 완료"
|
|
150
150
|
else
|
|
151
151
|
echo "ENV_FILE 스킵 (Secret 미설정)"
|
|
@@ -153,17 +153,17 @@ jobs:
|
|
|
153
153
|
rm -f /tmp/_secret_check
|
|
154
154
|
|
|
155
155
|
# --- APPLICATION_PROD_YML → application-prod.yml ---
|
|
156
|
-
cat << '
|
|
156
|
+
cat << '__WIZARD_SECRET_CHECK_EOF__' > /tmp/_secret_check
|
|
157
157
|
${{ secrets.APPLICATION_PROD_YML }}
|
|
158
|
-
|
|
158
|
+
__WIZARD_SECRET_CHECK_EOF__
|
|
159
159
|
if [ -s /tmp/_secret_check ] && [ -n "$(tr -d '[:space:]' < /tmp/_secret_check)" ]; then
|
|
160
160
|
echo "APPLICATION_PROD_YML → application-prod.yml 업로드 중..."
|
|
161
|
-
cat << '
|
|
161
|
+
cat << '__WIZARD_FILE_CONTENT_EOF__' | sudo tee "${BASE_DIR}/application-prod.yml" > /dev/null
|
|
162
162
|
${{ secrets.APPLICATION_PROD_YML }}
|
|
163
|
-
|
|
164
|
-
cat << '
|
|
163
|
+
__WIZARD_FILE_CONTENT_EOF__
|
|
164
|
+
cat << '__WIZARD_FILE_CONTENT_EOF__' | sudo tee "${BASE_DIR}/${TIMESTAMP}/application-prod.yml" > /dev/null
|
|
165
165
|
${{ secrets.APPLICATION_PROD_YML }}
|
|
166
|
-
|
|
166
|
+
__WIZARD_FILE_CONTENT_EOF__
|
|
167
167
|
echo "application-prod.yml 업로드 완료"
|
|
168
168
|
else
|
|
169
169
|
echo "APPLICATION_PROD_YML 스킵 (Secret 미설정)"
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
# project-auto-wizard:managed-workflow
|
|
2
2
|
# ===================================================================
|
|
3
|
-
# Flutter 테스트 앱 빌드 트리거 워크플로우
|
|
3
|
+
# Flutter 테스트 앱 빌드 트리거 워크플로우
|
|
4
4
|
# ===================================================================
|
|
5
5
|
#
|
|
6
6
|
# 이 워크플로우는 PR 또는 이슈에 댓글로 빌드 명령어를 작성하면
|
|
7
7
|
# Android와 iOS 테스트 앱 빌드를 자동으로 트리거합니다.
|
|
8
8
|
#
|
|
9
9
|
# 주요 특징:
|
|
10
|
-
# - PR/이슈 댓글 감지: "
|
|
10
|
+
# - PR/이슈 댓글 감지: "/wizard app build / apk build / ios build" 키워드 감지 (어순 무관: build app 도 동작)
|
|
11
11
|
# - repository_dispatch 이벤트로 빌드 워크플로우 트리거
|
|
12
12
|
# - PR/이슈 번호 + 빌드 횟수로 고유한 빌드 번호 생성 (예: 38700, 38701...)
|
|
13
13
|
# - 브랜치명에서 이슈 번호 자동 추출 (YYYYMMDD_#이슈번호_내용 형식)
|
|
14
14
|
# - 테스트 버전은 version.yml에서 동적으로 읽어 사용 (빌드 번호로 운영/테스트 구분)
|
|
15
15
|
#
|
|
16
16
|
# 사용 방법:
|
|
17
|
-
# - PR에 댓글 작성: "
|
|
18
|
-
# - PR에 댓글 작성: "
|
|
19
|
-
# - PR에 댓글 작성: "
|
|
20
|
-
# - 이슈에 댓글 작성: 위 명령어 동일 (
|
|
17
|
+
# - PR에 댓글 작성: "/wizard app build" (Android + iOS 모두 빌드)
|
|
18
|
+
# - PR에 댓글 작성: "/wizard apk build" (Android만 빌드)
|
|
19
|
+
# - PR에 댓글 작성: "/wizard ios build" (iOS만 빌드)
|
|
20
|
+
# - 이슈에 댓글 작성: 위 명령어 동일 (Issue Helper 댓글 필요)
|
|
21
21
|
# - 어순은 무관: "build app" / "build apk" / "build ios"로 적어도 동일하게 동작
|
|
22
|
-
# - 특정 브랜치 지정: "
|
|
23
|
-
# 예: "
|
|
24
|
-
# 브랜치명을 생략하면 PR head 또는 이슈의
|
|
22
|
+
# - 특정 브랜치 지정: "/wizard app build <브랜치명>" (명령어 뒤에 브랜치명을 적으면 해당 브랜치를 빌드)
|
|
23
|
+
# 예: "/wizard apk build 20260609_#349_feature" → 해당 브랜치로 Android 빌드
|
|
24
|
+
# 브랜치명을 생략하면 PR head 또는 이슈의 Issue Helper 댓글 브랜치를 사용
|
|
25
25
|
#
|
|
26
26
|
# 트리거되는 워크플로우:
|
|
27
27
|
# - PROJECT-FLUTTER-ANDROID-TEST-APK.yaml (event_type: build-android-app)
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
#
|
|
30
30
|
# ===================================================================
|
|
31
31
|
|
|
32
|
-
name: PROJECT-Flutter-
|
|
32
|
+
name: PROJECT-Flutter-App-Build-Trigger
|
|
33
33
|
|
|
34
34
|
on:
|
|
35
35
|
issue_comment:
|
|
@@ -43,9 +43,9 @@ permissions:
|
|
|
43
43
|
jobs:
|
|
44
44
|
trigger-builds:
|
|
45
45
|
name: 빌드 워크플로우 트리거
|
|
46
|
-
#
|
|
46
|
+
# /wizard app build / /wizard apk build / /wizard ios build 키워드 감지 (어순 무관)
|
|
47
47
|
if: |
|
|
48
|
-
contains(github.event.comment.body, '
|
|
48
|
+
contains(github.event.comment.body, '/wizard') &&
|
|
49
49
|
(
|
|
50
50
|
(contains(github.event.comment.body, 'build') && contains(github.event.comment.body, 'app')) ||
|
|
51
51
|
(contains(github.event.comment.body, 'apk') && contains(github.event.comment.body, 'build')) ||
|
|
@@ -93,27 +93,27 @@ jobs:
|
|
|
93
93
|
// 어순은 양방향 지원: "{타입} build"(app/apk/ios build)와 "build {타입}"(build app 등) 모두 허용.
|
|
94
94
|
// apk가 app으로 오인되지 않도록 app 토큰은 \b 단어경계로 정확히 끊는다(apk·application 제외).
|
|
95
95
|
// apk/ios를 app보다 먼저 검사해, "apk build"가 app 분기로 새지 않게 한다.
|
|
96
|
-
if (comment.match(
|
|
97
|
-
//
|
|
96
|
+
if (comment.match(/\/wizard[^\S\r\n]+apk[^\S\r\n]+build/) || comment.match(/\/wizard[^\S\r\n]+build[^\S\r\n]+apk/)) {
|
|
97
|
+
// /wizard apk build [브랜치] (또는 build apk) → Android만
|
|
98
98
|
buildAndroid = true;
|
|
99
99
|
buildType = 'apk';
|
|
100
|
-
m = rawComment.match(
|
|
101
|
-
|| rawComment.match(
|
|
100
|
+
m = rawComment.match(/\/wizard[^\S\r\n]+apk[^\S\r\n]+build(?:[^\S\r\n]+(\S+))?/i)
|
|
101
|
+
|| rawComment.match(/\/wizard[^\S\r\n]+build[^\S\r\n]+apk(?:[^\S\r\n]+(\S+))?/i);
|
|
102
102
|
customBranch = (m && m[1]) || '';
|
|
103
|
-
} else if (comment.match(
|
|
104
|
-
//
|
|
103
|
+
} else if (comment.match(/\/wizard[^\S\r\n]+ios[^\S\r\n]+build/) || comment.match(/\/wizard[^\S\r\n]+build[^\S\r\n]+ios/)) {
|
|
104
|
+
// /wizard ios build [브랜치] (또는 build ios) → iOS만
|
|
105
105
|
buildIos = true;
|
|
106
106
|
buildType = 'ios';
|
|
107
|
-
m = rawComment.match(
|
|
108
|
-
|| rawComment.match(
|
|
107
|
+
m = rawComment.match(/\/wizard[^\S\r\n]+ios[^\S\r\n]+build(?:[^\S\r\n]+(\S+))?/i)
|
|
108
|
+
|| rawComment.match(/\/wizard[^\S\r\n]+build[^\S\r\n]+ios(?:[^\S\r\n]+(\S+))?/i);
|
|
109
109
|
customBranch = (m && m[1]) || '';
|
|
110
|
-
} else if (comment.match(
|
|
111
|
-
//
|
|
110
|
+
} else if (comment.match(/\/wizard[^\S\r\n]+app\b[^\S\r\n]+build/) || comment.match(/\/wizard[^\S\r\n]+build[^\S\r\n]+app\b/)) {
|
|
111
|
+
// /wizard app build [브랜치] (또는 build app) → Android + iOS 모두
|
|
112
112
|
buildAndroid = true;
|
|
113
113
|
buildIos = true;
|
|
114
114
|
buildType = 'app';
|
|
115
|
-
m = rawComment.match(
|
|
116
|
-
|| rawComment.match(
|
|
115
|
+
m = rawComment.match(/\/wizard[^\S\r\n]+app\b[^\S\r\n]+build(?:[^\S\r\n]+(\S+))?/i)
|
|
116
|
+
|| rawComment.match(/\/wizard[^\S\r\n]+build[^\S\r\n]+app\b(?:[^\S\r\n]+(\S+))?/i);
|
|
117
117
|
customBranch = (m && m[1]) || '';
|
|
118
118
|
}
|
|
119
119
|
|
|
@@ -175,7 +175,7 @@ jobs:
|
|
|
175
175
|
} catch (error) {
|
|
176
176
|
console.log('ℹ️ PR이 아닙니다. 이슈에서 브랜치 정보를 찾습니다...');
|
|
177
177
|
|
|
178
|
-
// 2. PR이 아니면 이슈에서 "
|
|
178
|
+
// 2. PR이 아니면 이슈에서 "Issue Helper" 댓글 찾기
|
|
179
179
|
sourceType = 'ISSUE';
|
|
180
180
|
sourceNumber = issueNumber.toString();
|
|
181
181
|
relatedIssueNumber = issueNumber.toString();
|
|
@@ -203,27 +203,27 @@ jobs:
|
|
|
203
203
|
per_page: 100
|
|
204
204
|
});
|
|
205
205
|
|
|
206
|
-
// "
|
|
206
|
+
// "Issue Helper" 댓글 찾기
|
|
207
207
|
const guideComment = comments.data.find(c =>
|
|
208
|
-
c.body.includes('
|
|
208
|
+
c.body.includes('<!-- project-auto-wizard issue helper -->')
|
|
209
209
|
);
|
|
210
210
|
|
|
211
211
|
if (!guideComment) {
|
|
212
|
-
console.log('❌ "
|
|
212
|
+
console.log('❌ "Issue Helper" 댓글을 찾을 수 없습니다.');
|
|
213
213
|
core.setOutput('found', 'false');
|
|
214
|
-
core.setOutput('errorMessage', '이슈에서 "
|
|
214
|
+
core.setOutput('errorMessage', '이슈에서 "Issue Helper" 댓글을 찾을 수 없습니다. 브랜치 정보가 포함된 댓글이 필요합니다.');
|
|
215
215
|
return;
|
|
216
216
|
}
|
|
217
217
|
|
|
218
|
-
console.log('✅ "
|
|
218
|
+
console.log('✅ "Issue Helper" 댓글 발견');
|
|
219
219
|
|
|
220
220
|
// 브랜치명 추출 (### 브랜치 다음 ``` 블록 내용)
|
|
221
|
-
const branchMatch = guideComment.body.match(/###
|
|
221
|
+
const branchMatch = guideComment.body.match(/### 브랜치(?:명)?\s*```\s*([\s\S]*?)\s*```/);
|
|
222
222
|
|
|
223
223
|
if (!branchMatch) {
|
|
224
224
|
console.log('❌ 브랜치 정보를 파싱할 수 없습니다.');
|
|
225
225
|
core.setOutput('found', 'false');
|
|
226
|
-
core.setOutput('errorMessage', '"
|
|
226
|
+
core.setOutput('errorMessage', '"Issue Helper" 댓글에서 브랜치 정보를 파싱할 수 없습니다. 댓글 형식을 확인해주세요.');
|
|
227
227
|
return;
|
|
228
228
|
}
|
|
229
229
|
|
|
@@ -262,9 +262,9 @@ jobs:
|
|
|
262
262
|
|
|
263
263
|
**해결 방법:**
|
|
264
264
|
- PR에서 빌드하는 경우: PR 페이지에서 댓글을 작성해주세요.
|
|
265
|
-
- 이슈에서 빌드하는 경우: "
|
|
265
|
+
- 이슈에서 빌드하는 경우: "Issue Helper" 댓글이 있어야 합니다.
|
|
266
266
|
- 댓글에 \`### 브랜치\` 섹션과 브랜치명이 포함되어 있어야 합니다.
|
|
267
|
-
- 또는 댓글에 브랜치명을 직접 지정할 수 있습니다:
|
|
267
|
+
- 또는 댓글에 브랜치명을 직접 지정할 수 있습니다: \`/wizard app build <브랜치명>\``;
|
|
268
268
|
|
|
269
269
|
await github.rest.issues.createComment({
|
|
270
270
|
owner: context.repo.owner,
|
|
@@ -329,7 +329,7 @@ jobs:
|
|
|
329
329
|
'',
|
|
330
330
|
'### 💡 확인 사항',
|
|
331
331
|
'1. 브랜치가 원격 저장소에 push되었는지 확인하세요',
|
|
332
|
-
'2. "
|
|
332
|
+
'2. "Issue Helper" 댓글의 브랜치명이 올바른지 확인하세요',
|
|
333
333
|
'3. 브랜치명에 오타가 없는지 확인하세요',
|
|
334
334
|
'',
|
|
335
335
|
`🔗 [워크플로우 로그](${runUrl})`
|
|
@@ -377,7 +377,7 @@ jobs:
|
|
|
377
377
|
// iOS 빌드: ios 빌드 + app 공용 빌드 둘 다 카운트 (어순 무관)
|
|
378
378
|
buildCount = comments.data.filter(c => {
|
|
379
379
|
const body = c.body.toLowerCase();
|
|
380
|
-
return body.includes('
|
|
380
|
+
return body.includes('/wizard') && body.includes('build') && (
|
|
381
381
|
body.includes('ios') || body.includes('app')
|
|
382
382
|
);
|
|
383
383
|
}).length;
|
|
@@ -387,7 +387,7 @@ jobs:
|
|
|
387
387
|
// Android 빌드: apk 빌드 + app 공용 빌드 둘 다 카운트 (어순 무관)
|
|
388
388
|
buildCount = comments.data.filter(c => {
|
|
389
389
|
const body = c.body.toLowerCase();
|
|
390
|
-
return body.includes('
|
|
390
|
+
return body.includes('/wizard') && body.includes('build') && (
|
|
391
391
|
body.includes('apk') || body.includes('app')
|
|
392
392
|
);
|
|
393
393
|
}).length;
|
|
@@ -397,7 +397,7 @@ jobs:
|
|
|
397
397
|
// 전체 앱 빌드: 모든 빌드 명령어 카운트 (어순 무관)
|
|
398
398
|
buildCount = comments.data.filter(c => {
|
|
399
399
|
const body = c.body.toLowerCase();
|
|
400
|
-
return body.includes('
|
|
400
|
+
return body.includes('/wizard') && body.includes('build') && (
|
|
401
401
|
body.includes('ios') ||
|
|
402
402
|
body.includes('apk') ||
|
|
403
403
|
body.includes('app')
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
# ===================================================================
|
|
20
20
|
#
|
|
21
21
|
# 🚀 사용법:
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
22
|
+
# /wizard server build - Preview 빌드 및 배포
|
|
23
|
+
# /wizard server destroy - Preview 환경 삭제
|
|
24
|
+
# /wizard server status - 현재 상태 확인
|
|
25
25
|
#
|
|
26
26
|
# 📊 리소스 네이밍:
|
|
27
27
|
# - 컨테이너: {PROJECT_NAME}-pr-{번호}
|
|
@@ -64,7 +64,7 @@ env:
|
|
|
64
64
|
|
|
65
65
|
# Issue Helper 댓글 마커 (프로젝트별 수정 필요)
|
|
66
66
|
# Issue 댓글에서 브랜치명을 추출할 때 사용
|
|
67
|
-
ISSUE_HELPER_MARKER: '
|
|
67
|
+
ISSUE_HELPER_MARKER: '<!-- project-auto-wizard issue helper -->'
|
|
68
68
|
|
|
69
69
|
# Health Check 설정 (프로젝트별 수정 필요)
|
|
70
70
|
# - HEALTH_CHECK_PATH: HTTP Health Check 경로 (빈값이면 HTTP 체크 건너뜀)
|
|
@@ -115,7 +115,7 @@ jobs:
|
|
|
115
115
|
is_custom_branch: ${{ steps.parse.outputs.is_custom_branch }}
|
|
116
116
|
steps:
|
|
117
117
|
- name: 댓글에 👀 리액션 추가
|
|
118
|
-
if: contains(github.event.comment.body, '
|
|
118
|
+
if: contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server')
|
|
119
119
|
uses: actions/github-script@v9
|
|
120
120
|
with:
|
|
121
121
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -143,8 +143,8 @@ jobs:
|
|
|
143
143
|
fi
|
|
144
144
|
|
|
145
145
|
# 명령어 파싱 (브랜치 파라미터 지원)
|
|
146
|
-
# 형식:
|
|
147
|
-
if [[ "$COMMENT" =~
|
|
146
|
+
# 형식: /wizard server <command> [브랜치명]
|
|
147
|
+
if [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
|
|
148
148
|
echo "command=build" >> $GITHUB_OUTPUT
|
|
149
149
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
150
150
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -155,7 +155,7 @@ jobs:
|
|
|
155
155
|
echo "is_custom_branch=false" >> $GITHUB_OUTPUT
|
|
156
156
|
echo "✅ 명령어 감지: build"
|
|
157
157
|
fi
|
|
158
|
-
elif [[ "$COMMENT" =~
|
|
158
|
+
elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+destroy([[:space:]]+([^[:space:]]+))? ]]; then
|
|
159
159
|
echo "command=destroy" >> $GITHUB_OUTPUT
|
|
160
160
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
161
161
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -166,7 +166,7 @@ jobs:
|
|
|
166
166
|
echo "is_custom_branch=false" >> $GITHUB_OUTPUT
|
|
167
167
|
echo "✅ 명령어 감지: destroy"
|
|
168
168
|
fi
|
|
169
|
-
elif [[ "$COMMENT" =~
|
|
169
|
+
elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+status([[:space:]]+([^[:space:]]+))? ]]; then
|
|
170
170
|
echo "command=status" >> $GITHUB_OUTPUT
|
|
171
171
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
172
172
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -179,7 +179,7 @@ jobs:
|
|
|
179
179
|
fi
|
|
180
180
|
else
|
|
181
181
|
echo "is_valid=false" >> $GITHUB_OUTPUT
|
|
182
|
-
echo "ℹ️
|
|
182
|
+
echo "ℹ️ /wizard server 명령어가 아님"
|
|
183
183
|
fi
|
|
184
184
|
|
|
185
185
|
# -----------------------------------------------------------------
|
|
@@ -519,17 +519,17 @@ jobs:
|
|
|
519
519
|
'### 📋 명령어',
|
|
520
520
|
'| 명령어 | 설명 |',
|
|
521
521
|
'|--------|------|',
|
|
522
|
-
'|
|
|
523
|
-
'|
|
|
524
|
-
'|
|
|
522
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
523
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
524
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
525
525
|
'',
|
|
526
526
|
'<details>',
|
|
527
527
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
528
528
|
'',
|
|
529
529
|
'```',
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
530
|
+
`/wizard server build ${branchName}`,
|
|
531
|
+
`/wizard server destroy ${branchName}`,
|
|
532
|
+
`/wizard server status ${branchName}`,
|
|
533
533
|
'```',
|
|
534
534
|
'</details>',
|
|
535
535
|
'',
|
|
@@ -594,7 +594,7 @@ jobs:
|
|
|
594
594
|
'',
|
|
595
595
|
'### 💡 다음 단계',
|
|
596
596
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
597
|
-
'2. 문제를 수정한 후 다시 시도하세요:
|
|
597
|
+
'2. 문제를 수정한 후 다시 시도하세요: `/wizard server build`',
|
|
598
598
|
'',
|
|
599
599
|
'---',
|
|
600
600
|
'*🤖 이 댓글은 PR Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1115,17 +1115,17 @@ jobs:
|
|
|
1115
1115
|
'### 📋 명령어',
|
|
1116
1116
|
'| 명령어 | 설명 |',
|
|
1117
1117
|
'|--------|------|',
|
|
1118
|
-
'|
|
|
1119
|
-
'|
|
|
1120
|
-
'|
|
|
1118
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1119
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1120
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
1121
1121
|
'',
|
|
1122
1122
|
'<details>',
|
|
1123
1123
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
1124
1124
|
'',
|
|
1125
1125
|
'```',
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1126
|
+
`/wizard server build ${branchName}`,
|
|
1127
|
+
`/wizard server destroy ${branchName}`,
|
|
1128
|
+
`/wizard server status ${branchName}`,
|
|
1129
1129
|
'```',
|
|
1130
1130
|
'</details>',
|
|
1131
1131
|
'',
|
|
@@ -1188,7 +1188,7 @@ jobs:
|
|
|
1188
1188
|
'',
|
|
1189
1189
|
'### 💡 다음 단계',
|
|
1190
1190
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
1191
|
-
'2. 문제를 수정한 후 다시 시도하세요:
|
|
1191
|
+
'2. 문제를 수정한 후 다시 시도하세요: `/wizard server build`',
|
|
1192
1192
|
'',
|
|
1193
1193
|
'---',
|
|
1194
1194
|
'*🤖 이 댓글은 Issue Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1219,7 +1219,7 @@ jobs:
|
|
|
1219
1219
|
if: |
|
|
1220
1220
|
(github.event_name == 'pull_request' && github.event.action == 'closed') ||
|
|
1221
1221
|
(github.event_name == 'issues' && github.event.action == 'closed') ||
|
|
1222
|
-
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '
|
|
1222
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server destroy'))
|
|
1223
1223
|
runs-on: ubuntu-latest
|
|
1224
1224
|
steps:
|
|
1225
1225
|
- name: PR/Issue 번호 가져오기
|
|
@@ -1302,7 +1302,7 @@ jobs:
|
|
|
1302
1302
|
`| **컨테이너** | \`${projectName}-pr-${number}\` |`,
|
|
1303
1303
|
'| **상태** | 삭제됨 |',
|
|
1304
1304
|
'',
|
|
1305
|
-
'다시 배포하려면:
|
|
1305
|
+
'다시 배포하려면: `/wizard server build`',
|
|
1306
1306
|
'',
|
|
1307
1307
|
'---',
|
|
1308
1308
|
'*🤖 이 댓글은 PR/Issue Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1401,8 +1401,8 @@ jobs:
|
|
|
1401
1401
|
'### 📋 명령어',
|
|
1402
1402
|
'| 명령어 | 설명 |',
|
|
1403
1403
|
'|--------|------|',
|
|
1404
|
-
'|
|
|
1405
|
-
'|
|
|
1404
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1405
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1406
1406
|
'',
|
|
1407
1407
|
'---',
|
|
1408
1408
|
`*🤖 이 댓글은 ${contextType} Preview 시스템에 의해 자동 생성되었습니다.*`
|
|
@@ -1416,7 +1416,7 @@ jobs:
|
|
|
1416
1416
|
`| **컨테이너** | \`${projectName}-pr-${number}\` |`,
|
|
1417
1417
|
'| **상태** | 🔴 Not Found |',
|
|
1418
1418
|
'',
|
|
1419
|
-
'배포하려면:
|
|
1419
|
+
'배포하려면: `/wizard server build`',
|
|
1420
1420
|
'',
|
|
1421
1421
|
'---',
|
|
1422
1422
|
`*🤖 이 댓글은 ${contextType} Preview 시스템에 의해 자동 생성되었습니다.*`
|
|
@@ -1850,17 +1850,17 @@ jobs:
|
|
|
1850
1850
|
'### 📋 명령어',
|
|
1851
1851
|
'| 명령어 | 설명 |',
|
|
1852
1852
|
'|--------|------|',
|
|
1853
|
-
'|
|
|
1854
|
-
'|
|
|
1855
|
-
'|
|
|
1853
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1854
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1855
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
1856
1856
|
'',
|
|
1857
1857
|
'<details>',
|
|
1858
1858
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
1859
1859
|
'',
|
|
1860
1860
|
'```',
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1861
|
+
`/wizard server build ${branchName}`,
|
|
1862
|
+
`/wizard server destroy ${branchName}`,
|
|
1863
|
+
`/wizard server status ${branchName}`,
|
|
1864
1864
|
'```',
|
|
1865
1865
|
'</details>',
|
|
1866
1866
|
'',
|
|
@@ -1921,7 +1921,7 @@ jobs:
|
|
|
1921
1921
|
'',
|
|
1922
1922
|
'### 💡 다음 단계',
|
|
1923
1923
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
1924
|
-
`2. 문제를 수정한 후 다시 시도하세요:
|
|
1924
|
+
`2. 문제를 수정한 후 다시 시도하세요: \`/wizard server build ${branchName}\``,
|
|
1925
1925
|
'',
|
|
1926
1926
|
'---',
|
|
1927
1927
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2051,7 +2051,7 @@ jobs:
|
|
|
2051
2051
|
`| **컨테이너** | \`${containerName}\` |`,
|
|
2052
2052
|
'| **상태** | 삭제됨 |',
|
|
2053
2053
|
'',
|
|
2054
|
-
`다시 배포하려면:
|
|
2054
|
+
`다시 배포하려면: \`/wizard server build ${branchName}\``,
|
|
2055
2055
|
'',
|
|
2056
2056
|
'---',
|
|
2057
2057
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2162,8 +2162,8 @@ jobs:
|
|
|
2162
2162
|
'### 📋 명령어',
|
|
2163
2163
|
'| 명령어 | 설명 |',
|
|
2164
2164
|
'|--------|------|',
|
|
2165
|
-
`|
|
|
2166
|
-
`|
|
|
2165
|
+
`| \`/wizard server build ${branchName}\` | 최신 커밋으로 재배포 |`,
|
|
2166
|
+
`| \`/wizard server destroy ${branchName}\` | Preview 환경 삭제 |`,
|
|
2167
2167
|
'',
|
|
2168
2168
|
'---',
|
|
2169
2169
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2178,7 +2178,7 @@ jobs:
|
|
|
2178
2178
|
`| **컨테이너** | \`${containerName}\` |`,
|
|
2179
2179
|
'| **상태** | 🔴 Not Found |',
|
|
2180
2180
|
'',
|
|
2181
|
-
`배포하려면:
|
|
2181
|
+
`배포하려면: \`/wizard server build ${branchName}\``,
|
|
2182
2182
|
'',
|
|
2183
2183
|
'---',
|
|
2184
2184
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
# ===================================================================
|
|
20
20
|
#
|
|
21
21
|
# 🚀 사용법:
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
22
|
+
# /wizard server build - Preview 빌드 및 배포
|
|
23
|
+
# /wizard server destroy - Preview 환경 삭제
|
|
24
|
+
# /wizard server status - 현재 상태 확인
|
|
25
25
|
#
|
|
26
26
|
# 📊 리소스 네이밍:
|
|
27
27
|
# - 컨테이너: {PROJECT_NAME}-pr-{번호}
|
|
@@ -64,7 +64,7 @@ env:
|
|
|
64
64
|
|
|
65
65
|
# Issue Helper 댓글 마커 (프로젝트별 수정 필요)
|
|
66
66
|
# Issue 댓글에서 브랜치명을 추출할 때 사용
|
|
67
|
-
ISSUE_HELPER_MARKER: '
|
|
67
|
+
ISSUE_HELPER_MARKER: '<!-- project-auto-wizard issue helper -->'
|
|
68
68
|
|
|
69
69
|
# Health Check 설정 (프로젝트별 수정 필요)
|
|
70
70
|
# - HEALTH_CHECK_PATH: HTTP Health Check 경로 (빈값이면 HTTP 체크 건너뜀)
|
|
@@ -114,7 +114,7 @@ jobs:
|
|
|
114
114
|
is_custom_branch: ${{ steps.parse.outputs.is_custom_branch }}
|
|
115
115
|
steps:
|
|
116
116
|
- name: 댓글에 👀 리액션 추가
|
|
117
|
-
if: contains(github.event.comment.body, '
|
|
117
|
+
if: contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server')
|
|
118
118
|
uses: actions/github-script@v9
|
|
119
119
|
with:
|
|
120
120
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -142,8 +142,8 @@ jobs:
|
|
|
142
142
|
fi
|
|
143
143
|
|
|
144
144
|
# 명령어 파싱 (브랜치 파라미터 지원)
|
|
145
|
-
# 형식:
|
|
146
|
-
if [[ "$COMMENT" =~
|
|
145
|
+
# 형식: /wizard server <command> [브랜치명]
|
|
146
|
+
if [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
|
|
147
147
|
echo "command=build" >> $GITHUB_OUTPUT
|
|
148
148
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
149
149
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -154,7 +154,7 @@ jobs:
|
|
|
154
154
|
echo "is_custom_branch=false" >> $GITHUB_OUTPUT
|
|
155
155
|
echo "✅ 명령어 감지: build"
|
|
156
156
|
fi
|
|
157
|
-
elif [[ "$COMMENT" =~
|
|
157
|
+
elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+destroy([[:space:]]+([^[:space:]]+))? ]]; then
|
|
158
158
|
echo "command=destroy" >> $GITHUB_OUTPUT
|
|
159
159
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
160
160
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -165,7 +165,7 @@ jobs:
|
|
|
165
165
|
echo "is_custom_branch=false" >> $GITHUB_OUTPUT
|
|
166
166
|
echo "✅ 명령어 감지: destroy"
|
|
167
167
|
fi
|
|
168
|
-
elif [[ "$COMMENT" =~
|
|
168
|
+
elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+status([[:space:]]+([^[:space:]]+))? ]]; then
|
|
169
169
|
echo "command=status" >> $GITHUB_OUTPUT
|
|
170
170
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
171
171
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -178,7 +178,7 @@ jobs:
|
|
|
178
178
|
fi
|
|
179
179
|
else
|
|
180
180
|
echo "is_valid=false" >> $GITHUB_OUTPUT
|
|
181
|
-
echo "ℹ️
|
|
181
|
+
echo "ℹ️ /wizard server 명령어가 아님"
|
|
182
182
|
fi
|
|
183
183
|
|
|
184
184
|
# -----------------------------------------------------------------
|
|
@@ -518,17 +518,17 @@ jobs:
|
|
|
518
518
|
'### 📋 명령어',
|
|
519
519
|
'| 명령어 | 설명 |',
|
|
520
520
|
'|--------|------|',
|
|
521
|
-
'|
|
|
522
|
-
'|
|
|
523
|
-
'|
|
|
521
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
522
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
523
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
524
524
|
'',
|
|
525
525
|
'<details>',
|
|
526
526
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
527
527
|
'',
|
|
528
528
|
'```',
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
529
|
+
`/wizard server build ${branchName}`,
|
|
530
|
+
`/wizard server destroy ${branchName}`,
|
|
531
|
+
`/wizard server status ${branchName}`,
|
|
532
532
|
'```',
|
|
533
533
|
'</details>',
|
|
534
534
|
'',
|
|
@@ -593,7 +593,7 @@ jobs:
|
|
|
593
593
|
'',
|
|
594
594
|
'### 💡 다음 단계',
|
|
595
595
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
596
|
-
'2. 문제를 수정한 후 다시 시도하세요:
|
|
596
|
+
'2. 문제를 수정한 후 다시 시도하세요: `/wizard server build`',
|
|
597
597
|
'',
|
|
598
598
|
'---',
|
|
599
599
|
'*🤖 이 댓글은 PR Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1114,17 +1114,17 @@ jobs:
|
|
|
1114
1114
|
'### 📋 명령어',
|
|
1115
1115
|
'| 명령어 | 설명 |',
|
|
1116
1116
|
'|--------|------|',
|
|
1117
|
-
'|
|
|
1118
|
-
'|
|
|
1119
|
-
'|
|
|
1117
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1118
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1119
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
1120
1120
|
'',
|
|
1121
1121
|
'<details>',
|
|
1122
1122
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
1123
1123
|
'',
|
|
1124
1124
|
'```',
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1125
|
+
`/wizard server build ${branchName}`,
|
|
1126
|
+
`/wizard server destroy ${branchName}`,
|
|
1127
|
+
`/wizard server status ${branchName}`,
|
|
1128
1128
|
'```',
|
|
1129
1129
|
'</details>',
|
|
1130
1130
|
'',
|
|
@@ -1187,7 +1187,7 @@ jobs:
|
|
|
1187
1187
|
'',
|
|
1188
1188
|
'### 💡 다음 단계',
|
|
1189
1189
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
1190
|
-
'2. 문제를 수정한 후 다시 시도하세요:
|
|
1190
|
+
'2. 문제를 수정한 후 다시 시도하세요: `/wizard server build`',
|
|
1191
1191
|
'',
|
|
1192
1192
|
'---',
|
|
1193
1193
|
'*🤖 이 댓글은 Issue Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1218,7 +1218,7 @@ jobs:
|
|
|
1218
1218
|
if: |
|
|
1219
1219
|
(github.event_name == 'pull_request' && github.event.action == 'closed') ||
|
|
1220
1220
|
(github.event_name == 'issues' && github.event.action == 'closed') ||
|
|
1221
|
-
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '
|
|
1221
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server destroy'))
|
|
1222
1222
|
runs-on: ubuntu-latest
|
|
1223
1223
|
steps:
|
|
1224
1224
|
- name: PR/Issue 번호 가져오기
|
|
@@ -1301,7 +1301,7 @@ jobs:
|
|
|
1301
1301
|
`| **컨테이너** | \`${projectName}-pr-${number}\` |`,
|
|
1302
1302
|
'| **상태** | 삭제됨 |',
|
|
1303
1303
|
'',
|
|
1304
|
-
'다시 배포하려면:
|
|
1304
|
+
'다시 배포하려면: `/wizard server build`',
|
|
1305
1305
|
'',
|
|
1306
1306
|
'---',
|
|
1307
1307
|
'*🤖 이 댓글은 PR/Issue Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1400,8 +1400,8 @@ jobs:
|
|
|
1400
1400
|
'### 📋 명령어',
|
|
1401
1401
|
'| 명령어 | 설명 |',
|
|
1402
1402
|
'|--------|------|',
|
|
1403
|
-
'|
|
|
1404
|
-
'|
|
|
1403
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1404
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1405
1405
|
'',
|
|
1406
1406
|
'---',
|
|
1407
1407
|
`*🤖 이 댓글은 ${contextType} Preview 시스템에 의해 자동 생성되었습니다.*`
|
|
@@ -1415,7 +1415,7 @@ jobs:
|
|
|
1415
1415
|
`| **컨테이너** | \`${projectName}-pr-${number}\` |`,
|
|
1416
1416
|
'| **상태** | 🔴 Not Found |',
|
|
1417
1417
|
'',
|
|
1418
|
-
'배포하려면:
|
|
1418
|
+
'배포하려면: `/wizard server build`',
|
|
1419
1419
|
'',
|
|
1420
1420
|
'---',
|
|
1421
1421
|
`*🤖 이 댓글은 ${contextType} Preview 시스템에 의해 자동 생성되었습니다.*`
|
|
@@ -1849,17 +1849,17 @@ jobs:
|
|
|
1849
1849
|
'### 📋 명령어',
|
|
1850
1850
|
'| 명령어 | 설명 |',
|
|
1851
1851
|
'|--------|------|',
|
|
1852
|
-
'|
|
|
1853
|
-
'|
|
|
1854
|
-
'|
|
|
1852
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1853
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1854
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
1855
1855
|
'',
|
|
1856
1856
|
'<details>',
|
|
1857
1857
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
1858
1858
|
'',
|
|
1859
1859
|
'```',
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1860
|
+
`/wizard server build ${branchName}`,
|
|
1861
|
+
`/wizard server destroy ${branchName}`,
|
|
1862
|
+
`/wizard server status ${branchName}`,
|
|
1863
1863
|
'```',
|
|
1864
1864
|
'</details>',
|
|
1865
1865
|
'',
|
|
@@ -1920,7 +1920,7 @@ jobs:
|
|
|
1920
1920
|
'',
|
|
1921
1921
|
'### 💡 다음 단계',
|
|
1922
1922
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
1923
|
-
`2. 문제를 수정한 후 다시 시도하세요:
|
|
1923
|
+
`2. 문제를 수정한 후 다시 시도하세요: \`/wizard server build ${branchName}\``,
|
|
1924
1924
|
'',
|
|
1925
1925
|
'---',
|
|
1926
1926
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2050,7 +2050,7 @@ jobs:
|
|
|
2050
2050
|
`| **컨테이너** | \`${containerName}\` |`,
|
|
2051
2051
|
'| **상태** | 삭제됨 |',
|
|
2052
2052
|
'',
|
|
2053
|
-
`다시 배포하려면:
|
|
2053
|
+
`다시 배포하려면: \`/wizard server build ${branchName}\``,
|
|
2054
2054
|
'',
|
|
2055
2055
|
'---',
|
|
2056
2056
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2161,8 +2161,8 @@ jobs:
|
|
|
2161
2161
|
'### 📋 명령어',
|
|
2162
2162
|
'| 명령어 | 설명 |',
|
|
2163
2163
|
'|--------|------|',
|
|
2164
|
-
`|
|
|
2165
|
-
`|
|
|
2164
|
+
`| \`/wizard server build ${branchName}\` | 최신 커밋으로 재배포 |`,
|
|
2165
|
+
`| \`/wizard server destroy ${branchName}\` | Preview 환경 삭제 |`,
|
|
2166
2166
|
'',
|
|
2167
2167
|
'---',
|
|
2168
2168
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2177,7 +2177,7 @@ jobs:
|
|
|
2177
2177
|
`| **컨테이너** | \`${containerName}\` |`,
|
|
2178
2178
|
'| **상태** | 🔴 Not Found |',
|
|
2179
2179
|
'',
|
|
2180
|
-
`배포하려면:
|
|
2180
|
+
`배포하려면: \`/wizard server build ${branchName}\``,
|
|
2181
2181
|
'',
|
|
2182
2182
|
'---',
|
|
2183
2183
|
'*🤖 이 댓글은 Custom Branch Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
# ===================================================================
|
|
16
16
|
#
|
|
17
17
|
# 🚀 사용법:
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
18
|
+
# /wizard server build - PR/Issue 빌드 및 배포
|
|
19
|
+
# /wizard server destroy - Preview 환경 삭제
|
|
20
|
+
# /wizard server status - 현재 상태 확인
|
|
21
21
|
#
|
|
22
22
|
# 📊 리소스 네이밍 규칙:
|
|
23
23
|
# - 컨테이너: {PROJECT_NAME}-pr-{PR번호}
|
|
@@ -65,7 +65,7 @@ env:
|
|
|
65
65
|
|
|
66
66
|
# Issue Helper 댓글 마커 (프로젝트별 수정 필요)
|
|
67
67
|
# Issue 댓글에서 브랜치명을 추출할 때 사용
|
|
68
|
-
ISSUE_HELPER_MARKER: '
|
|
68
|
+
ISSUE_HELPER_MARKER: '<!-- project-auto-wizard issue helper -->'
|
|
69
69
|
|
|
70
70
|
# Health Check 설정 (프로젝트별 수정 필요)
|
|
71
71
|
# - HEALTH_CHECK_PATH: HTTP Health Check 경로 (빈값이면 HTTP 체크 건너뜀)
|
|
@@ -115,7 +115,7 @@ jobs:
|
|
|
115
115
|
is_custom_branch: ${{ steps.parse.outputs.is_custom_branch }}
|
|
116
116
|
steps:
|
|
117
117
|
- name: 댓글에 👀 리액션 추가
|
|
118
|
-
if: contains(github.event.comment.body, '
|
|
118
|
+
if: contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server')
|
|
119
119
|
uses: actions/github-script@v9
|
|
120
120
|
with:
|
|
121
121
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -143,8 +143,8 @@ jobs:
|
|
|
143
143
|
fi
|
|
144
144
|
|
|
145
145
|
# 명령어 파싱 (브랜치 파라미터 지원)
|
|
146
|
-
# 형식:
|
|
147
|
-
if [[ "$COMMENT" =~
|
|
146
|
+
# 형식: /wizard server <command> [브랜치명]
|
|
147
|
+
if [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
|
|
148
148
|
echo "command=build" >> $GITHUB_OUTPUT
|
|
149
149
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
150
150
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -155,7 +155,7 @@ jobs:
|
|
|
155
155
|
echo "is_custom_branch=false" >> $GITHUB_OUTPUT
|
|
156
156
|
echo "✅ 명령어 감지: build"
|
|
157
157
|
fi
|
|
158
|
-
elif [[ "$COMMENT" =~
|
|
158
|
+
elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+destroy([[:space:]]+([^[:space:]]+))? ]]; then
|
|
159
159
|
echo "command=destroy" >> $GITHUB_OUTPUT
|
|
160
160
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
161
161
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -166,7 +166,7 @@ jobs:
|
|
|
166
166
|
echo "is_custom_branch=false" >> $GITHUB_OUTPUT
|
|
167
167
|
echo "✅ 명령어 감지: destroy"
|
|
168
168
|
fi
|
|
169
|
-
elif [[ "$COMMENT" =~
|
|
169
|
+
elif [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+status([[:space:]]+([^[:space:]]+))? ]]; then
|
|
170
170
|
echo "command=status" >> $GITHUB_OUTPUT
|
|
171
171
|
echo "is_valid=true" >> $GITHUB_OUTPUT
|
|
172
172
|
if [[ -n "${BASH_REMATCH[2]}" ]]; then
|
|
@@ -179,7 +179,7 @@ jobs:
|
|
|
179
179
|
fi
|
|
180
180
|
else
|
|
181
181
|
echo "is_valid=false" >> $GITHUB_OUTPUT
|
|
182
|
-
echo "ℹ️
|
|
182
|
+
echo "ℹ️ /wizard server 명령어가 아님"
|
|
183
183
|
fi
|
|
184
184
|
|
|
185
185
|
# -----------------------------------------------------------------
|
|
@@ -292,13 +292,13 @@ jobs:
|
|
|
292
292
|
# env:
|
|
293
293
|
# VERTEX_SA_KEY: ${{ secrets.VERTEX_SA_KEY }}
|
|
294
294
|
# run: |
|
|
295
|
-
# echo "$VERTEX_SA_KEY" | sed 's/\\n/\n/g' >
|
|
295
|
+
# echo "$VERTEX_SA_KEY" | sed 's/\\n/\n/g' > ./<모듈명>/src/main/resources/vertex-ai-key.json
|
|
296
296
|
|
|
297
297
|
# - name: "[선택] Firebase Admin SDK 생성"
|
|
298
298
|
# env:
|
|
299
299
|
# FIREBASE_KEY_JSON: ${{ secrets.FIREBASE_KEY_JSON }}
|
|
300
300
|
# run: |
|
|
301
|
-
# echo "$FIREBASE_KEY_JSON" | sed 's/\\n/\n/g' >
|
|
301
|
+
# echo "$FIREBASE_KEY_JSON" | sed 's/\\n/\n/g' > ./<모듈명>/src/main/resources/firebase-admin-sdk.json
|
|
302
302
|
|
|
303
303
|
# =================================================================
|
|
304
304
|
# ⚠️ [영역 2 끝] 프로젝트별 Secret 파일 생성 끝
|
|
@@ -606,17 +606,17 @@ jobs:
|
|
|
606
606
|
'### 📋 명령어',
|
|
607
607
|
'| 명령어 | 설명 |',
|
|
608
608
|
'|--------|------|',
|
|
609
|
-
'|
|
|
610
|
-
'|
|
|
611
|
-
'|
|
|
609
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
610
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
611
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
612
612
|
'',
|
|
613
613
|
'<details>',
|
|
614
614
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
615
615
|
'',
|
|
616
616
|
'```',
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
617
|
+
`/wizard server build ${branchName}`,
|
|
618
|
+
`/wizard server destroy ${branchName}`,
|
|
619
|
+
`/wizard server status ${branchName}`,
|
|
620
620
|
'```',
|
|
621
621
|
'</details>',
|
|
622
622
|
'',
|
|
@@ -693,7 +693,7 @@ jobs:
|
|
|
693
693
|
'',
|
|
694
694
|
'### 💡 다음 단계',
|
|
695
695
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
696
|
-
'2. 문제를 수정한 후 다시 시도하세요:
|
|
696
|
+
'2. 문제를 수정한 후 다시 시도하세요: `/wizard server build`',
|
|
697
697
|
'',
|
|
698
698
|
'---',
|
|
699
699
|
'*🤖 이 댓글은 PR Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1278,17 +1278,17 @@ jobs:
|
|
|
1278
1278
|
'### 📋 명령어',
|
|
1279
1279
|
'| 명령어 | 설명 |',
|
|
1280
1280
|
'|--------|------|',
|
|
1281
|
-
'|
|
|
1282
|
-
'|
|
|
1283
|
-
'|
|
|
1281
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1282
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1283
|
+
'| `/wizard server status` | 현재 상태 확인 |',
|
|
1284
1284
|
'',
|
|
1285
1285
|
'<details>',
|
|
1286
1286
|
'<summary>🔧 고급 명령어 (다른 Issue/PR에서 제어)</summary>',
|
|
1287
1287
|
'',
|
|
1288
1288
|
'```',
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1289
|
+
`/wizard server build ${branchName}`,
|
|
1290
|
+
`/wizard server destroy ${branchName}`,
|
|
1291
|
+
`/wizard server status ${branchName}`,
|
|
1292
1292
|
'```',
|
|
1293
1293
|
'</details>',
|
|
1294
1294
|
'',
|
|
@@ -1362,7 +1362,7 @@ jobs:
|
|
|
1362
1362
|
'',
|
|
1363
1363
|
'### 💡 다음 단계',
|
|
1364
1364
|
'1. 위 링크에서 빌드/배포 로그를 확인하세요',
|
|
1365
|
-
'2. 문제를 수정한 후 다시 시도하세요:
|
|
1365
|
+
'2. 문제를 수정한 후 다시 시도하세요: `/wizard server build`',
|
|
1366
1366
|
'',
|
|
1367
1367
|
'---',
|
|
1368
1368
|
'*🤖 이 댓글은 Issue Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1393,7 +1393,7 @@ jobs:
|
|
|
1393
1393
|
if: |
|
|
1394
1394
|
(github.event_name == 'pull_request' && github.event.action == 'closed') ||
|
|
1395
1395
|
(github.event_name == 'issues' && github.event.action == 'closed') ||
|
|
1396
|
-
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '
|
|
1396
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '/wizard') && contains(github.event.comment.body, 'server destroy'))
|
|
1397
1397
|
runs-on: ubuntu-latest
|
|
1398
1398
|
steps:
|
|
1399
1399
|
- name: PR/Issue 번호 가져오기
|
|
@@ -1474,7 +1474,7 @@ jobs:
|
|
|
1474
1474
|
`| **컨테이너** | \`${projectName}-pr-${number}\` |`,
|
|
1475
1475
|
'| **상태** | 삭제됨 |',
|
|
1476
1476
|
'',
|
|
1477
|
-
'다시 배포하려면:
|
|
1477
|
+
'다시 배포하려면: `/wizard server build`',
|
|
1478
1478
|
'',
|
|
1479
1479
|
'---',
|
|
1480
1480
|
'*🤖 이 댓글은 PR/Issue Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -1573,8 +1573,8 @@ jobs:
|
|
|
1573
1573
|
'### 📋 명령어',
|
|
1574
1574
|
'| 명령어 | 설명 |',
|
|
1575
1575
|
'|--------|------|',
|
|
1576
|
-
'|
|
|
1577
|
-
'|
|
|
1576
|
+
'| `/wizard server build` | 최신 커밋으로 재배포 |',
|
|
1577
|
+
'| `/wizard server destroy` | Preview 환경 삭제 |',
|
|
1578
1578
|
'',
|
|
1579
1579
|
'---',
|
|
1580
1580
|
`*🤖 이 댓글은 ${contextType} Preview 시스템에 의해 자동 생성되었습니다.*`
|
|
@@ -1588,7 +1588,7 @@ jobs:
|
|
|
1588
1588
|
`| **컨테이너** | \`${projectName}-pr-${number}\` |`,
|
|
1589
1589
|
'| **상태** | 🔴 Not Found |',
|
|
1590
1590
|
'',
|
|
1591
|
-
'배포하려면:
|
|
1591
|
+
'배포하려면: `/wizard server build`',
|
|
1592
1592
|
'',
|
|
1593
1593
|
'---',
|
|
1594
1594
|
`*🤖 이 댓글은 ${contextType} Preview 시스템에 의해 자동 생성되었습니다.*`
|
|
@@ -1605,7 +1605,7 @@ jobs:
|
|
|
1605
1605
|
# ============================================================
|
|
1606
1606
|
# Custom Branch Preview Jobs
|
|
1607
1607
|
# 특정 브랜치를 지정하여 빌드/삭제/상태 확인하는 기능
|
|
1608
|
-
# 명령어:
|
|
1608
|
+
# 명령어: /wizard server build <브랜치명>
|
|
1609
1609
|
# ============================================================
|
|
1610
1610
|
|
|
1611
1611
|
build-preview-custom-branch:
|
|
@@ -1984,9 +1984,9 @@ jobs:
|
|
|
1984
1984
|
'### 📋 명령어',
|
|
1985
1985
|
'| 명령어 | 설명 |',
|
|
1986
1986
|
'|--------|------|',
|
|
1987
|
-
`|
|
|
1988
|
-
`|
|
|
1989
|
-
`|
|
|
1987
|
+
`| \`/wizard server build ${branchName}\` | 최신 커밋으로 재배포 |`,
|
|
1988
|
+
`| \`/wizard server destroy ${branchName}\` | Preview 환경 삭제 |`,
|
|
1989
|
+
`| \`/wizard server status ${branchName}\` | 현재 상태 확인 |`,
|
|
1990
1990
|
'',
|
|
1991
1991
|
'---',
|
|
1992
1992
|
'*🤖 이 댓글은 Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2154,7 +2154,7 @@ jobs:
|
|
|
2154
2154
|
`| **브랜치** | \`${branchName}\` |`,
|
|
2155
2155
|
`| **컨테이너** | \`${containerName}\` |`,
|
|
2156
2156
|
'',
|
|
2157
|
-
`다시 배포하려면:
|
|
2157
|
+
`다시 배포하려면: \`/wizard server build ${branchName}\``,
|
|
2158
2158
|
'',
|
|
2159
2159
|
'---',
|
|
2160
2160
|
'*🤖 이 댓글은 Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2247,8 +2247,8 @@ jobs:
|
|
|
2247
2247
|
'### 📋 명령어',
|
|
2248
2248
|
'| 명령어 | 설명 |',
|
|
2249
2249
|
'|--------|------|',
|
|
2250
|
-
`|
|
|
2251
|
-
`|
|
|
2250
|
+
`| \`/wizard server build ${branchName}\` | 최신 커밋으로 재배포 |`,
|
|
2251
|
+
`| \`/wizard server destroy ${branchName}\` | Preview 환경 삭제 |`,
|
|
2252
2252
|
'',
|
|
2253
2253
|
'---',
|
|
2254
2254
|
'*🤖 이 댓글은 Preview 시스템에 의해 자동 생성되었습니다.*'
|
|
@@ -2263,7 +2263,7 @@ jobs:
|
|
|
2263
2263
|
`| **컨테이너** | \`${containerName}\` |`,
|
|
2264
2264
|
'| **상태** | 🔴 Not Found |',
|
|
2265
2265
|
'',
|
|
2266
|
-
`배포하려면:
|
|
2266
|
+
`배포하려면: \`/wizard server build ${branchName}\``,
|
|
2267
2267
|
'',
|
|
2268
2268
|
'---',
|
|
2269
2269
|
'*🤖 이 댓글은 Preview 시스템에 의해 자동 생성되었습니다.*'
|
package/src/core/verify.js
CHANGED
|
@@ -6,8 +6,8 @@ import { join } from "node:path";
|
|
|
6
6
|
import { existsSync, readFileSync } from "node:fs";
|
|
7
7
|
|
|
8
8
|
// 치환 대상이 아닌 토큰 — 워크플로우 스크립트 안의 heredoc 구분자다. 값이 아니라 문법이므로
|
|
9
|
-
// 미치환 검사에서 제외한다. (예: cat <<'
|
|
10
|
-
const SENTINEL_RE = /^
|
|
9
|
+
// 미치환 검사에서 제외한다. (예: cat <<'__WIZARD_FILE_CONTENT_EOF__')
|
|
10
|
+
const SENTINEL_RE = /^__WIZARD_[A-Z0-9_]*__$/;
|
|
11
11
|
const PLACEHOLDER_RE = /__[A-Z][A-Z0-9_]*__/g;
|
|
12
12
|
|
|
13
13
|
// 주석으로 죽어 있는 줄 — 실행되지 않으므로 검사 대상이 아니다.
|