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.
- package/README.md +24 -21
- package/package.json +2 -2
- package/payload/config/breaking-changes.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 +84 -31
- package/payload/scripts/version_manager.py +2 -2
- package/payload/version.yml.template +4 -2
- package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +30 -10
- package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +37 -12
- package/payload/workflows/common/PROJECT-COMMON-ISSUE-HELPER.yaml +3 -6
- package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +0 -12
- package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +27 -6
- package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +3 -7
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +7 -34
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +2 -25
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +2 -20
- package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +5 -30
- package/payload/workflows/flutter/PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml +0 -4
- package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +7 -51
- package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +5 -29
- package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +9 -29
- package/payload/workflows/go/PROJECT-GO-CI.yaml +5 -28
- package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +19 -99
- package/payload/workflows/go/PROJECT-GO-SIMPLE-CICD.yaml +18 -89
- package/payload/workflows/next/PROJECT-NEXT-CI.yaml +11 -41
- package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +9 -45
- package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +1 -27
- package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +14 -97
- package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +14 -92
- package/payload/workflows/react/PROJECT-REACT-CI.yaml +11 -40
- package/payload/workflows/react/PROJECT-REACT-CICD.yaml +9 -43
- package/payload/workflows/spring/{nexus/PROJECT-SPRING-NEXUS-CI.yml → PROJECT-SPRING-CI.yml} +2 -25
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +19 -63
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +19 -59
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +23 -86
- package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +20 -80
- package/src/cli/args.js +8 -15
- package/src/cli/help.js +2 -3
- package/src/commands/doctor.js +9 -8
- package/src/commands/dry-run.js +1 -1
- package/src/commands/full.js +9 -10
- package/src/commands/interactive-flutter.js +1 -1
- package/src/commands/interactive.js +34 -46
- package/src/commands/purge.js +2 -2
- package/src/commands/status.js +5 -6
- package/src/commands/uninstall.js +3 -4
- package/src/context.js +5 -6
- package/src/core/assets.js +2 -2
- package/src/core/baseline.js +1 -1
- package/src/core/branches.js +3 -3
- package/src/core/breaking-check.js +1 -1
- package/src/core/breaking.js +1 -1
- package/src/core/copy/flutter-app.js +2 -2
- package/src/core/copy/gitignore.js +8 -8
- package/src/core/copy/workflows.js +24 -69
- package/src/core/deploy-style.js +2 -2
- package/src/core/detect-fs.js +11 -11
- package/src/core/detect.js +7 -7
- package/src/core/flutter-options.js +1 -1
- package/src/core/installed-stores.js +1 -1
- package/src/core/logger.js +1 -1
- package/src/core/paths-resolve.js +1 -1
- package/src/core/removal-plan.js +4 -4
- package/src/core/verify.js +4 -4
- package/src/core/version-yml.js +27 -34
- package/src/core/wizard-env.js +4 -4
- package/src/index.js +14 -14
- package/src/ui/banner.js +2 -2
- package/src/ui/env-plan.js +10 -16
- package/src/ui/prompts.js +9 -14
- package/src/ui/status-cards.js +10 -12
- package/src/ui/summary.js +13 -13
- package/payload/workflows/common/secret-backup/PROJECT-COMMON-SECRET-FILE-UPLOAD.yaml +0 -210
- package/payload/workflows/spring/nexus/PROJECT-SPRING-GITHUB-PACKAGES-PUBLISH.yml +0 -92
- package/payload/workflows/spring/nexus/PROJECT-SPRING-NEXUS-PUBLISH.yml +0 -70
- package/src/core/options-ask.js +0 -102
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
# project-auto-wizard:managed-workflow
|
|
2
|
-
# ===================================================================
|
|
3
2
|
# Python FastAPI 빌드 검증 워크플로우 (CI Only)
|
|
4
|
-
# ===================================================================
|
|
5
|
-
#
|
|
6
|
-
# 설명:
|
|
7
3
|
# - {{MAIN_BRANCH}} 브랜치에 push 시 Docker 빌드가 정상적으로 되는지만 검증
|
|
8
4
|
# - 배포는 수행하지 않음 ({{MAIN_BRANCH}} 브랜치에서만 배포)
|
|
9
|
-
#
|
|
10
|
-
# ===================================================================
|
|
11
5
|
|
|
12
6
|
name: PROJECT-PYTHON-CI
|
|
13
7
|
|
|
14
|
-
# ===================================================================
|
|
15
|
-
# 트리거 설정
|
|
16
|
-
# ===================================================================
|
|
17
8
|
on:
|
|
18
9
|
push:
|
|
19
10
|
branches:
|
|
@@ -23,9 +14,6 @@ on:
|
|
|
23
14
|
- "{{DEVELOP_BRANCH}}" # {{DEVELOP_BRANCH}} 브랜치로의 PR 시 빌드 검증
|
|
24
15
|
workflow_dispatch: # 수동 실행 허용
|
|
25
16
|
|
|
26
|
-
# ===================================================================
|
|
27
|
-
# 환경 변수 설정
|
|
28
|
-
# ===================================================================
|
|
29
17
|
env:
|
|
30
18
|
# 프로젝트 고유 식별자 (컨테이너명, 이미지명, 도메인에 사용)
|
|
31
19
|
PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
|
|
@@ -33,9 +21,6 @@ env:
|
|
|
33
21
|
PROJECT_PATH: "." # @wizard auto:project-path
|
|
34
22
|
|
|
35
23
|
jobs:
|
|
36
|
-
# ===================================================================
|
|
37
|
-
# 변경 감지 (모노레포에서 이 프로젝트 경로가 바뀌었는지 판별)
|
|
38
|
-
# ===================================================================
|
|
39
24
|
changes:
|
|
40
25
|
name: 변경 감지
|
|
41
26
|
runs-on: ubuntu-latest
|
|
@@ -57,9 +42,6 @@ jobs:
|
|
|
57
42
|
project:
|
|
58
43
|
- '${{ env.PROJECT_PATH == '.' && '**' || format('{0}/**', env.PROJECT_PATH) }}'
|
|
59
44
|
|
|
60
|
-
# ===================================================================
|
|
61
|
-
# 빌드 검증 작업
|
|
62
|
-
# ===================================================================
|
|
63
45
|
build-check:
|
|
64
46
|
name: Python FastAPI 빌드 검증
|
|
65
47
|
runs-on: ubuntu-latest
|
|
@@ -67,11 +49,9 @@ jobs:
|
|
|
67
49
|
if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.project == 'true' }}
|
|
68
50
|
|
|
69
51
|
steps:
|
|
70
|
-
# 1. 소스코드 체크아웃
|
|
71
52
|
- name: 코드 체크아웃
|
|
72
53
|
uses: actions/checkout@v7
|
|
73
54
|
|
|
74
|
-
# 2. .env 파일 생성 (빌드 검증용)
|
|
75
55
|
- name: .env 파일 생성
|
|
76
56
|
run: |
|
|
77
57
|
cat > .env << 'EOF'
|
|
@@ -79,11 +59,9 @@ jobs:
|
|
|
79
59
|
EOF
|
|
80
60
|
echo "✅ .env 파일이 생성되었습니다"
|
|
81
61
|
|
|
82
|
-
# 3. Docker 빌드 환경 설정
|
|
83
62
|
- name: Docker 빌드환경 설정
|
|
84
63
|
uses: docker/setup-buildx-action@v3
|
|
85
64
|
|
|
86
|
-
# 4. Docker 이미지 빌드 (push 없이 검증만)
|
|
87
65
|
- name: Docker 이미지 빌드 검증
|
|
88
66
|
uses: docker/build-push-action@v5
|
|
89
67
|
with:
|
|
@@ -91,11 +69,9 @@ jobs:
|
|
|
91
69
|
file: ./Dockerfile
|
|
92
70
|
push: false # 푸시하지 않음 (빌드 검증만)
|
|
93
71
|
tags: ${{ env.PROJECT_NAME }}:build-check
|
|
94
|
-
# GitHub Actions 캐시 사용
|
|
95
72
|
cache-from: type=gha
|
|
96
73
|
cache-to: type=gha,mode=max
|
|
97
74
|
|
|
98
|
-
# 5. 빌드 성공 메시지
|
|
99
75
|
- name: 빌드 검증 완료
|
|
100
76
|
run: |
|
|
101
77
|
echo "✅ Docker 빌드 검증이 성공적으로 완료되었습니다!"
|
|
@@ -106,9 +82,7 @@ jobs:
|
|
|
106
82
|
echo " 📝 커밋: ${{ github.sha }}"
|
|
107
83
|
echo " ⏰ 검증 시간: $(date '+%Y-%m-%d %H:%M:%S')"
|
|
108
84
|
|
|
109
|
-
#
|
|
110
|
-
# CI Gate (required check로 등록할 단일 job)
|
|
111
|
-
# ===================================================================
|
|
85
|
+
# CI Gate: required check로 등록할 단일 job
|
|
112
86
|
ci-gate:
|
|
113
87
|
name: CI Gate
|
|
114
88
|
if: ${{ always() }}
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
# project-auto-wizard:managed-workflow
|
|
2
|
-
# ===================================================================
|
|
3
2
|
# Python/FastAPI PR Preview (SSH + Docker + Traefik)
|
|
4
|
-
# ===================================================================
|
|
5
|
-
#
|
|
6
3
|
# PR 또는 Issue 코멘트 명령어를 통해 Preview 환경을 자동으로 관리합니다.
|
|
7
4
|
# Traefik 리버스 프록시를 통해 동적 라우팅됩니다.
|
|
8
5
|
#
|
|
9
|
-
#
|
|
10
|
-
# 🔑 필수 GitHub Secrets
|
|
11
|
-
# ===================================================================
|
|
6
|
+
# 필수 GitHub Secrets
|
|
12
7
|
# ENV_FILE: .env 파일 전체 내용
|
|
13
8
|
# DOCKERHUB_USERNAME: Docker Hub 사용자명
|
|
14
9
|
# DOCKERHUB_TOKEN: Docker Hub 액세스 토큰
|
|
@@ -16,27 +11,23 @@
|
|
|
16
11
|
# SERVER_USER: SSH 사용자명
|
|
17
12
|
# SERVER_PASSWORD: SSH 비밀번호 (SSH_AUTH_METHOD=password일 때)
|
|
18
13
|
# SSH_KEY: SSH 개인키 .pem 내용 (SSH_AUTH_METHOD=key일 때, AWS EC2 등)
|
|
19
|
-
# ===================================================================
|
|
20
14
|
#
|
|
21
|
-
#
|
|
15
|
+
# 사용법
|
|
22
16
|
# /wizard server build - Preview 빌드 및 배포
|
|
23
17
|
# /wizard server destroy - Preview 환경 삭제
|
|
24
18
|
# /wizard server status - 현재 상태 확인
|
|
25
19
|
#
|
|
26
|
-
#
|
|
20
|
+
# 리소스 네이밍
|
|
27
21
|
# - 컨테이너: {PROJECT_NAME}-pr-{번호}
|
|
28
22
|
# - 도메인: {PROJECT_NAME}-pr-{번호}.pr.example.com
|
|
29
23
|
#
|
|
30
|
-
#
|
|
24
|
+
# 사전 요구사항
|
|
31
25
|
# - Traefik 컨테이너 실행 중 (traefik-network)
|
|
32
26
|
# - 와일드카드 DNS 설정: *.pr.example.com → 서버
|
|
33
|
-
# ===================================================================
|
|
34
27
|
|
|
35
28
|
name: PROJECT-PYTHON-PR-PREVIEW
|
|
36
29
|
|
|
37
|
-
#
|
|
38
|
-
# ⚠️ [영역 1] 프로젝트별 설정 - 다른 프로젝트에서 사용 시 이 섹션만 수정하세요
|
|
39
|
-
# ===================================================================
|
|
30
|
+
# 프로젝트별 설정: 다른 프로젝트에서 사용 시 이 섹션만 수정하세요
|
|
40
31
|
env:
|
|
41
32
|
# 프로젝트 고유 식별자 (컨테이너명, 이미지명, 도메인에 사용)
|
|
42
33
|
PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
|
|
@@ -45,7 +36,7 @@ env:
|
|
|
45
36
|
DOCKERFILE_PATH: './Dockerfile'
|
|
46
37
|
INTERNAL_PORT: '8000'
|
|
47
38
|
|
|
48
|
-
#
|
|
39
|
+
# 볼륨 마운트 설정 (프로젝트별 수정 필요, 빈값이면 마운트 안함)
|
|
49
40
|
PROJECT_TARGET_DIR: "__PROJECT_TARGET_DIR__" # @wizard ask:/volume1/projects/__PROJECT_NAME__
|
|
50
41
|
PROJECT_MNT_DIR: "__PROJECT_MNT_DIR__" # @wizard ask:/mnt/__PROJECT_NAME__
|
|
51
42
|
|
|
@@ -54,7 +45,7 @@ env:
|
|
|
54
45
|
PREVIEW_DOMAIN_SUFFIX: "__PREVIEW_DOMAIN_SUFFIX__" # @wizard ask:pr.example.com
|
|
55
46
|
PREVIEW_PORT: '8079'
|
|
56
47
|
|
|
57
|
-
#
|
|
48
|
+
# SSH 인증 방식: "password"(Synology·일반 서버) | "key"(AWS EC2·.pem)
|
|
58
49
|
# password → SERVER_PASSWORD secret 사용
|
|
59
50
|
# key → SSH_KEY secret 사용 (.pem 파일 전체 내용을 secret 값으로)
|
|
60
51
|
SSH_AUTH_METHOD: "password" # @wizard ask:password
|
|
@@ -79,9 +70,6 @@ env:
|
|
|
79
70
|
HEALTH_CHECK_LOG_PATTERN: 'Uvicorn running on|Application startup complete'
|
|
80
71
|
API_DOCS_PATH: '/docs'
|
|
81
72
|
|
|
82
|
-
# ===================================================================
|
|
83
|
-
# 트리거 설정
|
|
84
|
-
# ===================================================================
|
|
85
73
|
on:
|
|
86
74
|
issue_comment:
|
|
87
75
|
types: [created] # PR 댓글 + Issue 댓글
|
|
@@ -95,13 +83,8 @@ permissions:
|
|
|
95
83
|
pull-requests: write
|
|
96
84
|
issues: write
|
|
97
85
|
|
|
98
|
-
# ===================================================================
|
|
99
|
-
# Jobs
|
|
100
|
-
# ===================================================================
|
|
101
86
|
jobs:
|
|
102
|
-
# -----------------------------------------------------------------
|
|
103
87
|
# Job 1: 명령어 파싱 (PR 댓글 + Issue 댓글 모두 지원)
|
|
104
|
-
# -----------------------------------------------------------------
|
|
105
88
|
check-command:
|
|
106
89
|
name: 명령어 확인
|
|
107
90
|
if: github.event_name == 'issue_comment'
|
|
@@ -132,7 +115,6 @@ jobs:
|
|
|
132
115
|
COMMENT: ${{ github.event.comment.body }}
|
|
133
116
|
IS_PR: ${{ github.event.issue.pull_request != null }}
|
|
134
117
|
run: |
|
|
135
|
-
# PR인지 Issue인지 확인
|
|
136
118
|
if [[ "$IS_PR" == "true" ]]; then
|
|
137
119
|
echo "is_pr=true" >> $GITHUB_OUTPUT
|
|
138
120
|
echo "ℹ️ PR 댓글에서 명령어 감지"
|
|
@@ -141,7 +123,6 @@ jobs:
|
|
|
141
123
|
echo "ℹ️ Issue 댓글에서 명령어 감지"
|
|
142
124
|
fi
|
|
143
125
|
|
|
144
|
-
# 명령어 파싱 (브랜치 파라미터 지원)
|
|
145
126
|
# 형식: /wizard server <command> [브랜치명]
|
|
146
127
|
if [[ "$COMMENT" =~ /wizard[[:space:]]+server[[:space:]]+build([[:space:]]+([^[:space:]]+))? ]]; then
|
|
147
128
|
echo "command=build" >> $GITHUB_OUTPUT
|
|
@@ -181,9 +162,7 @@ jobs:
|
|
|
181
162
|
echo "ℹ️ /wizard server 명령어가 아님"
|
|
182
163
|
fi
|
|
183
164
|
|
|
184
|
-
# -----------------------------------------------------------------
|
|
185
165
|
# Job 2-1: 빌드 & 배포 (PR 댓글에서 실행)
|
|
186
|
-
# -----------------------------------------------------------------
|
|
187
166
|
build-preview-pr:
|
|
188
167
|
name: Preview 빌드 & 배포 (PR)
|
|
189
168
|
needs: check-command
|
|
@@ -208,9 +187,7 @@ jobs:
|
|
|
208
187
|
core.setOutput('sha', pr.data.head.sha.substring(0, 7));
|
|
209
188
|
return pr.data.number;
|
|
210
189
|
|
|
211
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
212
190
|
# 진행 상황 댓글 시스템
|
|
213
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
214
191
|
- name: 진행 상황 댓글 생성
|
|
215
192
|
id: progress
|
|
216
193
|
uses: actions/github-script@v9
|
|
@@ -250,17 +227,12 @@ jobs:
|
|
|
250
227
|
with:
|
|
251
228
|
ref: ${{ steps.pr.outputs.ref }}
|
|
252
229
|
|
|
253
|
-
#
|
|
254
|
-
# ⚠️ [영역 2] 환경변수 파일 생성
|
|
255
|
-
# =================================================================
|
|
230
|
+
# 환경변수 파일 생성 (프로젝트별 수정 영역)
|
|
256
231
|
- name: "[필수] .env 파일 생성"
|
|
257
232
|
run: |
|
|
258
233
|
cat << 'EOF' > .env
|
|
259
234
|
${{ secrets.ENV_FILE }}
|
|
260
235
|
EOF
|
|
261
|
-
# =================================================================
|
|
262
|
-
# ⚠️ [영역 2 끝] 환경변수 파일 생성 끝
|
|
263
|
-
# =================================================================
|
|
264
236
|
|
|
265
237
|
- name: Docker 로그인
|
|
266
238
|
uses: docker/login-action@v3
|
|
@@ -333,11 +305,10 @@ jobs:
|
|
|
333
305
|
script: |
|
|
334
306
|
set -e
|
|
335
307
|
|
|
336
|
-
# 환경 변수 설정 (배포 서버용)
|
|
337
308
|
export PATH=$PATH:/usr/local/bin
|
|
338
309
|
export PW="${{ secrets.SERVER_PASSWORD }}"
|
|
339
310
|
|
|
340
|
-
#
|
|
311
|
+
# SSH 인증 방식에 따른 sudo 추상화
|
|
341
312
|
SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
|
|
342
313
|
if [ "${SSH_AUTH_METHOD}" = "key" ]; then
|
|
343
314
|
SUDO() { sudo "$@"; }
|
|
@@ -346,7 +317,6 @@ jobs:
|
|
|
346
317
|
fi
|
|
347
318
|
echo "🔐 SSH 인증 방식: ${SSH_AUTH_METHOD}"
|
|
348
319
|
|
|
349
|
-
# 변수 설정
|
|
350
320
|
PR_NUMBER=${{ github.event.issue.number }}
|
|
351
321
|
PROJECT_NAME="${{ env.PROJECT_NAME }}"
|
|
352
322
|
CONTAINER_NAME="${PROJECT_NAME}-pr-${PR_NUMBER}"
|
|
@@ -364,21 +334,17 @@ jobs:
|
|
|
364
334
|
echo "🌐 도메인: ${DOMAIN}"
|
|
365
335
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
366
336
|
|
|
367
|
-
# 이미지 Pull
|
|
368
337
|
echo "📥 Docker 이미지 Pull 중..."
|
|
369
338
|
SUDO docker pull "${IMAGE}"
|
|
370
339
|
|
|
371
|
-
# 기존 컨테이너 삭제
|
|
372
340
|
echo "🗑️ 기존 컨테이너 정리 중..."
|
|
373
341
|
SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
|
|
374
342
|
|
|
375
|
-
# 볼륨 마운트 옵션 구성
|
|
376
343
|
VOLUME_OPTS="-v /etc/localtime:/etc/localtime:ro"
|
|
377
344
|
if [ -n "${{ env.PROJECT_TARGET_DIR }}" ] && [ -n "${{ env.PROJECT_MNT_DIR }}" ]; then
|
|
378
345
|
VOLUME_OPTS="$VOLUME_OPTS -v ${{ env.PROJECT_TARGET_DIR }}:${{ env.PROJECT_MNT_DIR }}"
|
|
379
346
|
fi
|
|
380
347
|
|
|
381
|
-
# 새 컨테이너 실행
|
|
382
348
|
echo "🐳 새 컨테이너 실행 중..."
|
|
383
349
|
SUDO docker run -d \
|
|
384
350
|
--name "${CONTAINER_NAME}" \
|
|
@@ -392,11 +358,9 @@ jobs:
|
|
|
392
358
|
$VOLUME_OPTS \
|
|
393
359
|
"${IMAGE}"
|
|
394
360
|
|
|
395
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
396
361
|
# Health Check (최대 120초 대기) - 하이브리드 방식
|
|
397
362
|
# 1. HEALTH_CHECK_PATH가 설정되어 있으면 HTTP 체크 시도
|
|
398
363
|
# 2. 폴백: 로그 패턴 매칭 (HEALTH_CHECK_LOG_PATTERN)
|
|
399
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
400
364
|
echo ""
|
|
401
365
|
echo "⏳ Health Check 시작 (최대 120초 대기)..."
|
|
402
366
|
HEALTH_PATH="${{ env.HEALTH_CHECK_PATH }}"
|
|
@@ -616,9 +580,7 @@ jobs:
|
|
|
616
580
|
});
|
|
617
581
|
}
|
|
618
582
|
|
|
619
|
-
# -----------------------------------------------------------------
|
|
620
583
|
# Job 2-2: Issue에서 브랜치명 추출
|
|
621
|
-
# -----------------------------------------------------------------
|
|
622
584
|
get-branch-from-issue:
|
|
623
585
|
name: Issue에서 브랜치 추출
|
|
624
586
|
needs: check-command
|
|
@@ -706,9 +668,7 @@ jobs:
|
|
|
706
668
|
body: body
|
|
707
669
|
});
|
|
708
670
|
|
|
709
|
-
# -----------------------------------------------------------------
|
|
710
671
|
# Job 2-3: 빌드 & 배포 (Issue 댓글에서 실행)
|
|
711
|
-
# -----------------------------------------------------------------
|
|
712
672
|
build-preview-issue:
|
|
713
673
|
name: Preview 빌드 & 배포 (Issue)
|
|
714
674
|
needs: [check-command, get-branch-from-issue]
|
|
@@ -784,12 +744,9 @@ jobs:
|
|
|
784
744
|
run: |
|
|
785
745
|
echo "ref=${{ needs.get-branch-from-issue.outputs.branch_name }}" >> $GITHUB_OUTPUT
|
|
786
746
|
echo "issue_number=${{ needs.get-branch-from-issue.outputs.issue_number }}" >> $GITHUB_OUTPUT
|
|
787
|
-
# 브랜치의 최신 커밋 SHA 가져오기
|
|
788
747
|
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
|
|
789
748
|
|
|
790
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
791
749
|
# 진행 상황 댓글 시스템
|
|
792
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
793
750
|
- name: 진행 상황 댓글 생성
|
|
794
751
|
if: steps.check_branch.outputs.exists == 'true'
|
|
795
752
|
id: progress
|
|
@@ -834,18 +791,13 @@ jobs:
|
|
|
834
791
|
with:
|
|
835
792
|
ref: ${{ needs.get-branch-from-issue.outputs.branch_name }}
|
|
836
793
|
|
|
837
|
-
#
|
|
838
|
-
# ⚠️ [영역 2] 환경변수 파일 생성
|
|
839
|
-
# =================================================================
|
|
794
|
+
# 환경변수 파일 생성 (프로젝트별 수정 영역)
|
|
840
795
|
- name: "[필수] .env 파일 생성"
|
|
841
796
|
if: steps.check_branch.outputs.exists == 'true'
|
|
842
797
|
run: |
|
|
843
798
|
cat << 'EOF' > .env
|
|
844
799
|
${{ secrets.ENV_FILE }}
|
|
845
800
|
EOF
|
|
846
|
-
# =================================================================
|
|
847
|
-
# ⚠️ [영역 2 끝] 환경변수 파일 생성 끝
|
|
848
|
-
# =================================================================
|
|
849
801
|
|
|
850
802
|
- name: Docker 로그인
|
|
851
803
|
if: steps.check_branch.outputs.exists == 'true'
|
|
@@ -926,11 +878,10 @@ jobs:
|
|
|
926
878
|
script: |
|
|
927
879
|
set -e
|
|
928
880
|
|
|
929
|
-
# 환경 변수 설정 (배포 서버용)
|
|
930
881
|
export PATH=$PATH:/usr/local/bin
|
|
931
882
|
export PW="${{ secrets.SERVER_PASSWORD }}"
|
|
932
883
|
|
|
933
|
-
#
|
|
884
|
+
# SSH 인증 방식에 따른 sudo 추상화
|
|
934
885
|
SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
|
|
935
886
|
if [ "${SSH_AUTH_METHOD}" = "key" ]; then
|
|
936
887
|
SUDO() { sudo "$@"; }
|
|
@@ -939,7 +890,6 @@ jobs:
|
|
|
939
890
|
fi
|
|
940
891
|
echo "🔐 SSH 인증 방식: ${SSH_AUTH_METHOD}"
|
|
941
892
|
|
|
942
|
-
# 변수 설정
|
|
943
893
|
ISSUE_NUMBER=${{ needs.get-branch-from-issue.outputs.issue_number }}
|
|
944
894
|
PROJECT_NAME="${{ env.PROJECT_NAME }}"
|
|
945
895
|
CONTAINER_NAME="${PROJECT_NAME}-pr-${ISSUE_NUMBER}"
|
|
@@ -957,21 +907,17 @@ jobs:
|
|
|
957
907
|
echo "🌐 도메인: ${DOMAIN}"
|
|
958
908
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
959
909
|
|
|
960
|
-
# 이미지 Pull
|
|
961
910
|
echo "📥 Docker 이미지 Pull 중..."
|
|
962
911
|
SUDO docker pull "${IMAGE}"
|
|
963
912
|
|
|
964
|
-
# 기존 컨테이너 삭제
|
|
965
913
|
echo "🗑️ 기존 컨테이너 정리 중..."
|
|
966
914
|
SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
|
|
967
915
|
|
|
968
|
-
# 볼륨 마운트 옵션 구성
|
|
969
916
|
VOLUME_OPTS="-v /etc/localtime:/etc/localtime:ro"
|
|
970
917
|
if [ -n "${{ env.PROJECT_TARGET_DIR }}" ] && [ -n "${{ env.PROJECT_MNT_DIR }}" ]; then
|
|
971
918
|
VOLUME_OPTS="$VOLUME_OPTS -v ${{ env.PROJECT_TARGET_DIR }}:${{ env.PROJECT_MNT_DIR }}"
|
|
972
919
|
fi
|
|
973
920
|
|
|
974
|
-
# 새 컨테이너 실행
|
|
975
921
|
echo "🐳 새 컨테이너 실행 중..."
|
|
976
922
|
SUDO docker run -d \
|
|
977
923
|
--name "${CONTAINER_NAME}" \
|
|
@@ -985,11 +931,9 @@ jobs:
|
|
|
985
931
|
$VOLUME_OPTS \
|
|
986
932
|
"${IMAGE}"
|
|
987
933
|
|
|
988
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
989
934
|
# Health Check (최대 120초 대기) - 하이브리드 방식
|
|
990
935
|
# 1. HEALTH_CHECK_PATH가 설정되어 있으면 HTTP 체크 시도
|
|
991
936
|
# 2. 폴백: 로그 패턴 매칭 (HEALTH_CHECK_LOG_PATTERN)
|
|
992
|
-
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
993
937
|
echo ""
|
|
994
938
|
echo "⏳ Health Check 시작 (최대 120초 대기)..."
|
|
995
939
|
HEALTH_PATH="${{ env.HEALTH_CHECK_PATH }}"
|
|
@@ -1209,9 +1153,7 @@ jobs:
|
|
|
1209
1153
|
});
|
|
1210
1154
|
}
|
|
1211
1155
|
|
|
1212
|
-
# -----------------------------------------------------------------
|
|
1213
1156
|
# Job 3: Preview 삭제 (PR/Issue 닫힘 또는 destroy 명령)
|
|
1214
|
-
# -----------------------------------------------------------------
|
|
1215
1157
|
destroy-preview:
|
|
1216
1158
|
name: Preview 삭제
|
|
1217
1159
|
# needs 의존성 제거: PR/Issue 닫힘 이벤트에서도 독립적으로 실행되도록 함
|
|
@@ -1247,11 +1189,10 @@ jobs:
|
|
|
1247
1189
|
port: ${{ env.SSH_PORT }}
|
|
1248
1190
|
envs: SSH_AUTH_METHOD
|
|
1249
1191
|
script: |
|
|
1250
|
-
# 환경 변수 설정 (배포 서버용)
|
|
1251
1192
|
export PATH=$PATH:/usr/local/bin
|
|
1252
1193
|
export PW="${{ secrets.SERVER_PASSWORD }}"
|
|
1253
1194
|
|
|
1254
|
-
#
|
|
1195
|
+
# SSH 인증 방식에 따른 sudo 추상화
|
|
1255
1196
|
SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
|
|
1256
1197
|
if [ "${SSH_AUTH_METHOD}" = "key" ]; then
|
|
1257
1198
|
SUDO() { sudo "$@"; }
|
|
@@ -1272,11 +1213,9 @@ jobs:
|
|
|
1272
1213
|
echo "🔢 PR 번호: #${PR_NUMBER}"
|
|
1273
1214
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
1274
1215
|
|
|
1275
|
-
# 컨테이너 삭제
|
|
1276
1216
|
echo "🐳 컨테이너 삭제 중..."
|
|
1277
1217
|
SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
|
|
1278
1218
|
|
|
1279
|
-
# 이미지 삭제
|
|
1280
1219
|
echo "🖼️ 이미지 삭제 중..."
|
|
1281
1220
|
SUDO docker rmi "${IMAGE}" 2>/dev/null || true
|
|
1282
1221
|
|
|
@@ -1314,9 +1253,7 @@ jobs:
|
|
|
1314
1253
|
body: body
|
|
1315
1254
|
});
|
|
1316
1255
|
|
|
1317
|
-
# -----------------------------------------------------------------
|
|
1318
1256
|
# Job 4: 상태 확인 (PR/Issue 모두 지원)
|
|
1319
|
-
# -----------------------------------------------------------------
|
|
1320
1257
|
check-status:
|
|
1321
1258
|
name: Preview 상태 확인
|
|
1322
1259
|
needs: check-command
|
|
@@ -1333,7 +1270,6 @@ jobs:
|
|
|
1333
1270
|
key: ${{ secrets.SSH_KEY }}
|
|
1334
1271
|
port: ${{ env.SSH_PORT }}
|
|
1335
1272
|
script: |
|
|
1336
|
-
# 환경 변수 설정 (배포 서버용)
|
|
1337
1273
|
export PATH=$PATH:/usr/local/bin
|
|
1338
1274
|
|
|
1339
1275
|
NUMBER=${{ github.event.issue.number }}
|
|
@@ -1364,7 +1300,6 @@ jobs:
|
|
|
1364
1300
|
key: ${{ secrets.SSH_KEY }}
|
|
1365
1301
|
port: ${{ env.SSH_PORT }}
|
|
1366
1302
|
script: |
|
|
1367
|
-
# 환경 변수 설정 (배포 서버용)
|
|
1368
1303
|
export PATH=$PATH:/usr/local/bin
|
|
1369
1304
|
|
|
1370
1305
|
NUMBER=${{ github.event.issue.number }}
|
|
@@ -1429,9 +1364,7 @@ jobs:
|
|
|
1429
1364
|
body: body
|
|
1430
1365
|
});
|
|
1431
1366
|
|
|
1432
|
-
# -----------------------------------------------------------------
|
|
1433
1367
|
# Job 5: 커스텀 브랜치 빌드 & 배포
|
|
1434
|
-
# -----------------------------------------------------------------
|
|
1435
1368
|
build-preview-custom-branch:
|
|
1436
1369
|
name: Preview 빌드 & 배포 (Custom Branch)
|
|
1437
1370
|
needs: check-command
|
|
@@ -1525,7 +1458,6 @@ jobs:
|
|
|
1525
1458
|
SHA=$(git ls-remote https://github.com/${{ github.repository }}.git refs/heads/${{ needs.check-command.outputs.custom_branch }} | cut -c1-7)
|
|
1526
1459
|
echo "sha=$SHA" >> $GITHUB_OUTPUT
|
|
1527
1460
|
|
|
1528
|
-
# 진행 상황 댓글 생성
|
|
1529
1461
|
- name: 진행 상황 댓글 생성
|
|
1530
1462
|
if: steps.branch_info.outputs.branch_exists == 'true'
|
|
1531
1463
|
id: progress
|
|
@@ -1570,7 +1502,6 @@ jobs:
|
|
|
1570
1502
|
with:
|
|
1571
1503
|
ref: ${{ needs.check-command.outputs.custom_branch }}
|
|
1572
1504
|
|
|
1573
|
-
# 환경변수 파일 생성
|
|
1574
1505
|
- name: "[필수] .env 파일 생성"
|
|
1575
1506
|
if: steps.branch_info.outputs.branch_exists == 'true'
|
|
1576
1507
|
run: |
|
|
@@ -1669,11 +1600,10 @@ jobs:
|
|
|
1669
1600
|
script: |
|
|
1670
1601
|
set -e
|
|
1671
1602
|
|
|
1672
|
-
# 환경 변수 설정 (배포 서버용)
|
|
1673
1603
|
export PATH=$PATH:/usr/local/bin
|
|
1674
1604
|
export PW="${{ secrets.SERVER_PASSWORD }}"
|
|
1675
1605
|
|
|
1676
|
-
#
|
|
1606
|
+
# SSH 인증 방식에 따른 sudo 추상화
|
|
1677
1607
|
SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
|
|
1678
1608
|
if [ "${SSH_AUTH_METHOD}" = "key" ]; then
|
|
1679
1609
|
SUDO() { sudo "$@"; }
|
|
@@ -1682,7 +1612,6 @@ jobs:
|
|
|
1682
1612
|
fi
|
|
1683
1613
|
echo "🔐 SSH 인증 방식: ${SSH_AUTH_METHOD}"
|
|
1684
1614
|
|
|
1685
|
-
# 변수 설정
|
|
1686
1615
|
PROJECT_NAME="${{ env.PROJECT_NAME }}"
|
|
1687
1616
|
CONTAINER_NAME="${{ steps.container.outputs.name }}"
|
|
1688
1617
|
CONTAINER_SUFFIX="${{ steps.container.outputs.suffix }}"
|
|
@@ -1699,21 +1628,17 @@ jobs:
|
|
|
1699
1628
|
echo "🌐 도메인: ${DOMAIN}"
|
|
1700
1629
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
1701
1630
|
|
|
1702
|
-
# 이미지 Pull
|
|
1703
1631
|
echo "📥 Docker 이미지 Pull 중..."
|
|
1704
1632
|
SUDO docker pull "${IMAGE}"
|
|
1705
1633
|
|
|
1706
|
-
# 기존 컨테이너 삭제
|
|
1707
1634
|
echo "🗑️ 기존 컨테이너 정리 중..."
|
|
1708
1635
|
SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
|
|
1709
1636
|
|
|
1710
|
-
# 볼륨 마운트 옵션 구성
|
|
1711
1637
|
VOLUME_OPTS="-v /etc/localtime:/etc/localtime:ro"
|
|
1712
1638
|
if [ -n "${{ env.PROJECT_TARGET_DIR }}" ] && [ -n "${{ env.PROJECT_MNT_DIR }}" ]; then
|
|
1713
1639
|
VOLUME_OPTS="$VOLUME_OPTS -v ${{ env.PROJECT_TARGET_DIR }}:${{ env.PROJECT_MNT_DIR }}"
|
|
1714
1640
|
fi
|
|
1715
1641
|
|
|
1716
|
-
# 새 컨테이너 실행
|
|
1717
1642
|
echo "🐳 새 컨테이너 실행 중..."
|
|
1718
1643
|
SUDO docker run -d \
|
|
1719
1644
|
--name "${CONTAINER_NAME}" \
|
|
@@ -1727,7 +1652,6 @@ jobs:
|
|
|
1727
1652
|
$VOLUME_OPTS \
|
|
1728
1653
|
"${IMAGE}"
|
|
1729
1654
|
|
|
1730
|
-
# Health Check
|
|
1731
1655
|
echo ""
|
|
1732
1656
|
echo "⏳ Health Check 시작 (최대 120초 대기)..."
|
|
1733
1657
|
HEALTH_PATH="${{ env.HEALTH_CHECK_PATH }}"
|
|
@@ -1942,9 +1866,7 @@ jobs:
|
|
|
1942
1866
|
});
|
|
1943
1867
|
}
|
|
1944
1868
|
|
|
1945
|
-
# -----------------------------------------------------------------
|
|
1946
1869
|
# Job 6: 커스텀 브랜치 Preview 삭제
|
|
1947
|
-
# -----------------------------------------------------------------
|
|
1948
1870
|
destroy-preview-custom-branch:
|
|
1949
1871
|
name: Preview 삭제 (Custom Branch)
|
|
1950
1872
|
needs: check-command
|
|
@@ -1997,11 +1919,10 @@ jobs:
|
|
|
1997
1919
|
port: ${{ env.SSH_PORT }}
|
|
1998
1920
|
envs: SSH_AUTH_METHOD
|
|
1999
1921
|
script: |
|
|
2000
|
-
# 환경 변수 설정 (배포 서버용)
|
|
2001
1922
|
export PATH=$PATH:/usr/local/bin
|
|
2002
1923
|
export PW="${{ secrets.SERVER_PASSWORD }}"
|
|
2003
1924
|
|
|
2004
|
-
#
|
|
1925
|
+
# SSH 인증 방식에 따른 sudo 추상화
|
|
2005
1926
|
SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
|
|
2006
1927
|
if [ "${SSH_AUTH_METHOD}" = "key" ]; then
|
|
2007
1928
|
SUDO() { sudo "$@"; }
|
|
@@ -2024,11 +1945,9 @@ jobs:
|
|
|
2024
1945
|
echo "📛 컨테이너: ${CONTAINER_NAME}"
|
|
2025
1946
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
2026
1947
|
|
|
2027
|
-
# 컨테이너 삭제
|
|
2028
1948
|
echo "🐳 컨테이너 삭제 중..."
|
|
2029
1949
|
SUDO docker rm -f "${CONTAINER_NAME}" 2>/dev/null || true
|
|
2030
1950
|
|
|
2031
|
-
# 이미지 삭제
|
|
2032
1951
|
echo "🖼️ 이미지 삭제 중..."
|
|
2033
1952
|
SUDO docker rmi "${IMAGE}" 2>/dev/null || true
|
|
2034
1953
|
|
|
@@ -2063,9 +1982,7 @@ jobs:
|
|
|
2063
1982
|
body: body
|
|
2064
1983
|
});
|
|
2065
1984
|
|
|
2066
|
-
# -----------------------------------------------------------------
|
|
2067
1985
|
# Job 7: 커스텀 브랜치 Preview 상태 확인
|
|
2068
|
-
# -----------------------------------------------------------------
|
|
2069
1986
|
check-status-custom-branch:
|
|
2070
1987
|
name: Preview 상태 확인 (Custom Branch)
|
|
2071
1988
|
needs: check-command
|