@einja/dev-cli 0.1.23 → 0.1.24
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 +54 -30
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +10 -46
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +21 -0
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/task-loop/index.js +15 -15
- package/dist/commands/task-loop/index.js.map +1 -1
- package/dist/commands/task-loop/lib/types.d.ts +2 -2
- package/dist/commands/task-loop/lib/types.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts +15 -11
- package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts.map +1 -1
- package/dist/commands/task-loop/lib/vibe-kanban-client.js +42 -29
- package/dist/commands/task-loop/lib/vibe-kanban-client.js.map +1 -1
- package/dist/lib/dependency-checker.d.ts +31 -0
- package/dist/lib/dependency-checker.d.ts.map +1 -0
- package/dist/lib/dependency-checker.js +259 -0
- package/dist/lib/dependency-checker.js.map +1 -0
- package/dist/lib/package-manager.d.ts +15 -0
- package/dist/lib/package-manager.d.ts.map +1 -0
- package/dist/lib/package-manager.js +71 -0
- package/dist/lib/package-manager.js.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/presets/default/.claude/agents/einja/design-engineer.md +252 -434
- package/presets/default/.claude/agents/einja/frontend-architect.md +11 -11
- package/presets/default/.claude/agents/einja/frontend-coder.md +33 -21
- package/presets/default/.claude/skills/einja-coding-standards/SKILL.md +27 -16
- package/presets/default/.claude/skills/einja-component-design/SKILL.md +4 -4
- package/presets/default/.claude/skills/einja-component-design/reference/styling-guide.md +53 -131
- package/presets/default/preset.yaml +27 -0
- package/scaffolds/cli/preset.yaml +27 -0
- package/scaffolds/instructions/deployment-setup.md +40 -41
- package/scaffolds/steering/infrastructure/deployment.md +459 -66
|
@@ -15,10 +15,11 @@
|
|
|
15
15
|
|
|
16
16
|
1. [デプロイメントアーキテクチャ](#1-デプロイメントアーキテクチャ)
|
|
17
17
|
2. [プラットフォーム選定理由](#2-プラットフォーム選定理由)
|
|
18
|
-
3. [
|
|
19
|
-
4. [
|
|
20
|
-
5. [
|
|
21
|
-
6. [
|
|
18
|
+
3. [GitHub Actionsワークフロー](#3-github-actionsワークフロー)
|
|
19
|
+
4. [ブランチ別デプロイフロー](#4-ブランチ別デプロイフロー)
|
|
20
|
+
5. [キャッシュ戦略](#5-キャッシュ戦略)
|
|
21
|
+
6. [Worktree対応設計](#6-worktree対応設計)
|
|
22
|
+
7. [ロールバック戦略](#7-ロールバック戦略)
|
|
22
23
|
|
|
23
24
|
---
|
|
24
25
|
|
|
@@ -30,12 +31,22 @@
|
|
|
30
31
|
graph TB
|
|
31
32
|
subgraph "GitHub Repository"
|
|
32
33
|
Main[main branch]
|
|
34
|
+
Develop[develop branch]
|
|
35
|
+
Staging[staging branch]
|
|
33
36
|
Feature[feature branches]
|
|
34
37
|
end
|
|
35
38
|
|
|
39
|
+
subgraph "GitHub Actions"
|
|
40
|
+
DeployStable[Deploy Stable Branches<br/>CI → Deploy]
|
|
41
|
+
DeployPR[Deploy PR Preview<br/>CI → Neon → Deploy]
|
|
42
|
+
Cleanup[Cleanup DB<br/>毎日00:00 UTC]
|
|
43
|
+
end
|
|
44
|
+
|
|
36
45
|
subgraph "Vercel Platform"
|
|
37
46
|
WebProd[web - Production]
|
|
38
|
-
|
|
47
|
+
WebDev[web - Develop]
|
|
48
|
+
WebStg[web - Staging]
|
|
49
|
+
WebPreview[web - PR Preview]
|
|
39
50
|
end
|
|
40
51
|
|
|
41
52
|
subgraph "Railway Platform"
|
|
@@ -43,17 +54,28 @@ graph TB
|
|
|
43
54
|
end
|
|
44
55
|
|
|
45
56
|
subgraph "Neon Database"
|
|
46
|
-
DBProd[(Production DB)]
|
|
47
|
-
DBPreview[(Preview DB
|
|
57
|
+
DBProd[(Production DB<br/>定常ブランチ)]
|
|
58
|
+
DBPreview[(Preview DB<br/>動的生成)]
|
|
48
59
|
end
|
|
49
60
|
|
|
50
|
-
Main -->|
|
|
51
|
-
|
|
61
|
+
Main -->|push| DeployStable
|
|
62
|
+
Develop -->|push| DeployStable
|
|
63
|
+
Staging -->|push| DeployStable
|
|
64
|
+
Feature -->|PR| DeployPR
|
|
65
|
+
|
|
66
|
+
DeployStable -->|main| WebProd
|
|
67
|
+
DeployStable -->|develop| WebDev
|
|
68
|
+
DeployStable -->|staging| WebStg
|
|
69
|
+
DeployPR --> WebPreview
|
|
70
|
+
|
|
71
|
+
Main -->|push| CronProd
|
|
52
72
|
|
|
53
|
-
|
|
54
|
-
|
|
73
|
+
DeployPR -->|Create Branch| DBPreview
|
|
74
|
+
Cleanup -->|Delete orphaned| DBPreview
|
|
55
75
|
|
|
56
76
|
WebProd --> DBProd
|
|
77
|
+
WebDev --> DBProd
|
|
78
|
+
WebStg --> DBProd
|
|
57
79
|
WebPreview --> DBPreview
|
|
58
80
|
CronProd --> DBProd
|
|
59
81
|
```
|
|
@@ -62,9 +84,9 @@ graph TB
|
|
|
62
84
|
|
|
63
85
|
| アプリケーション | プラットフォーム | デプロイトリガー | 環境 |
|
|
64
86
|
|----------------|--------------|--------------|------|
|
|
65
|
-
| web | Vercel | main push, PR作成 | Production, Preview |
|
|
87
|
+
| web | Vercel | main/develop/staging push, PR作成 | Production, Preview |
|
|
66
88
|
| cron-worker | Railway | main push | Production |
|
|
67
|
-
| Database | Neon |
|
|
89
|
+
| Database | Neon | PR作成時のみ動的生成 | Production, Preview(動的生成) |
|
|
68
90
|
|
|
69
91
|
---
|
|
70
92
|
|
|
@@ -98,77 +120,447 @@ graph TB
|
|
|
98
120
|
|
|
99
121
|
---
|
|
100
122
|
|
|
101
|
-
## 3.
|
|
123
|
+
## 3. GitHub Actionsワークフロー
|
|
124
|
+
|
|
125
|
+
### ワークフロー一覧
|
|
126
|
+
|
|
127
|
+
```mermaid
|
|
128
|
+
graph LR
|
|
129
|
+
subgraph "ワークフロー構成"
|
|
130
|
+
DeployStable[deploy-stable-branches.yml]
|
|
131
|
+
DeployPR[deploy-pr-preview.yml]
|
|
132
|
+
CleanupClose[cleanup-pr-preview-on-close.yml]
|
|
133
|
+
Cleanup[cleanup-pr-preview-db.yml]
|
|
134
|
+
ReleaseCLI[release-cli.yml]
|
|
135
|
+
ReleaseApp[release-create-einja-app.yml]
|
|
136
|
+
Claude[claude.yml]
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
subgraph "Composite Actions"
|
|
140
|
+
SetupAction[.github/actions/setup/action.yml]
|
|
141
|
+
CIAction[.github/actions/ci/action.yml]
|
|
142
|
+
MigrateAction[.github/actions/migrate/action.yml]
|
|
143
|
+
NeonExportEnv[.github/actions/neon-export-env/action.yml]
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
DeployStable --> CIAction
|
|
147
|
+
DeployStable --> MigrateAction
|
|
148
|
+
DeployPR --> CIAction
|
|
149
|
+
DeployPR --> NeonExportEnv
|
|
150
|
+
CleanupClose --> NeonExportEnv
|
|
151
|
+
CIAction --> SetupAction
|
|
152
|
+
MigrateAction --> SetupAction
|
|
153
|
+
Cleanup --> SetupAction
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
| ワークフロー | ファイル | トリガー | 用途 |
|
|
157
|
+
|------------|---------|---------|------|
|
|
158
|
+
| **Deploy Stable** | `deploy-stable-branches.yml` | push to main/develop/staging | CI → 本番・開発・ステージング環境デプロイ |
|
|
159
|
+
| **PR Preview** | `deploy-pr-preview.yml` | PR opened/sync/closed | CI → Neonブランチ作成 → プレビューデプロイ |
|
|
160
|
+
| **PR Close Cleanup** | `cleanup-pr-preview-on-close.yml` | PR closed | Neonブランチの即座削除(PR close時) |
|
|
161
|
+
| **Cleanup DB** | `cleanup-pr-preview-db.yml` | 毎日00:00 UTC / 手動 | 孤立したNeonブランチ削除 |
|
|
162
|
+
| **Release CLI** | `release-cli.yml` | tag `cli-v*` / 手動 | @einja/dev-cli をNPM公開 |
|
|
163
|
+
| **Release App** | `release-create-einja-app.yml` | tag `create-einja-app-v*` / 手動 | create-einja-app をNPM公開 |
|
|
164
|
+
| **Claude** | `claude.yml` | @claude メンション | Claude Code実行 |
|
|
165
|
+
|
|
166
|
+
### Composite Actions(2層構造)
|
|
167
|
+
|
|
168
|
+
バージョン番号を1箇所に集約し、DRY原則に従った構成:
|
|
169
|
+
|
|
170
|
+
```mermaid
|
|
171
|
+
flowchart TB
|
|
172
|
+
subgraph "setup/action.yml"
|
|
173
|
+
S1[pnpm setup<br/>v10.14.0] --> S2[Node.js setup<br/>v22.16.0]
|
|
174
|
+
S2 --> S3[pnpm install]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
subgraph "ci/action.yml"
|
|
178
|
+
C1[setup action 呼び出し] --> C2[pnpm generate]
|
|
179
|
+
C2 --> C3[pnpm typecheck]
|
|
180
|
+
C3 --> C4[pnpm lint]
|
|
181
|
+
C4 --> C5[pnpm test]
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
subgraph "migrate/action.yml"
|
|
185
|
+
M1[setup action 呼び出し] --> M2[pnpm generate]
|
|
186
|
+
M2 --> M3[db:migrate:deploy]
|
|
187
|
+
M3 --> M4{run-seed?}
|
|
188
|
+
M4 -->|true| M5[db:seed]
|
|
189
|
+
M4 -->|false| M6[完了]
|
|
190
|
+
M5 --> M6
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
C1 -.-> S1
|
|
194
|
+
M1 -.-> S1
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
| Action | ファイル | 内容 | 呼び出し元 |
|
|
198
|
+
|--------|---------|------|-----------|
|
|
199
|
+
| **Setup** | `actions/setup/action.yml` | pnpm + Node.js + install | ci action, migrate action, cleanup |
|
|
200
|
+
| **CI** | `actions/ci/action.yml` | setup → generate → typecheck → lint → test | deploy-stable-branches, deploy-pr-preview |
|
|
201
|
+
| **Migrate** | `actions/migrate/action.yml` | setup → generate → migrate → seed (optional) | deploy-stable-branches |
|
|
202
|
+
| **Neon Export Env** | `actions/neon-export-env/action.yml` | .env.previewからNeon環境変数をエクスポート | deploy-pr-preview, cleanup-pr-preview-on-close |
|
|
203
|
+
|
|
204
|
+
### 実行マトリクス
|
|
205
|
+
|
|
206
|
+
| トリガー | Deploy Stable | PR Preview | 備考 |
|
|
207
|
+
|---------|:-------------:|:----------:|------|
|
|
208
|
+
| feature/* push | ❌ | - | CIなし(PR時に実行) |
|
|
209
|
+
| main push | ✅ | - | CI → 本番デプロイ |
|
|
210
|
+
| develop push | ✅ | - | CI → 開発環境デプロイ |
|
|
211
|
+
| staging push | ✅ | - | CI → ステージングデプロイ |
|
|
212
|
+
| PR → main/develop 作成 | ❌ | ✅ | CI → Neon作成 → プレビュー |
|
|
213
|
+
| PR → main/develop 更新 | ❌ | ✅ | CI → プレビュー更新 |
|
|
214
|
+
| PR クローズ | ❌ | ✅ | Neonブランチ削除 |
|
|
215
|
+
| フォークPR | ❌ | ❌ | Secret制限のため |
|
|
216
|
+
|
|
217
|
+
### ワークフロー シーケンス図
|
|
102
218
|
|
|
103
|
-
|
|
219
|
+
#### deploy-pr-preview.yml(PR → CI + プレビューデプロイ)
|
|
104
220
|
|
|
105
221
|
```mermaid
|
|
106
222
|
sequenceDiagram
|
|
107
223
|
participant Dev as 開発者
|
|
108
224
|
participant GH as GitHub
|
|
109
|
-
participant
|
|
110
|
-
participant
|
|
111
|
-
participant Cache as Vercel Cache
|
|
225
|
+
participant Actions as GitHub Actions
|
|
226
|
+
participant CI as CI Action
|
|
112
227
|
participant Neon as Neon Database
|
|
113
228
|
participant Vercel as Vercel
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
CI->>
|
|
124
|
-
|
|
125
|
-
CI->>CI:
|
|
229
|
+
|
|
230
|
+
Dev->>GH: PR作成/更新
|
|
231
|
+
GH->>Actions: deploy-pr-preview トリガー
|
|
232
|
+
|
|
233
|
+
rect rgb(240, 248, 255)
|
|
234
|
+
Note over Actions,CI: CI Checks
|
|
235
|
+
Actions->>CI: ci action 呼び出し
|
|
236
|
+
CI->>CI: setup (pnpm + Node.js)
|
|
237
|
+
CI->>CI: pnpm generate
|
|
238
|
+
CI->>CI: pnpm typecheck
|
|
239
|
+
CI->>CI: pnpm lint
|
|
240
|
+
CI->>CI: pnpm test
|
|
241
|
+
CI-->>Actions: CI完了
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
rect rgb(255, 248, 240)
|
|
245
|
+
Note over Actions,Neon: Neon Branch 作成
|
|
246
|
+
Actions->>Actions: dotenvx で NEON_API_KEY 取得
|
|
247
|
+
Actions->>Actions: pnpm generate (Prisma Client生成)
|
|
248
|
+
Actions->>Neon: preview/pr-{番号} ブランチ作成
|
|
249
|
+
Neon-->>Actions: DB URL (direct + pooled)
|
|
250
|
+
Actions->>Neon: pnpm db:push (スキーマ同期)
|
|
251
|
+
Actions->>Neon: pnpm db:seed (データ投入)
|
|
126
252
|
end
|
|
127
253
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
Turbo->>Turbo: ビルド実行
|
|
136
|
-
Turbo->>Cache: 結果アップロード
|
|
137
|
-
Turbo-->>CI: ビルド完了
|
|
138
|
-
|
|
139
|
-
CI->>Turbo: turbo run test
|
|
140
|
-
Turbo-->>CI: テスト完了
|
|
141
|
-
|
|
142
|
-
alt main ブランチ
|
|
143
|
-
CI->>Vercel: web デプロイ(Production DB使用)
|
|
144
|
-
CI->>Railway: cron-worker デプロイ
|
|
145
|
-
else PR作成時
|
|
146
|
-
CI->>Vercel: web preview デプロイ(Preview DB使用)
|
|
254
|
+
rect rgb(240, 255, 240)
|
|
255
|
+
Note over Actions,Vercel: Vercel デプロイ
|
|
256
|
+
Actions->>Vercel: vercel pull
|
|
257
|
+
Actions->>Vercel: 環境変数同期 (ブラックリスト除外)
|
|
258
|
+
Actions->>Vercel: vercel build (DATABASE_URL=pooled)
|
|
259
|
+
Actions->>Vercel: vercel deploy --prebuilt
|
|
260
|
+
Vercel-->>Actions: Preview URL
|
|
147
261
|
end
|
|
148
262
|
|
|
149
|
-
|
|
263
|
+
Actions->>GH: PRにコメント (Preview URL + Neon情報)
|
|
264
|
+
GH-->>Dev: 通知
|
|
150
265
|
```
|
|
151
266
|
|
|
152
|
-
|
|
267
|
+
#### deploy-stable-branches.yml(stable push → CI + 本番デプロイ)
|
|
268
|
+
|
|
269
|
+
```mermaid
|
|
270
|
+
sequenceDiagram
|
|
271
|
+
participant Dev as 開発者
|
|
272
|
+
participant GH as GitHub
|
|
273
|
+
participant Actions as GitHub Actions
|
|
274
|
+
participant CI as CI Action
|
|
275
|
+
participant Neon as Neon DB (定常)
|
|
276
|
+
participant Vercel as Vercel
|
|
277
|
+
|
|
278
|
+
Dev->>GH: main/develop/staging push
|
|
279
|
+
GH->>Actions: deploy-stable-branches トリガー
|
|
280
|
+
|
|
281
|
+
rect rgb(240, 248, 255)
|
|
282
|
+
Note over Actions,CI: CI Checks
|
|
283
|
+
Actions->>CI: ci action 呼び出し
|
|
284
|
+
CI->>CI: setup (pnpm + Node.js)
|
|
285
|
+
CI->>CI: pnpm generate
|
|
286
|
+
CI->>CI: pnpm typecheck
|
|
287
|
+
CI->>CI: pnpm lint
|
|
288
|
+
CI->>CI: pnpm test
|
|
289
|
+
CI-->>Actions: CI完了
|
|
290
|
+
end
|
|
153
291
|
|
|
154
|
-
|
|
155
|
-
|---------|-------|---------|----------|
|
|
156
|
-
| Setup | pnpm install, turbo login | - | ✅ |
|
|
157
|
-
| Lint | turbo run lint | ✅ | ✅ |
|
|
158
|
-
| Type Check | turbo run typecheck | ✅ | ✅ |
|
|
159
|
-
| Test | turbo run test | ✅ | ✅ |
|
|
160
|
-
| Build | turbo run build | ✅ | ✅ |
|
|
161
|
-
| Deploy | Vercel, Railway | ✅ | ❌ |
|
|
292
|
+
Actions->>Actions: ブランチ判定 (環境変数セット)
|
|
162
293
|
|
|
163
|
-
|
|
294
|
+
rect rgb(255, 248, 240)
|
|
295
|
+
Note over Actions,Neon: DB マイグレーション (main/stagingのみ)
|
|
296
|
+
Actions->>Neon: pnpm db:migrate:deploy
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
alt develop ブランチのみ
|
|
300
|
+
Actions->>Neon: pnpm db:seed
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
rect rgb(240, 255, 240)
|
|
304
|
+
Note over Actions,Vercel: Vercel デプロイ
|
|
305
|
+
Actions->>Vercel: vercel pull
|
|
306
|
+
Actions->>Vercel: 環境変数同期 (ブラックリスト除外)
|
|
307
|
+
Actions->>Vercel: vercel pull (Re-pull: 同期後の最新化)
|
|
308
|
+
Actions->>Vercel: vercel build [--prod]
|
|
309
|
+
Actions->>Vercel: vercel deploy --prebuilt [--prod]
|
|
310
|
+
Vercel-->>Actions: Deploy URL
|
|
311
|
+
end
|
|
312
|
+
|
|
313
|
+
alt develop/staging ブランチ
|
|
314
|
+
Actions->>Vercel: vercel alias (カスタムドメイン)
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
Actions-->>Dev: デプロイ完了
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
#### cleanup-pr-preview-db.yml(cron → setup + Neon cleanup)
|
|
321
|
+
|
|
322
|
+
```mermaid
|
|
323
|
+
sequenceDiagram
|
|
324
|
+
participant Cron as Cron (毎日00:00 UTC)
|
|
325
|
+
participant Actions as GitHub Actions
|
|
326
|
+
participant Setup as Setup Action
|
|
327
|
+
participant Neon as Neon Database
|
|
328
|
+
participant GHAPI as GitHub API
|
|
329
|
+
|
|
330
|
+
Cron->>Actions: cleanup-pr-preview-db トリガー
|
|
331
|
+
|
|
332
|
+
rect rgb(240, 248, 255)
|
|
333
|
+
Note over Actions,Setup: Setup
|
|
334
|
+
Actions->>Setup: setup action 呼び出し
|
|
335
|
+
Setup->>Setup: pnpm + Node.js
|
|
336
|
+
Setup->>Setup: pnpm install
|
|
337
|
+
Setup-->>Actions: Setup完了
|
|
338
|
+
end
|
|
339
|
+
|
|
340
|
+
Actions->>Actions: dotenvx で NEON_API_KEY 取得
|
|
341
|
+
|
|
342
|
+
rect rgb(255, 248, 240)
|
|
343
|
+
Note over Actions,GHAPI: Cleanup処理
|
|
344
|
+
Actions->>Neon: 全 preview/pr-* ブランチ取得
|
|
345
|
+
Neon-->>Actions: ブランチ一覧
|
|
346
|
+
|
|
347
|
+
loop 各ブランチ
|
|
348
|
+
Actions->>GHAPI: PR #{番号} の状態確認
|
|
349
|
+
GHAPI-->>Actions: PR状態
|
|
350
|
+
|
|
351
|
+
alt PR closed or 404
|
|
352
|
+
Actions->>Neon: ブランチ削除
|
|
353
|
+
else PR open or APIエラー
|
|
354
|
+
Actions->>Actions: スキップ (誤削除防止)
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
Actions->>Actions: Cleanup完了ログ
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
> **設計意図**: ci.ymlはpull_requestのみをトリガーとし、feature/* pushでの二重CI実行を防止
|
|
363
|
+
|
|
364
|
+
### 並行実行制御(Concurrency)
|
|
365
|
+
|
|
366
|
+
| ワークフロー | concurrencyグループ | cancel-in-progress | 説明 |
|
|
367
|
+
|------------|-------------------|:-----------------:|------|
|
|
368
|
+
| deploy-pr-preview | `pr-preview-{PR番号}` | true | 最新コミットのみデプロイ |
|
|
369
|
+
| cleanup-pr-preview-on-close | `pr-preview-{PR番号}` | true | 同グループでPRデプロイと排他制御 |
|
|
370
|
+
| deploy-stable-branches | `deploy-{ブランチ名}` | false | 全コミットを順次デプロイ |
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## 4. ブランチ別デプロイフロー
|
|
375
|
+
|
|
376
|
+
### mainブランチ(本番環境)
|
|
377
|
+
|
|
378
|
+
```mermaid
|
|
379
|
+
flowchart TD
|
|
380
|
+
A[git push main] --> B[deploy-stable-branches.yml]
|
|
381
|
+
B --> C[CI Checks]
|
|
382
|
+
C --> D{成功?}
|
|
383
|
+
D -->|Yes| E[dotenvx復号化]
|
|
384
|
+
D -->|No| X[失敗通知]
|
|
385
|
+
E --> F[Vercel Pull]
|
|
386
|
+
F --> G[環境変数同期]
|
|
387
|
+
G --> H[DB Migrate]
|
|
388
|
+
H --> I[Vercel Build]
|
|
389
|
+
I --> J[Vercel Deploy --prod]
|
|
390
|
+
J --> K[完了]
|
|
391
|
+
|
|
392
|
+
style A fill:#4CAF50
|
|
393
|
+
style K fill:#4CAF50
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**設定**:
|
|
397
|
+
- Vercel環境: `production`
|
|
398
|
+
- 暗号化ファイル: `.env.production`
|
|
399
|
+
- 復号鍵: `DOTENV_PRIVATE_KEY_PRODUCTION`
|
|
400
|
+
- DBマイグレーション: ✅
|
|
401
|
+
- DBシード: ❌(テストデータのため本番非対応)
|
|
402
|
+
- Alias設定: ❌
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
### developブランチ(開発環境)
|
|
407
|
+
|
|
408
|
+
```mermaid
|
|
409
|
+
flowchart TD
|
|
410
|
+
A[git push develop] --> B[deploy-stable-branches.yml]
|
|
411
|
+
B --> C[CI Checks]
|
|
412
|
+
C --> D{成功?}
|
|
413
|
+
D -->|Yes| E[dotenvx復号化]
|
|
414
|
+
D -->|No| X[失敗通知]
|
|
415
|
+
E --> F[Vercel Pull]
|
|
416
|
+
F --> G[環境変数同期]
|
|
417
|
+
G --> H[Vercel Build]
|
|
418
|
+
H --> I[Vercel Deploy]
|
|
419
|
+
I --> J[Alias設定]
|
|
420
|
+
J --> K[完了]
|
|
421
|
+
|
|
422
|
+
style A fill:#2196F3
|
|
423
|
+
style K fill:#2196F3
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
**設定**:
|
|
427
|
+
- Vercel環境: `preview`
|
|
428
|
+
- 暗号化ファイル: `.env.develop`
|
|
429
|
+
- 復号鍵: `DOTENV_PRIVATE_KEY_DEVELOP`
|
|
430
|
+
- DBマイグレーション: ❌(PR PreviewのNeonブランチで自動同期)
|
|
431
|
+
- DBシード: ❌
|
|
432
|
+
- Alias: `secrets.VERCEL_DEV_DOMAIN`
|
|
433
|
+
|
|
434
|
+
---
|
|
435
|
+
|
|
436
|
+
### stagingブランチ(ステージング環境)
|
|
437
|
+
|
|
438
|
+
```mermaid
|
|
439
|
+
flowchart TD
|
|
440
|
+
A[git push staging] --> B[deploy-stable-branches.yml]
|
|
441
|
+
B --> C[CI Checks]
|
|
442
|
+
C --> D{成功?}
|
|
443
|
+
D -->|Yes| E[dotenvx復号化]
|
|
444
|
+
D -->|No| X[失敗通知]
|
|
445
|
+
E --> F[Vercel Pull]
|
|
446
|
+
F --> G[環境変数同期]
|
|
447
|
+
G --> H[DB Migrate]
|
|
448
|
+
H --> I[Vercel Build]
|
|
449
|
+
I --> J[Vercel Deploy]
|
|
450
|
+
J --> K[Alias設定]
|
|
451
|
+
K --> L[完了]
|
|
452
|
+
|
|
453
|
+
style A fill:#FF9800
|
|
454
|
+
style L fill:#FF9800
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**設定**:
|
|
458
|
+
- Vercel環境: `preview`
|
|
459
|
+
- 暗号化ファイル: `.env.staging`
|
|
460
|
+
- 復号鍵: `DOTENV_PRIVATE_KEY_STAGING`
|
|
461
|
+
- DBマイグレーション: ✅
|
|
462
|
+
- DBシード: ❌(既存データ保持)
|
|
463
|
+
- Alias: `secrets.VERCEL_STG_DOMAIN`
|
|
464
|
+
|
|
465
|
+
---
|
|
466
|
+
|
|
467
|
+
### Pull Request(プレビュー環境)
|
|
468
|
+
|
|
469
|
+
```mermaid
|
|
470
|
+
flowchart TD
|
|
471
|
+
A[PR opened/sync] --> B[deploy-pr-preview.yml]
|
|
472
|
+
B --> C[pnpm/Node setup]
|
|
473
|
+
C --> D[Neon環境変数取得]
|
|
474
|
+
D --> E[親ブランチ決定]
|
|
475
|
+
E --> F[Neon Branch作成]
|
|
476
|
+
F --> G[DB Push]
|
|
477
|
+
G --> H[DB Seed]
|
|
478
|
+
H --> I[Vercel Build]
|
|
479
|
+
I --> J[Vercel Deploy]
|
|
480
|
+
J --> K[PRコメント]
|
|
481
|
+
K --> L[完了]
|
|
482
|
+
|
|
483
|
+
M[PR closed] --> N[cleanup-pr-preview-on-close.yml]
|
|
484
|
+
N --> O[Neon Branch即座削除]
|
|
485
|
+
O --> P[完了]
|
|
486
|
+
|
|
487
|
+
style A fill:#9C27B0
|
|
488
|
+
style L fill:#9C27B0
|
|
489
|
+
style M fill:#F44336
|
|
490
|
+
style P fill:#F44336
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
**設定**:
|
|
494
|
+
- Vercel環境: `preview`
|
|
495
|
+
- 暗号化ファイル: `.env.preview`
|
|
496
|
+
- 復号鍵: `DOTENV_PRIVATE_KEY_PREVIEW`
|
|
497
|
+
- Neonブランチ: `preview/pr-{PR番号}`
|
|
498
|
+
- 親ブランチ: PRのベースブランチ(main/develop等)
|
|
499
|
+
- Auto-suspend: 1日間アクセスなし
|
|
500
|
+
- PRコメント: Preview URL + Neon Branch情報
|
|
501
|
+
|
|
502
|
+
> **⚠️ 同時PR運用時の注意**
|
|
503
|
+
>
|
|
504
|
+
> テンプレートでは`vercel deploy --env DATABASE_URL=...`でデプロイ単位で
|
|
505
|
+
> DATABASE_URLを注入しています。これにより、同時に複数のPRがプレビュー
|
|
506
|
+
> デプロイされても、それぞれのPRが固有のNeonブランチDBを参照します。
|
|
507
|
+
>
|
|
508
|
+
> もし`vercel env add DATABASE_URL`方式を使用すると、Vercel Projectの
|
|
509
|
+
> preview環境変数が上書きされ、同時PRで競合するリスクがあります。
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
### 環境別設定一覧
|
|
514
|
+
|
|
515
|
+
| 環境 | ブランチ | Vercel環境 | DBマイグ | シード | Alias | 暗号化ファイル | 復号鍵 |
|
|
516
|
+
|------|---------|-----------|:-------:|:-----:|:-----:|--------------|--------|
|
|
517
|
+
| Production | main | production | ✅ | ❌ | ❌ | `.env.production` | `DOTENV_PRIVATE_KEY_PRODUCTION` |
|
|
518
|
+
| Develop | develop | preview | ❌ | ❌ | ✅ | `.env.develop` | `DOTENV_PRIVATE_KEY_DEVELOP` |
|
|
519
|
+
| Staging | staging | preview | ✅ | ❌ | ✅ | `.env.staging` | `DOTENV_PRIVATE_KEY_STAGING` |
|
|
520
|
+
| PR Preview | feature/* | preview | ✅ | ✅ | ❌ | `.env.preview` | `DOTENV_PRIVATE_KEY_PREVIEW` |
|
|
521
|
+
|
|
522
|
+
### Vercel環境変数の自動同期
|
|
523
|
+
|
|
524
|
+
ワークフローは `ENV_VAR_EXCLUDE` ブラックリスト正規表現で**同期対象外**を制御:
|
|
525
|
+
|
|
526
|
+
| ワークフロー | 除外フィルタ | 説明 |
|
|
527
|
+
|------------|-----------|------|
|
|
528
|
+
| PR Preview | `^(DOTENV_\|NEON_\|NODE_ENV$\|VERCEL_)` | DOTENV/Neon/Vercel内部変数を除外。DATABASE_URLはNeonブランチURLを`--env`で注入するため別途除外 |
|
|
529
|
+
| Stable Branches | `^(DOTENV_\|NODE_ENV$\|VERCEL_)` | DOTENV/Vercel内部変数を除外。DATABASE_URL含む全アプリ変数を同期 |
|
|
530
|
+
|
|
531
|
+
**設計意図**: ホワイトリスト方式だと新しい環境変数追加時にフィルタ更新漏れが発生するため、ブラックリスト方式を採用。
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
535
|
+
### Neonプレビューブランチのクリーンアップ
|
|
536
|
+
|
|
537
|
+
```mermaid
|
|
538
|
+
flowchart TD
|
|
539
|
+
A[毎日 00:00 UTC] --> B[cleanup-pr-preview-db.yml]
|
|
540
|
+
B --> C[Neon API: 全preview/*取得]
|
|
541
|
+
C --> D{各ブランチ}
|
|
542
|
+
D --> E[GitHub API: PR状態確認]
|
|
543
|
+
E --> F{PR状態}
|
|
544
|
+
F -->|closed| G[ブランチ削除]
|
|
545
|
+
F -->|404| G
|
|
546
|
+
F -->|open| H[スキップ]
|
|
547
|
+
F -->|APIエラー| H
|
|
548
|
+
G --> D
|
|
549
|
+
H --> D
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
**設計意図**:
|
|
553
|
+
- 孤立したNeonブランチの自動削除
|
|
554
|
+
- APIエラー時はスキップ(誤削除防止)
|
|
555
|
+
- コスト最適化
|
|
164
556
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
557
|
+
**2種類のクリーンアップ:**
|
|
558
|
+
1. **即時削除** (`cleanup-pr-preview-on-close.yml`): PR close時に即座にNeonブランチ削除
|
|
559
|
+
2. **定期クリーンアップ** (`cleanup-pr-preview-db.yml`): 毎日00:00 UTC、孤立ブランチ(手動削除漏れ等)をAPI経由で検知・削除
|
|
168
560
|
|
|
169
561
|
---
|
|
170
562
|
|
|
171
|
-
##
|
|
563
|
+
## 5. キャッシュ戦略
|
|
172
564
|
|
|
173
565
|
### Turborepo Remote Cache
|
|
174
566
|
|
|
@@ -200,7 +592,7 @@ sequenceDiagram
|
|
|
200
592
|
|
|
201
593
|
---
|
|
202
594
|
|
|
203
|
-
##
|
|
595
|
+
## 6. Worktree対応設計
|
|
204
596
|
|
|
205
597
|
### 課題
|
|
206
598
|
|
|
@@ -249,7 +641,7 @@ sequenceDiagram
|
|
|
249
641
|
|
|
250
642
|
---
|
|
251
643
|
|
|
252
|
-
##
|
|
644
|
+
## 7. ロールバック戦略
|
|
253
645
|
|
|
254
646
|
### 設計方針
|
|
255
647
|
|
|
@@ -287,6 +679,7 @@ sequenceDiagram
|
|
|
287
679
|
- [環境変数設計方針](./environment-variables.md)
|
|
288
680
|
- [デプロイセットアップ手順](../../instructions/deployment-setup.md)
|
|
289
681
|
- [環境変数セットアップ手順](../../instructions/environment-setup.md)
|
|
682
|
+
- [Vercel CLI/APIリファレンス](../../instructions/vercel-cli-reference.md)
|
|
290
683
|
<!-- @einja:managed:end -->
|
|
291
684
|
|
|
292
685
|
---
|