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