project-auto-wizard 0.14.0 → 0.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.ja.md +3 -1
  2. package/README.ko.md +3 -1
  3. package/README.md +4 -2
  4. package/README.zh-CN.md +3 -1
  5. package/package.json +1 -1
  6. package/payload/config/breaking-changes.json +31 -5
  7. package/payload/config/wizard-prompts.yml +0 -4
  8. package/payload/scripts/changelog_manager.py +8 -8
  9. package/payload/scripts/messages.py +460 -24
  10. package/payload/scripts/version_manager.py +102 -73
  11. package/payload/version.yml.template +2 -2
  12. package/payload/workflows/common/PROJECT-COMMON-AI-PR-SUMMARY.yaml +9 -4
  13. package/payload/workflows/common/PROJECT-COMMON-AUTO-CHANGELOG-CONTROL.yaml +62 -30
  14. package/payload/workflows/common/PROJECT-COMMON-README-VERSION-UPDATE.yaml +96 -44
  15. package/payload/workflows/common/PROJECT-COMMON-RELEASE-PUBLISH.yaml +79 -35
  16. package/payload/workflows/common/PROJECT-COMMON-VERSION-CONTROL.yaml +71 -35
  17. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-FIREBASE-CICD.yaml +24 -8
  18. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-PLAYSTORE-CICD.yaml +29 -10
  19. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-SELFHOSTED-CICD.yaml +57 -23
  20. package/payload/workflows/flutter/PROJECT-FLUTTER-ANDROID-TEST-APK.yaml +155 -72
  21. package/payload/workflows/flutter/PROJECT-FLUTTER-APP-BUILD-TRIGGER.yaml +49 -20
  22. package/payload/workflows/flutter/PROJECT-FLUTTER-CI.yaml +162 -62
  23. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TEST-TESTFLIGHT.yaml +184 -87
  24. package/payload/workflows/flutter/PROJECT-FLUTTER-IOS-TESTFLIGHT.yaml +38 -15
  25. package/payload/workflows/go/PROJECT-GO-CI.yaml +14 -5
  26. package/payload/workflows/go/PROJECT-GO-PR-PREVIEW.yaml +375 -120
  27. package/payload/workflows/go/PROJECT-GO-SIMPLE-CICD.yaml +9 -4
  28. package/payload/workflows/python/PROJECT-PYTHON-CI.yaml +12 -4
  29. package/payload/workflows/python/PROJECT-PYTHON-PR-PREVIEW.yaml +375 -120
  30. package/payload/workflows/python/PROJECT-PYTHON-SIMPLE-CICD.yaml +9 -4
  31. package/payload/workflows/react/PROJECT-REACT-CI.yaml +38 -9
  32. package/payload/workflows/react/PROJECT-REACT-CICD.yaml +19 -5
  33. package/payload/workflows/spring/PROJECT-SPRING-CI.yml +71 -35
  34. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-NGINX-CICD.yaml +9 -6
  35. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-NONSTOP-TRAEFIK-CICD.yaml +7 -4
  36. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-PR-PREVIEW.yaml +425 -144
  37. package/payload/workflows/spring/server-deploy/PROJECT-SPRING-SIMPLE-CICD.yaml +7 -4
  38. package/src/cli/args.js +17 -7
  39. package/src/commands/doctor.js +16 -0
  40. package/src/commands/dry-run.js +10 -1
  41. package/src/commands/full.js +5 -2
  42. package/src/commands/interactive.js +4 -1
  43. package/src/commands/status.js +14 -1
  44. package/src/core/copy/readme.js +58 -2
  45. package/src/core/copy/simple.js +31 -0
  46. package/src/core/copy/workflows.js +2 -2
  47. package/src/core/deploy-style.js +1 -1
  48. package/src/core/detect.js +3 -2
  49. package/src/core/types.js +15 -8
  50. package/src/core/version-yml.js +52 -6
  51. package/src/i18n/catalog/en/cli.js +1 -0
  52. package/src/i18n/catalog/en/commands.js +9 -0
  53. package/src/i18n/catalog/en/copy.js +1 -0
  54. package/src/i18n/catalog/en/core2.js +3 -0
  55. package/src/i18n/catalog/ko/cli.js +1 -0
  56. package/src/i18n/catalog/ko/commands.js +9 -0
  57. package/src/i18n/catalog/ko/copy.js +1 -0
  58. package/src/i18n/catalog/ko/core2.js +3 -0
  59. package/src/index.js +8 -4
  60. package/src/ui/env-plan.js +1 -1
  61. package/src/ui/prompts.js +7 -3
  62. package/src/ui/summary.js +1 -1
  63. package/payload/workflows/next/PROJECT-NEXT-CI.yaml +0 -241
  64. package/payload/workflows/next/PROJECT-NEXT-CICD.yaml +0 -330
