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,14 +1,9 @@
|
|
|
1
1
|
# project-auto-wizard:managed-workflow
|
|
2
|
-
# ===================================================================
|
|
3
2
|
# Python FastAPI CI/CD 배포 (SSH + Docker)
|
|
4
|
-
# ===================================================================
|
|
5
|
-
#
|
|
6
3
|
# {{MAIN_BRANCH}} 브랜치 푸시 시 Docker 이미지를 빌드하고
|
|
7
4
|
# SSH로 접속 가능한 서버(Synology·AWS EC2·VPS 등)에 자동 배포합니다.
|
|
8
5
|
#
|
|
9
|
-
#
|
|
10
|
-
# 🔑 필수 GitHub Secrets
|
|
11
|
-
# ===================================================================
|
|
6
|
+
# 필수 GitHub Secrets
|
|
12
7
|
# ENV_FILE: .env 파일 내용
|
|
13
8
|
# DOCKERHUB_USERNAME: DockerHub 사용자명
|
|
14
9
|
# DOCKERHUB_TOKEN: DockerHub 액세스 토큰
|
|
@@ -16,43 +11,12 @@
|
|
|
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
|
-
#
|
|
21
|
-
# 🔧 환경변수 설정 (env 섹션에서 설정)
|
|
22
|
-
# ===================================================================
|
|
23
|
-
#
|
|
24
|
-
# 🌐 포트 및 컨테이너:
|
|
25
|
-
# CONTAINER_INTERNAL_PORT: FastAPI 내부 포트 (기본: 8000)
|
|
26
|
-
# DEPLOY_PORT: 배포 포트
|
|
27
|
-
# CONTAINER_NAME: 컨테이너 이름 (기본: PROJECT_NAME)
|
|
28
|
-
#
|
|
29
|
-
# 📦 볼륨 마운트:
|
|
30
|
-
# ENABLE_VOLUME_MOUNT: 볼륨 마운트 활성화 (true/false)
|
|
31
|
-
# VOLUME_HOST_PATH: 호스트 볼륨 경로
|
|
32
|
-
# VOLUME_CONTAINER_PATH: 컨테이너 내부 마운트 경로
|
|
33
|
-
#
|
|
34
|
-
# 🔌 SSH 연결:
|
|
35
|
-
# SSH_PORT: SSH 포트 (기본: 2022)
|
|
36
|
-
# SSH_COMMAND_TIMEOUT: SSH 명령 타임아웃 (기본: 600s)
|
|
37
|
-
# SSH_CONNECTION_TIMEOUT: SSH 연결 타임아웃 (기본: 60s)
|
|
38
|
-
#
|
|
39
|
-
# ⏱️ 헬스체크:
|
|
40
|
-
# HEALTHCHECK_WAIT_SECONDS: 초기화 대기 시간 (기본: 10초)
|
|
41
|
-
# HEALTHCHECK_PATH: HTTP 엔드포인트 경로 (비어있으면 로그만 사용)
|
|
42
|
-
# HEALTHCHECK_MAX_RETRIES: HTTP 재시도 횟수 (기본: 5회)
|
|
43
|
-
# HEALTHCHECK_RETRY_INTERVAL: 재시도 간격 (기본: 3초)
|
|
44
|
-
# HEALTHCHECK_LOG_PATTERN: Fallback 로그 검색 패턴
|
|
45
14
|
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
# 커스텀: "/api/v1/health"
|
|
49
|
-
# ===================================================================
|
|
15
|
+
# 환경변수는 아래 env 섹션에서 설정하며, 항목별 설명과 기본값은 각 줄에 적혀 있습니다.
|
|
16
|
+
# HEALTHCHECK_PATH 예시: FastAPI "/docs", 커스텀 "/api/v1/health"
|
|
50
17
|
|
|
51
18
|
name: PROJECT-PYTHON-SIMPLE-CICD
|
|
52
19
|
|
|
53
|
-
# ===================================================================
|
|
54
|
-
# 트리거 설정
|
|
55
|
-
# ===================================================================
|
|
56
20
|
on:
|
|
57
21
|
push:
|
|
58
22
|
branches:
|
|
@@ -60,38 +24,35 @@ on:
|
|
|
60
24
|
# @wizard paths-anchor (모노레포일 때 integrator가 paths 필터를 여기 주입)
|
|
61
25
|
workflow_dispatch: # 수동 실행 허용
|
|
62
26
|
|
|
63
|
-
# ===================================================================
|
|
64
|
-
# 환경 변수 설정
|
|
65
|
-
# ===================================================================
|
|
66
27
|
env:
|
|
67
28
|
# 프로젝트 고유 식별자
|
|
68
29
|
PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
|
|
69
30
|
|
|
70
|
-
#
|
|
31
|
+
# 포트 설정
|
|
71
32
|
DEPLOY_PORT: "__DEPLOY_PORT__" # @wizard ask:8000
|
|
72
33
|
|
|
73
|
-
#
|
|
34
|
+
# 컨테이너 이름 설정 (비워두면 PROJECT_NAME 사용)
|
|
74
35
|
CONTAINER_NAME: ""
|
|
75
36
|
|
|
76
|
-
#
|
|
37
|
+
# 볼륨 마운트 설정 (빈값이면 마운트 안함)
|
|
77
38
|
ENABLE_VOLUME_MOUNT: "false" # @wizard ask:false
|
|
78
39
|
VOLUME_HOST_PATH: "/volume1/projects/__PROJECT_NAME__" # @wizard ask:/volume1/projects/__PROJECT_NAME__
|
|
79
40
|
VOLUME_CONTAINER_PATH: "/mnt/__PROJECT_NAME__" # @wizard ask:/mnt/__PROJECT_NAME__
|
|
80
41
|
|
|
81
|
-
#
|
|
42
|
+
# SSH 인증 방식: "password"(Synology·일반 서버) | "key"(AWS EC2·.pem)
|
|
82
43
|
# password → SERVER_PASSWORD secret 사용
|
|
83
44
|
# key → SSH_KEY secret 사용 (.pem 파일 전체 내용을 secret 값으로)
|
|
84
45
|
SSH_AUTH_METHOD: "password" # @wizard ask:password
|
|
85
46
|
|
|
86
|
-
#
|
|
47
|
+
# SSH 연결 설정
|
|
87
48
|
SSH_PORT: "__SSH_PORT__" # @wizard ask:2022
|
|
88
49
|
SSH_COMMAND_TIMEOUT: "600s" # SSH 명령 실행 타임아웃
|
|
89
50
|
SSH_CONNECTION_TIMEOUT: "60s" # SSH 연결 타임아웃
|
|
90
51
|
|
|
91
|
-
#
|
|
52
|
+
# 컨테이너 포트 설정
|
|
92
53
|
CONTAINER_INTERNAL_PORT: "8000" # FastAPI 내부 포트
|
|
93
54
|
|
|
94
|
-
#
|
|
55
|
+
# 헬스체크 설정
|
|
95
56
|
HEALTHCHECK_WAIT_SECONDS: "10" # 컨테이너 초기화 대기 시간 (초)
|
|
96
57
|
HEALTHCHECK_PATH: "/docs" # HTTP 엔드포인트 경로 (비어있으면 로그 패턴만 사용)
|
|
97
58
|
HEALTHCHECK_MAX_RETRIES: "5" # HTTP 재시도 횟수
|
|
@@ -99,19 +60,15 @@ env:
|
|
|
99
60
|
HEALTHCHECK_LOG_PATTERN: "Uvicorn running on" # Fallback 로그 검색 패턴
|
|
100
61
|
|
|
101
62
|
jobs:
|
|
102
|
-
#
|
|
103
|
-
# 빌드 작업
|
|
104
|
-
# ===================================================================
|
|
63
|
+
# Job: 빌드
|
|
105
64
|
build:
|
|
106
65
|
name: Python FastAPI 애플리케이션 빌드
|
|
107
66
|
runs-on: ubuntu-latest
|
|
108
67
|
|
|
109
68
|
steps:
|
|
110
|
-
# 1. 소스코드 체크아웃
|
|
111
69
|
- name: 코드 체크아웃
|
|
112
70
|
uses: actions/checkout@v7
|
|
113
71
|
|
|
114
|
-
# 2. 디스크 공간 확보
|
|
115
72
|
- name: 디스크 공간 확보
|
|
116
73
|
run: |
|
|
117
74
|
echo "📊 빌드 전 디스크 사용량:"
|
|
@@ -129,7 +86,6 @@ jobs:
|
|
|
129
86
|
echo "📊 정리 후 디스크 사용량:"
|
|
130
87
|
df -h
|
|
131
88
|
|
|
132
|
-
# 3. .env 파일 생성
|
|
133
89
|
- name: .env 파일 생성
|
|
134
90
|
run: |
|
|
135
91
|
cat > .env << 'EOF'
|
|
@@ -137,18 +93,15 @@ jobs:
|
|
|
137
93
|
EOF
|
|
138
94
|
echo "✅ .env 파일이 생성되었습니다"
|
|
139
95
|
|
|
140
|
-
# 4. Docker 빌드 환경 설정
|
|
141
96
|
- name: Docker 빌드환경 설정
|
|
142
97
|
uses: docker/setup-buildx-action@v3
|
|
143
98
|
|
|
144
|
-
# 5. DockerHub 로그인
|
|
145
99
|
- name: DockerHub 로그인
|
|
146
100
|
uses: docker/login-action@v3
|
|
147
101
|
with:
|
|
148
102
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
149
103
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
150
104
|
|
|
151
|
-
# 6. Docker 이미지 빌드 및 푸시
|
|
152
105
|
- name: Docker 이미지 빌드 및 푸시
|
|
153
106
|
uses: docker/build-push-action@v5
|
|
154
107
|
with:
|
|
@@ -160,7 +113,6 @@ jobs:
|
|
|
160
113
|
cache-from: type=gha
|
|
161
114
|
cache-to: type=gha,mode=max
|
|
162
115
|
|
|
163
|
-
# 7. 빌드 후 정리
|
|
164
116
|
- name: 빌드 후 정리
|
|
165
117
|
if: always()
|
|
166
118
|
run: |
|
|
@@ -169,16 +121,13 @@ jobs:
|
|
|
169
121
|
echo "📊 최종 디스크 사용량:"
|
|
170
122
|
df -h
|
|
171
123
|
|
|
172
|
-
#
|
|
173
|
-
# 배포 작업
|
|
174
|
-
# ===================================================================
|
|
124
|
+
# Job: 배포
|
|
175
125
|
deploy:
|
|
176
126
|
name: 원격 서버 배포
|
|
177
127
|
needs: build
|
|
178
128
|
runs-on: ubuntu-latest
|
|
179
129
|
|
|
180
130
|
steps:
|
|
181
|
-
# SSH 통한 원격 서버 배포 실행
|
|
182
131
|
- name: Deploy
|
|
183
132
|
uses: appleboy/ssh-action@v1.0.3
|
|
184
133
|
env:
|
|
@@ -195,14 +144,12 @@ jobs:
|
|
|
195
144
|
script: |
|
|
196
145
|
set -e
|
|
197
146
|
|
|
198
|
-
# ============================================================
|
|
199
147
|
# 배포 환경 변수 설정
|
|
200
|
-
# ============================================================
|
|
201
148
|
echo "🔧 환경변수 설정.."
|
|
202
149
|
export PATH=$PATH:/usr/local/bin
|
|
203
150
|
export PW=${{ secrets.SERVER_PASSWORD }}
|
|
204
151
|
|
|
205
|
-
#
|
|
152
|
+
# SSH 인증 방식에 따른 sudo 추상화
|
|
206
153
|
# password 모드: echo $PW | sudo -S (Synology 등 sudo 비밀번호 필요 서버)
|
|
207
154
|
# key 모드: sudo 직접 (AWS EC2 등 passwordless sudo 서버)
|
|
208
155
|
SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
|
|
@@ -213,18 +160,13 @@ jobs:
|
|
|
213
160
|
fi
|
|
214
161
|
echo "🔐 SSH 인증 방식: ${SSH_AUTH_METHOD}"
|
|
215
162
|
|
|
216
|
-
# GitHub에서 전달받은 브랜치명
|
|
217
163
|
BRANCH=${{ github.ref_name }}
|
|
218
164
|
|
|
219
|
-
# 프로젝트 설정
|
|
220
165
|
PROJECT_NAME="${{ env.PROJECT_NAME }}"
|
|
221
166
|
|
|
222
|
-
# ============================================================
|
|
223
167
|
# 포트 및 컨테이너명 설정
|
|
224
|
-
# ============================================================
|
|
225
168
|
PORT=${{ env.DEPLOY_PORT }}
|
|
226
169
|
|
|
227
|
-
# 컨테이너 이름 설정
|
|
228
170
|
if [ -z "${{ env.CONTAINER_NAME }}" ]; then
|
|
229
171
|
CONTAINER_NAME="${PROJECT_NAME}"
|
|
230
172
|
echo "ℹ️ CONTAINER_NAME이 설정되지 않아 PROJECT_NAME을 사용합니다: $CONTAINER_NAME"
|
|
@@ -235,7 +177,6 @@ jobs:
|
|
|
235
177
|
|
|
236
178
|
echo "🚀 배포 환경으로 배포합니다 (브랜치: $BRANCH)"
|
|
237
179
|
|
|
238
|
-
# 설정 정보 출력
|
|
239
180
|
echo "📋 배포 설정 정보:"
|
|
240
181
|
echo " - 브랜치: $BRANCH"
|
|
241
182
|
echo " - 프로젝트: $PROJECT_NAME"
|
|
@@ -243,18 +184,13 @@ jobs:
|
|
|
243
184
|
echo " - 포트: $PORT"
|
|
244
185
|
echo " - Docker 이미지: ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}:${BRANCH}"
|
|
245
186
|
|
|
246
|
-
# ============================================================
|
|
247
187
|
# Docker 이미지 풀 (Pull)
|
|
248
|
-
# ============================================================
|
|
249
188
|
echo "⬇️ Docker 이미지 풀: ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}:${BRANCH}"
|
|
250
189
|
SUDO docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}:${BRANCH}
|
|
251
190
|
|
|
252
|
-
# ============================================================
|
|
253
191
|
# 기존 컨테이너 정리
|
|
254
|
-
# ============================================================
|
|
255
192
|
echo "🧹 컨테이너 $CONTAINER_NAME 존재 여부 확인 중..."
|
|
256
193
|
|
|
257
|
-
# 동일한 이름의 컨테이너가 존재하는지 확인
|
|
258
194
|
if SUDO docker ps -a --format '{{.Names}}' | grep -Eq "^${CONTAINER_NAME}\$"; then
|
|
259
195
|
echo "⚠️ 컨테이너 $CONTAINER_NAME 이(가) 존재합니다. 중지 및 삭제 중..."
|
|
260
196
|
SUDO docker rm -f $CONTAINER_NAME
|
|
@@ -263,21 +199,13 @@ jobs:
|
|
|
263
199
|
echo "ℹ️ 존재하는 컨테이너 $CONTAINER_NAME 이(가) 없습니다."
|
|
264
200
|
fi
|
|
265
201
|
|
|
266
|
-
# ============================================================
|
|
267
202
|
# 새 컨테이너 실행
|
|
268
|
-
# ============================================================
|
|
269
203
|
echo "🚀 새로운 컨테이너 $CONTAINER_NAME 실행 중..."
|
|
270
204
|
|
|
271
|
-
# Docker
|
|
272
|
-
# - 포트 매핑: ${PORT}:${{ env.CONTAINER_INTERNAL_PORT }} (외부:내부)
|
|
273
|
-
# - 시간대: Asia/Seoul
|
|
274
|
-
# - 볼륨 마운트: 로컬 시간 동기화 및 프로젝트 데이터
|
|
275
|
-
# ⚠️ .env 파일은 이미 Docker 이미지에 포함되어 있습니다
|
|
205
|
+
# .env 파일은 이미 Docker 이미지에 포함되어 있습니다
|
|
276
206
|
|
|
277
|
-
# 볼륨 마운트 옵션 구성
|
|
278
207
|
VOLUME_OPTS="-v /etc/localtime:/etc/localtime:ro"
|
|
279
208
|
if [ "${{ env.ENABLE_VOLUME_MOUNT }}" == "true" ]; then
|
|
280
|
-
# 디렉토리가 없으면 생성
|
|
281
209
|
if [ ! -d "${{ env.VOLUME_HOST_PATH }}" ]; then
|
|
282
210
|
echo "📁 볼륨 마운트 디렉토리 생성: ${{ env.VOLUME_HOST_PATH }}"
|
|
283
211
|
SUDO mkdir -p "${{ env.VOLUME_HOST_PATH }}"
|
|
@@ -295,9 +223,7 @@ jobs:
|
|
|
295
223
|
$VOLUME_OPTS \
|
|
296
224
|
${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}:${BRANCH}
|
|
297
225
|
|
|
298
|
-
# ============================================================
|
|
299
226
|
# 컨테이너 헬스체크
|
|
300
|
-
# ============================================================
|
|
301
227
|
echo "⏳ 컨테이너 초기화 대기 중... (${{ env.HEALTHCHECK_WAIT_SECONDS }}초)"
|
|
302
228
|
sleep ${{ env.HEALTHCHECK_WAIT_SECONDS }}
|
|
303
229
|
|
|
@@ -364,14 +290,10 @@ jobs:
|
|
|
364
290
|
fi
|
|
365
291
|
fi
|
|
366
292
|
|
|
367
|
-
# 최종 성공 메시지
|
|
368
293
|
if [ "$HEALTHCHECK_SUCCESS" = "true" ]; then
|
|
369
294
|
echo "✅ 헬스체크 완료: 컨테이너 $CONTAINER_NAME 이(가) 정상적으로 실행 중입니다"
|
|
370
295
|
fi
|
|
371
296
|
|
|
372
|
-
# ============================================================
|
|
373
|
-
# 배포 완료 확인
|
|
374
|
-
# ============================================================
|
|
375
297
|
echo "✅ 배포가 성공적으로 완료되었습니다!"
|
|
376
298
|
echo ""
|
|
377
299
|
echo "📋 배포 결과 요약:"
|
|
@@ -1,29 +1,14 @@
|
|
|
1
1
|
# project-auto-wizard:managed-workflow
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
# ===================================================================
|
|
2
|
+
# React CI (빌드 검증)
|
|
3
|
+
# {{MAIN_BRANCH}} 브랜치 푸시 시 npm ci와 npm run build로 빌드를 검증합니다. node_modules와 빌드 결과를 캐싱합니다.
|
|
5
4
|
#
|
|
6
|
-
#
|
|
5
|
+
# GitHub Secrets
|
|
6
|
+
# ENV_FILE (선택): .env 파일 내용. CI는 빌드 검증 목적이므로 배포 관련 Secrets는 불필요
|
|
7
7
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
# ===================================================================
|
|
14
|
-
# 🔑 필수 GitHub Secrets
|
|
15
|
-
# ===================================================================
|
|
16
|
-
# ENV_FILE (선택): .env 파일 내용
|
|
17
|
-
#
|
|
18
|
-
# ※ CI는 빌드 검증 목적이므로 배포 관련 Secrets 불필요
|
|
19
|
-
# ===================================================================
|
|
20
|
-
#
|
|
21
|
-
# 🔧 프로젝트별 설정 (env 섹션)
|
|
22
|
-
# ===================================================================
|
|
23
|
-
# PROJECT_NAME : 프로젝트 이름
|
|
24
|
-
# NODE_VERSION : Node.js 버전 (기본: 20.15.0)
|
|
25
|
-
# ENV_FILE : 환경변수 파일명 (기본: .env)
|
|
26
|
-
# ===================================================================
|
|
8
|
+
# 프로젝트별 설정 (env 섹션)
|
|
9
|
+
# PROJECT_NAME : 프로젝트 이름
|
|
10
|
+
# NODE_VERSION : Node.js 버전 (기본: 20.15.0)
|
|
11
|
+
# ENV_FILE : 환경변수 파일명 (기본: .env)
|
|
27
12
|
|
|
28
13
|
name: PROJECT-REACT-CI
|
|
29
14
|
|
|
@@ -45,9 +30,7 @@ permissions:
|
|
|
45
30
|
issues: write
|
|
46
31
|
|
|
47
32
|
jobs:
|
|
48
|
-
#
|
|
49
|
-
# 변경 감지 (모노레포에서 이 프로젝트 경로가 바뀌었는지 판별)
|
|
50
|
-
# ===================================================================
|
|
33
|
+
# Job: 변경 감지 (모노레포에서 이 프로젝트 경로가 바뀌었는지 판별)
|
|
51
34
|
changes:
|
|
52
35
|
name: 변경 감지
|
|
53
36
|
runs-on: ubuntu-latest
|
|
@@ -76,24 +59,20 @@ jobs:
|
|
|
76
59
|
if: ${{ github.event_name == 'workflow_dispatch' || needs.changes.outputs.project == 'true' }}
|
|
77
60
|
|
|
78
61
|
steps:
|
|
79
|
-
# 1. 소스코드 체크아웃
|
|
80
62
|
- name: 코드 체크아웃
|
|
81
63
|
uses: actions/checkout@v7
|
|
82
64
|
|
|
83
|
-
# 2. 환경변수 파일 생성
|
|
84
65
|
- name: 환경변수 파일 생성 (${{ env.ENV_FILE }})
|
|
85
66
|
run: |
|
|
86
67
|
echo -e "${{ secrets.ENV_FILE || secrets.ENV }}" > ${{ env.ENV_FILE }}
|
|
87
68
|
echo "✅ ${{ env.ENV_FILE }} 파일 생성 완료"
|
|
88
69
|
|
|
89
|
-
# 3. Node.js 설정
|
|
90
70
|
- name: Node.js 설정
|
|
91
71
|
uses: actions/setup-node@v7
|
|
92
72
|
with:
|
|
93
73
|
node-version: ${{ env.NODE_VERSION }}
|
|
94
74
|
cache: "npm"
|
|
95
75
|
|
|
96
|
-
# 4. npm 의존성 캐싱
|
|
97
76
|
- name: npm 의존성 캐싱
|
|
98
77
|
uses: actions/cache@v6
|
|
99
78
|
with:
|
|
@@ -102,7 +81,6 @@ jobs:
|
|
|
102
81
|
restore-keys: |
|
|
103
82
|
${{ runner.os }}-npm-
|
|
104
83
|
|
|
105
|
-
# 5. node_modules 캐싱
|
|
106
84
|
# package-lock.json이 변경되지 않으면 npm ci 건너뛰기
|
|
107
85
|
- name: node_modules 캐싱
|
|
108
86
|
id: node-modules-cache
|
|
@@ -113,7 +91,6 @@ jobs:
|
|
|
113
91
|
restore-keys: |
|
|
114
92
|
${{ runner.os }}-node-modules-
|
|
115
93
|
|
|
116
|
-
# 6. 의존성 설치
|
|
117
94
|
# 캐시가 없을 때만 실행 (npm ci는 package-lock.json 기준 정확한 버전 설치)
|
|
118
95
|
- name: 의존성 설치
|
|
119
96
|
if: steps.node-modules-cache.outputs.cache-hit != 'true'
|
|
@@ -122,7 +99,7 @@ jobs:
|
|
|
122
99
|
npm ci
|
|
123
100
|
echo "✅ 의존성 설치 완료"
|
|
124
101
|
|
|
125
|
-
#
|
|
102
|
+
# Next.js 빌드 캐싱 (Next.js 프로젝트인 경우)
|
|
126
103
|
# .next/cache 폴더를 캐싱하여 증분 빌드 속도 향상
|
|
127
104
|
- name: Next.js 빌드 캐싱
|
|
128
105
|
uses: actions/cache@v6
|
|
@@ -133,7 +110,6 @@ jobs:
|
|
|
133
110
|
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
|
|
134
111
|
${{ runner.os }}-nextjs-
|
|
135
112
|
|
|
136
|
-
# 8. 프로젝트 빌드
|
|
137
113
|
# 빌드 실패 시에도 워크플로우를 중단하지 않고 에러 로그 수집
|
|
138
114
|
- name: 프로젝트 빌드
|
|
139
115
|
id: build
|
|
@@ -157,7 +133,6 @@ jobs:
|
|
|
157
133
|
echo "status=success" >> $GITHUB_OUTPUT
|
|
158
134
|
echo "✅ 빌드 완료"
|
|
159
135
|
|
|
160
|
-
# 9. 빌드 실패 시 에러 로그 출력
|
|
161
136
|
# 빌드가 실패한 경우에만 실행
|
|
162
137
|
- name: 빌드 에러 로그 출력
|
|
163
138
|
if: steps.build.outputs.build_failed == 'true'
|
|
@@ -180,7 +155,6 @@ jobs:
|
|
|
180
155
|
# 빌드 실패로 워크플로우 종료
|
|
181
156
|
exit 1
|
|
182
157
|
|
|
183
|
-
# 10. 빌드 로그 아티팩트 업로드
|
|
184
158
|
# 빌드 성공/실패 여부와 관계없이 로그 저장
|
|
185
159
|
- name: 빌드 로그 업로드
|
|
186
160
|
if: always()
|
|
@@ -190,7 +164,6 @@ jobs:
|
|
|
190
164
|
path: build_log.txt
|
|
191
165
|
retention-days: 7 # 7일간 보관
|
|
192
166
|
|
|
193
|
-
# 11. 빌드 결과 요약
|
|
194
167
|
# 워크플로우 실행 결과를 보기 쉽게 요약
|
|
195
168
|
- name: 빌드 결과 요약
|
|
196
169
|
if: always()
|
|
@@ -222,9 +195,7 @@ jobs:
|
|
|
222
195
|
echo "💡 Actions 탭에서 'build-log' 아티팩트를 다운로드하여 전체 로그를 확인하세요."
|
|
223
196
|
fi
|
|
224
197
|
|
|
225
|
-
#
|
|
226
|
-
# CI Gate (required check로 등록할 단일 job)
|
|
227
|
-
# ===================================================================
|
|
198
|
+
# Job: CI Gate (required check로 등록할 단일 job)
|
|
228
199
|
ci-gate:
|
|
229
200
|
name: CI Gate
|
|
230
201
|
if: ${{ always() }}
|
|
@@ -1,21 +1,15 @@
|
|
|
1
1
|
# project-auto-wizard:managed-workflow
|
|
2
|
-
# ===================================================================
|
|
3
2
|
# React CI/CD 배포
|
|
4
|
-
# ===================================================================
|
|
5
|
-
#
|
|
6
3
|
# {{MAIN_BRANCH}} 브랜치 푸시 시 Docker 이미지를 빌드하고 배포합니다.
|
|
7
4
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
# SERVER_PASSWORD: SSH 비밀번호
|
|
17
|
-
# PROJECT_DEPLOY_PORT (선택): 배포 포트 (기본: 3000)
|
|
18
|
-
# ===================================================================
|
|
5
|
+
# GitHub Secrets
|
|
6
|
+
# ENV_FILE: .env 파일 내용
|
|
7
|
+
# DOCKERHUB_USERNAME: DockerHub 사용자명
|
|
8
|
+
# DOCKERHUB_TOKEN: DockerHub 액세스 토큰
|
|
9
|
+
# SERVER_HOST: 배포 서버 주소
|
|
10
|
+
# SERVER_USER: SSH 사용자명
|
|
11
|
+
# SERVER_PASSWORD: SSH 비밀번호
|
|
12
|
+
# PROJECT_DEPLOY_PORT (선택): 배포 포트 (기본: 3000)
|
|
19
13
|
|
|
20
14
|
name: PROJECT-REACT-CICD
|
|
21
15
|
|
|
@@ -38,18 +32,15 @@ jobs:
|
|
|
38
32
|
runs-on: ubuntu-latest
|
|
39
33
|
|
|
40
34
|
steps:
|
|
41
|
-
# 1. 소스코드 체크아웃
|
|
42
35
|
- name: 코드 체크아웃
|
|
43
36
|
uses: actions/checkout@v7
|
|
44
37
|
|
|
45
|
-
# 2. Node.js 개발 환경 설정
|
|
46
38
|
- name: Node.js 설정
|
|
47
39
|
uses: actions/setup-node@v7
|
|
48
40
|
with:
|
|
49
41
|
node-version: ${{ env.NODE_VERSION }}
|
|
50
42
|
cache: 'npm'
|
|
51
43
|
|
|
52
|
-
# 3. 환경변수 파일 생성
|
|
53
44
|
- name: 환경변수 파일 생성 (${{ env.ENV_FILE_NAME }})
|
|
54
45
|
run: |
|
|
55
46
|
cat << 'EOF' > ./${{ env.ENV_FILE_NAME }}
|
|
@@ -57,7 +48,6 @@ jobs:
|
|
|
57
48
|
EOF
|
|
58
49
|
echo "✅ ${{ env.ENV_FILE_NAME }} 파일 생성 완료"
|
|
59
50
|
|
|
60
|
-
# 4. npm 의존성 캐싱
|
|
61
51
|
- name: npm 의존성 캐싱
|
|
62
52
|
uses: actions/cache@v6
|
|
63
53
|
with:
|
|
@@ -66,7 +56,6 @@ jobs:
|
|
|
66
56
|
restore-keys: |
|
|
67
57
|
${{ runner.os }}-npm-
|
|
68
58
|
|
|
69
|
-
# 5. node_modules 캐싱
|
|
70
59
|
- name: node_modules 캐싱
|
|
71
60
|
id: node-modules-cache
|
|
72
61
|
uses: actions/cache@v6
|
|
@@ -76,12 +65,10 @@ jobs:
|
|
|
76
65
|
restore-keys: |
|
|
77
66
|
${{ runner.os }}-node-modules-
|
|
78
67
|
|
|
79
|
-
# 6. 의존성 설치
|
|
80
68
|
- name: 의존성 설치
|
|
81
69
|
if: steps.node-modules-cache.outputs.cache-hit != 'true'
|
|
82
70
|
run: npm ci
|
|
83
71
|
|
|
84
|
-
# 7. Next.js 빌드 캐싱
|
|
85
72
|
- name: Next.js 빌드 캐싱
|
|
86
73
|
uses: actions/cache@v6
|
|
87
74
|
with:
|
|
@@ -91,22 +78,18 @@ jobs:
|
|
|
91
78
|
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
|
|
92
79
|
${{ runner.os }}-nextjs-
|
|
93
80
|
|
|
94
|
-
# 8. 프로젝트 빌드
|
|
95
81
|
- name: Build with npm
|
|
96
82
|
run: npm run build
|
|
97
83
|
|
|
98
|
-
# 9. Docker 빌드 환경 설정
|
|
99
84
|
- name: Docker 빌드환경 설정
|
|
100
85
|
uses: docker/setup-buildx-action@v3
|
|
101
86
|
|
|
102
|
-
# 10. DockerHub 로그인
|
|
103
87
|
- name: DockerHub 로그인
|
|
104
88
|
uses: docker/login-action@v3
|
|
105
89
|
with:
|
|
106
90
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
|
107
91
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
108
92
|
|
|
109
|
-
# 11. Docker 레이어 캐싱
|
|
110
93
|
- name: Cache Docker layers
|
|
111
94
|
uses: actions/cache@v6
|
|
112
95
|
with:
|
|
@@ -115,7 +98,6 @@ jobs:
|
|
|
115
98
|
restore-keys: |
|
|
116
99
|
${{ runner.os }}-buildx-
|
|
117
100
|
|
|
118
|
-
# 12. Docker 이미지 빌드 및 푸시
|
|
119
101
|
- name: Docker 이미지 빌드 및 푸시
|
|
120
102
|
uses: docker/build-push-action@v5
|
|
121
103
|
with:
|
|
@@ -126,7 +108,6 @@ jobs:
|
|
|
126
108
|
cache-from: type=local,src=/tmp/.buildx-cache
|
|
127
109
|
cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
|
|
128
110
|
|
|
129
|
-
# 13. Docker 캐시 정리
|
|
130
111
|
- name: Move Docker cache
|
|
131
112
|
run: |
|
|
132
113
|
rm -rf /tmp/.buildx-cache
|
|
@@ -148,9 +129,7 @@ jobs:
|
|
|
148
129
|
script: |
|
|
149
130
|
set -e
|
|
150
131
|
|
|
151
|
-
# ============================================================
|
|
152
132
|
# 배포 환경 변수 설정
|
|
153
|
-
# ============================================================
|
|
154
133
|
echo "🔧 환경변수 설정.."
|
|
155
134
|
export PATH=$PATH:/usr/local/bin
|
|
156
135
|
export PW=${{ secrets.SERVER_PASSWORD }}
|
|
@@ -161,9 +140,7 @@ jobs:
|
|
|
161
140
|
# 프로젝트 설정
|
|
162
141
|
PROJECT_NAME="${{ env.PROJECT_NAME }}"
|
|
163
142
|
|
|
164
|
-
# ============================================================
|
|
165
143
|
# 브랜치별 포트 및 컨테이너명 설정
|
|
166
|
-
# ============================================================
|
|
167
144
|
# 기본값 설정
|
|
168
145
|
PORT=3000
|
|
169
146
|
CONTAINER_NAME="${PROJECT_NAME}-front"
|
|
@@ -178,7 +155,7 @@ jobs:
|
|
|
178
155
|
echo "🚀 배포 환경으로 배포합니다 (브랜치: $BRANCH)"
|
|
179
156
|
|
|
180
157
|
else
|
|
181
|
-
#
|
|
158
|
+
# 기타 브랜치 (예상치 못한 브랜치)
|
|
182
159
|
echo "⚠️ 지원하지 않는 브랜치입니다: $BRANCH"
|
|
183
160
|
echo "이 워크플로우는 {{MAIN_BRANCH}} 브랜치만 지원합니다."
|
|
184
161
|
echo "on.push.branches에서 지원할 브랜치를 설정하세요."
|
|
@@ -193,15 +170,11 @@ jobs:
|
|
|
193
170
|
echo " - 포트: $PORT"
|
|
194
171
|
echo " - Docker 이미지: ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}-${{ env.DOCKER_IMAGE_PREFIX }}:${BRANCH}"
|
|
195
172
|
|
|
196
|
-
# ============================================================
|
|
197
173
|
# Docker 이미지 풀 (Pull)
|
|
198
|
-
# ============================================================
|
|
199
174
|
echo "⬇️ Docker 이미지 풀: ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}-${{ env.DOCKER_IMAGE_PREFIX }}:${BRANCH}"
|
|
200
175
|
echo $PW | sudo -S docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}-${{ env.DOCKER_IMAGE_PREFIX }}:${BRANCH}
|
|
201
176
|
|
|
202
|
-
# ============================================================
|
|
203
177
|
# 기존 컨테이너 정리
|
|
204
|
-
# ============================================================
|
|
205
178
|
echo "🧹 컨테이너 $CONTAINER_NAME 존재 여부 확인 중..."
|
|
206
179
|
|
|
207
180
|
# 동일한 이름의 컨테이너가 존재하는지 확인
|
|
@@ -213,9 +186,7 @@ jobs:
|
|
|
213
186
|
echo "ℹ️ 존재하는 컨테이너 $CONTAINER_NAME 이(가) 없습니다."
|
|
214
187
|
fi
|
|
215
188
|
|
|
216
|
-
# ============================================================
|
|
217
189
|
# 새 컨테이너 실행
|
|
218
|
-
# ============================================================
|
|
219
190
|
echo "🚀 새로운 컨테이너 $CONTAINER_NAME 실행 중..."
|
|
220
191
|
|
|
221
192
|
echo $PW | sudo -S docker run -d \
|
|
@@ -225,9 +196,7 @@ jobs:
|
|
|
225
196
|
-v /etc/localtime:/etc/localtime:ro \
|
|
226
197
|
${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}-${{ env.DOCKER_IMAGE_PREFIX }}:${BRANCH}
|
|
227
198
|
|
|
228
|
-
# ============================================================
|
|
229
199
|
# 배포 완료 확인
|
|
230
|
-
# ============================================================
|
|
231
200
|
echo "✅ 배포가 성공적으로 완료되었습니다!"
|
|
232
201
|
echo ""
|
|
233
202
|
echo "📋 배포 결과 요약:"
|
|
@@ -239,9 +208,7 @@ jobs:
|
|
|
239
208
|
echo ""
|
|
240
209
|
echo "🔗 접속 URL: http://${{ secrets.SERVER_HOST }}:${PORT}"
|
|
241
210
|
|
|
242
|
-
# ===================================================================
|
|
243
211
|
# 사용 예시 - {{MAIN_BRANCH}} 브랜치 사용
|
|
244
|
-
# ===================================================================
|
|
245
212
|
#
|
|
246
213
|
# 현재 설정: {{MAIN_BRANCH}} 브랜치에 push할 때 자동 배포
|
|
247
214
|
#
|
|
@@ -252,5 +219,4 @@ jobs:
|
|
|
252
219
|
# - REACT_ENV_FILE, DOCKERHUB_*, SERVER_* (필수)
|
|
253
220
|
# - PROJECT_DEPLOY_PORT (선택, 기본값: 3000)
|
|
254
221
|
#
|
|
255
|
-
# ===================================================================
|
|
256
222
|
|