@@ -1,330 +0,0 @@
1
- # project-auto-wizard:managed-workflow
2
- # Next.js CI/CD deployment
3
- # Builds a Docker image and deploys it when the {{MAIN_BRANCH}} branch is pushed. Deployed as a Node.js runtime container to support SSR.
4
- #
5
- # GitHub Secrets
6
- # ENV_FILE: contents of the .env file
7
- # DOCKERHUB_USERNAME: DockerHub username
8
- # DOCKERHUB_TOKEN: DockerHub access token
9
- # SERVER_HOST: deploy server address
10
- # SERVER_USER: SSH username
11
- # SERVER_PASSWORD: SSH password (when SSH_AUTH_METHOD=password)
12
- # SSH_KEY: contents of the SSH private key .pem (when SSH_AUTH_METHOD=key, e.g. AWS EC2)
13
- # PROJECT_DEPLOY_PORT (optional): deploy port (default: 3000)
14
- #
15
- # Environment variables (set in the env section)
16
- # SSH_AUTH_METHOD: SSH auth method password | key (default: password)
17
- # SSH_PORT (default: 2022), SSH_COMMAND_TIMEOUT (default: 600s), SSH_CONNECTION_TIMEOUT (default: 60s)
18
-
19
- name: PROJECT-NEXT-CICD
20
-
21
- on:
22
- push:
23
- branches:
24
- - "{{MAIN_BRANCH}}"
25
- # @wizard paths-anchor (for a monorepo the integrator injects the paths filter here)
26
- workflow_dispatch:
27
-
28
- env:
29
- PROJECT_NAME: "__PROJECT_NAME__" # @wizard ask:@repo
30
- # Subdirectory of this project in a monorepo (--paths). Base for the build and Docker context ('.' means the repo root)
31
- PROJECT_PATH: "." # @wizard auto:project-path
32
- DOCKER_IMAGE_PREFIX: "nextjs-container"
33
- NODE_VERSION: "20.15.0"
34
- ENV_FILE_NAME: ".env"
35
-
36
- # SSH auth method: "password" (Synology, generic servers) | "key" (AWS EC2, .pem)
37
- # password -> uses the SERVER_PASSWORD secret
38
- # key -> uses the SSH_KEY secret (the whole .pem file content as the secret value)
39
- SSH_AUTH_METHOD: "password" # @wizard ask:password
40
-
41
- SSH_PORT: "__SSH_PORT__" # @wizard ask:2022
42
- SSH_COMMAND_TIMEOUT: "600s" # SSH command execution timeout
43
- SSH_CONNECTION_TIMEOUT: "60s" # SSH connection timeout
44
-
45
- jobs:
46
- build:
47
- name: Build Next.js application
48
- runs-on: ubuntu-latest
49
- # In a monorepo (--paths), build inside that subfolder
50
- defaults:
51
- run:
52
- working-directory: ${{ env.PROJECT_PATH }}
53
-
54
- steps:
55
- - name: Checkout repository
56
- uses: actions/checkout@v7
57
-
58
- # If a required Secret or the Dockerfile is missing, report the missing item and stop
59
- # instead of failing later with a third-party error such as docker login
60
- - name: Deploy pre-check (Secrets and Dockerfile)
61
- working-directory: ${{ env.PROJECT_PATH }}
62
- env:
63
- DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
64
- DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
65
- SERVER_HOST: ${{ secrets.SERVER_HOST }}
66
- SERVER_USER: ${{ secrets.SERVER_USER }}
67
- SERVER_PASSWORD: ${{ secrets.SERVER_PASSWORD }}
68
- SSH_KEY: ${{ secrets.SSH_KEY }}
69
- DOCKERFILE: Dockerfile
70
- run: |
71
- m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
72
- MISSING=""
73
- for NAME in DOCKERHUB_USERNAME DOCKERHUB_TOKEN SERVER_HOST SERVER_USER; do
74
- [ -n "${!NAME}" ] || MISSING="$MISSING $NAME"
75
- done
76
- # SSH_AUTH_METHOD=key needs SSH_KEY, otherwise SERVER_PASSWORD is required
77
- if [ "${SSH_AUTH_METHOD:-password}" = "key" ]; then
78
- [ -n "$SSH_KEY" ] || MISSING="$MISSING SSH_KEY"
79
- else
80
- [ -n "$SERVER_PASSWORD" ] || MISSING="$MISSING SERVER_PASSWORD"
81
- fi
82
- FAILED=false
83
- if [ -n "$MISSING" ]; then
84
- echo "::error title=$(m cicd.precheck_secret_title)::$(m cicd.precheck_secret_body missing="$MISSING")"
85
- FAILED=true
86
- fi
87
- if [ ! -f "$DOCKERFILE" ]; then
88
- echo "::error title=$(m cicd.precheck_dockerfile_title)::$(m cicd.precheck_dockerfile_body path="${PROJECT_PATH}/${DOCKERFILE#./}")"
89
- FAILED=true
90
- fi
91
- if [ "$FAILED" = "true" ]; then
92
- exit 1
93
- fi
94
- m cicd.precheck_ok
95
-
96
- - name: Set up Node.js
97
- uses: actions/setup-node@v7
98
- with:
99
- node-version: ${{ env.NODE_VERSION }}
100
- cache: 'npm'
101
- cache-dependency-path: ${{ env.PROJECT_PATH }}/package-lock.json
102
-
103
- - name: Create environment file (${{ env.ENV_FILE_NAME }})
104
- run: |
105
- m() { (cd "$GITHUB_WORKSPACE" && python3 .github/scripts/messages.py get "$@"); }
106
- cat << 'EOF' > ./${{ env.ENV_FILE_NAME }}
107
- ${{ secrets.ENV_FILE || secrets.ENV }}
108
- EOF
109
- m cicd.env_file_created file="${{ env.ENV_FILE_NAME }}"
110
-
111
- - name: Cache npm dependencies
112
- uses: actions/cache@v6
113
- with:
114
- path: ~/.npm
115
- key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
116
- restore-keys: |
117
- ${{ runner.os }}-npm-
118
-
119
- - name: Cache node_modules
120
- id: node-modules-cache
121
- uses: actions/cache@v6
122
- with:
123
- path: "**/node_modules"
124
- key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }}
125
- restore-keys: |
126
- ${{ runner.os }}-node-modules-
127
-
128
- - name: Install dependencies
129
- if: steps.node-modules-cache.outputs.cache-hit != 'true'
130
- run: npm ci
131
-
132
- - name: Cache Next.js build
133
- uses: actions/cache@v6
134
- with:
135
- path: ${{ env.PROJECT_PATH }}/.next/cache
136
- key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }}
137
- restore-keys: |
138
- ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
139
- ${{ runner.os }}-nextjs-
140
-
141
- - name: Build with npm
142
- run: npm run build
143
-
144
- - name: Set up Docker Buildx
145
- uses: docker/setup-buildx-action@v3
146
-
147
- - name: Log in to DockerHub
148
- uses: docker/login-action@v3
149
- with:
150
- username: ${{ secrets.DOCKERHUB_USERNAME }}
151
- password: ${{ secrets.DOCKERHUB_TOKEN }}
152
-
153
- - name: Cache Docker layers
154
- uses: actions/cache@v6
155
- with:
156
- path: /tmp/.buildx-cache
157
- key: ${{ runner.os }}-buildx-${{ hashFiles('Dockerfile') }}-${{ hashFiles('package-lock.json') }}
158
- restore-keys: |
159
- ${{ runner.os }}-buildx-
160
-
161
- - name: Build and push Docker image
162
- uses: docker/build-push-action@v5
163
- with:
164
- context: ${{ env.PROJECT_PATH }}
165
- file: ${{ env.PROJECT_PATH }}/Dockerfile
166
- push: true
167
- tags: ${{ secrets.DOCKERHUB_USERNAME }}/${{ env.PROJECT_NAME }}-${{ env.DOCKER_IMAGE_PREFIX }}:${{ github.ref_name }}
168
- cache-from: type=local,src=/tmp/.buildx-cache
169
- cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max
170
-
171
- - name: Move Docker cache
172
- run: |
173
- rm -rf /tmp/.buildx-cache
174
- mv /tmp/.buildx-cache-new /tmp/.buildx-cache
175
-
176
- deploy:
177
- name: Deploy to remote server
178
- needs: build
179
- runs-on: ubuntu-latest
180
-
181
- steps:
182
- # The deploy script runs on the remote server, so the messages are resolved here
183
- # and handed to it through env vars (PAW_M_*)
184
- - name: Checkout message catalog
185
- uses: actions/checkout@v7
186
- with:
187
- sparse-checkout: |
188
- .github/scripts/messages.py
189
- version.yml
190
- sparse-checkout-cone-mode: false
191
-
192
- - name: Load messages
193
- run: |
194
- python3 .github/scripts/messages.py dump cicd. | PYTHONIOENCODING=utf-8 python3 -c 'import json,sys; [print("PAW_M_" + k.replace(".", "_") + "=" + v) for k, v in json.load(sys.stdin).items()]' >> "$GITHUB_ENV"
195
-
196
- - name: Deploy
197
- uses: appleboy/ssh-action@v1.0.3
198
- env:
199
- SSH_AUTH_METHOD: ${{ env.SSH_AUTH_METHOD }}
200
- with:
201
- host: ${{ secrets.SERVER_HOST }}
202
- username: ${{ secrets.SERVER_USER }}
203
- password: ${{ secrets.SERVER_PASSWORD }}
204
- key: ${{ secrets.SSH_KEY }}
205
- port: ${{ env.SSH_PORT }}
206
- command_timeout: ${{ env.SSH_COMMAND_TIMEOUT }}
207
- timeout: ${{ env.SSH_CONNECTION_TIMEOUT }}
208
- envs: SSH_AUTH_METHOD
209
- script: |
210
- set -e
211
-
212
- # Fill the {name} placeholders of a message template (usage: m "template" name=value ...)
213
- m() { local s="$1" kv; shift; for kv in "$@"; do s="${s//\{${kv%%=*}\}/${kv#*=}}"; done; printf '%s\n' "$s"; }
214
-
215
- # Set deploy environment variables
216
- m "${{ env.PAW_M_cicd_setup_env }}"
217
- export PATH=$PATH:/usr/local/bin
218
- export PW=${{ secrets.SERVER_PASSWORD }}
219
-
220
- # sudo abstraction per SSH auth method
221
- # password mode: echo $PW | sudo -S (servers that need a sudo password, e.g. Synology)
222
- # key mode: plain sudo (passwordless-sudo servers, e.g. AWS EC2)
223
- SSH_AUTH_METHOD="${SSH_AUTH_METHOD:-password}"
224
- if [ "${SSH_AUTH_METHOD}" = "key" ]; then
225
- SUDO() { sudo "$@"; }
226
- else
227
- SUDO() { echo "$PW" | sudo -S "$@"; }
228
- fi
229
- m "${{ env.PAW_M_cicd_ssh_auth }}" method="${SSH_AUTH_METHOD}"
230
-
231
- BRANCH=${{ github.ref_name }}
232
- PROJECT_NAME="${{ env.PROJECT_NAME }}"
233
-
234
- # Per-branch port and container name
235
- PORT=3000
236
- CONTAINER_NAME="${PROJECT_NAME}-nextjs"
237
-
238
- if [ "$BRANCH" == "{{MAIN_BRANCH}}" ]; then
239
- PORT=${{ secrets.PROJECT_DEPLOY_PORT || '3000' }}
240
- CONTAINER_NAME="${PROJECT_NAME}-nextjs-deploy"
241
- m "${{ env.PAW_M_cicd_deploy_start }}" branch="$BRANCH"
242
- else
243
- m "${{ env.PAW_M_cicd_branch_unsupported }}" branch="$BRANCH"
244
- exit 1
245
- fi
246
-
247
- m "${{ env.PAW_M_cicd_config_title }}"
248
- m "${{ env.PAW_M_cicd_config_branch }}" branch="$BRANCH"
249
- m "${{ env.PAW_M_cicd_config_project }}" project="$PROJECT_NAME"
250
- m "${{ env.PAW_M_cicd_config_container }}" container="$CONTAINER_NAME"
251
- m "${{ env.PAW_M_cicd_config_port }}" port="$PORT"
252
- m "${{ env.PAW_M_cicd_config_image }}" image="${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}-${{ env.DOCKER_IMAGE_PREFIX }}:${BRANCH}"
253
-
254
- # Pull the Docker image
255
- m "${{ env.PAW_M_cicd_pull_image_short }}"
256
- SUDO docker pull ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}-${{ env.DOCKER_IMAGE_PREFIX }}:${BRANCH}
257
-
258
- # Clean up the existing container
259
- m "${{ env.PAW_M_cicd_container_check }}" container="$CONTAINER_NAME"
260
-
261
- if SUDO docker ps -a --format '{{.Names}}' | grep -Eq "^${CONTAINER_NAME}\$"; then
262
- m "${{ env.PAW_M_cicd_container_exists }}" container="$CONTAINER_NAME"
263
- SUDO docker rm -f $CONTAINER_NAME
264
- m "${{ env.PAW_M_cicd_container_removed }}" container="$CONTAINER_NAME"
265
- else
266
- m "${{ env.PAW_M_cicd_container_none }}" container="$CONTAINER_NAME"
267
- fi
268
-
269
- # Start the new container
270
- m "${{ env.PAW_M_cicd_container_run }}" container="$CONTAINER_NAME"
271
-
272
- # Next.js needs a Node.js server for SSR
273
- # With standalone mode, run it with node server.js
274
- SUDO docker run -d \
275
- -p ${PORT}:3000 \
276
- --name $CONTAINER_NAME \
277
- -e TZ=Asia/Seoul \
278
- -e NODE_ENV=production \
279
- -v /etc/localtime:/etc/localtime:ro \
280
- --restart unless-stopped \
281
- ${{ secrets.DOCKERHUB_USERNAME }}/${PROJECT_NAME}-${{ env.DOCKER_IMAGE_PREFIX }}:${BRANCH}
282
-
283
- # Confirm the deployment
284
- m "${{ env.PAW_M_cicd_deploy_done }}"
285
- echo ""
286
- m "${{ env.PAW_M_cicd_summary_title }}"
287
- m "${{ env.PAW_M_cicd_summary_project }}" project="$PROJECT_NAME"
288
- m "${{ env.PAW_M_cicd_summary_branch }}" branch="$BRANCH"
289
- m "${{ env.PAW_M_cicd_summary_container }}" container="$CONTAINER_NAME"
290
- m "${{ env.PAW_M_cicd_summary_port }}" port="$PORT"
291
- m "${{ env.PAW_M_cicd_summary_time }}" time="$(date '+%Y-%m-%d %H:%M:%S')"
292
- echo ""
293
- m "${{ env.PAW_M_cicd_summary_url }}" url="http://${{ secrets.SERVER_HOST }}:${PORT}"
294
-
295
- # Next.js Dockerfile example (standalone mode)
296
- #
297
- # # Stage 1: Dependencies
298
- # FROM node:20-alpine AS deps
299
- # WORKDIR /app
300
- # COPY package*.json ./
301
- # RUN npm ci --only=production
302
- #
303
- # # Stage 2: Builder
304
- # FROM node:20-alpine AS builder
305
- # WORKDIR /app
306
- # COPY --from=deps /app/node_modules ./node_modules
307
- # COPY . .
308
- # RUN npm run build
309
- #
310
- # # Stage 3: Runner
311
- # FROM node:20-alpine AS runner
312
- # WORKDIR /app
313
- # ENV NODE_ENV production
314
- #
315
- # RUN addgroup --system --gid 1001 nodejs
316
- # RUN adduser --system --uid 1001 nextjs
317
- #
318
- # COPY --from=builder /app/public ./public
319
- # COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
320
- # COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
321
- #
322
- # USER nextjs
323
- # EXPOSE 3000
324
- # ENV PORT 3000
325
- # CMD ["node", "server.js"]
326
- #
327
- # Add the standalone setting to next.config.js:
328
- # module.exports = {
329
- # output: 'standalone',
330
- # }