yodogawa 1.0.0
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/.windsurf/templates/documentation-rules.md +143 -0
- package/.windsurf/templates/project/01-requirements/01-system-overview.md +49 -0
- package/.windsurf/templates/project/01-requirements/02-features-implemented.md +73 -0
- package/.windsurf/templates/project/01-requirements/03-features-planned.md +75 -0
- package/.windsurf/templates/project/01-requirements/04-non-functional-requirements.md +115 -0
- package/.windsurf/templates/project/01-requirements/05-user-stories.md +124 -0
- package/.windsurf/templates/project/02-behavior/01-scenarios.md +406 -0
- package/.windsurf/templates/project/03-domain/01-domain-model.md +338 -0
- package/.windsurf/templates/project/03-domain/02-ubiquitous-language.md +153 -0
- package/.windsurf/templates/project/04-design/01-tech-stack.md +360 -0
- package/.windsurf/templates/project/04-design/02-repository-structure.md +390 -0
- package/.windsurf/templates/project/04-design/03-screen-design.md +586 -0
- package/.windsurf/templates/project/04-design/04-data-model.md +211 -0
- package/.windsurf/templates/project/04-design/05-api-spec.md +221 -0
- package/.windsurf/templates/project/04-design/06-architecture.md +183 -0
- package/.windsurf/templates/project/04-design/07-infrastructure.md +180 -0
- package/.windsurf/templates/tasks/task-template/a-definition.md +143 -0
- package/.windsurf/templates/tasks/task-template/b-research.md +185 -0
- package/.windsurf/templates/tasks/task-template/c-implementation.md +197 -0
- package/.windsurf/workflows/a-001-SetupDocStructure.md +165 -0
- package/.windsurf/workflows/a-002-InitializeProject.md +229 -0
- package/.windsurf/workflows/a-003-CreateScenarios.md +130 -0
- package/.windsurf/workflows/a-004-DefineDomainModel.md +133 -0
- package/.windsurf/workflows/a-005-CreateDomainDiagram.md +114 -0
- package/.windsurf/workflows/a-006-ReviewRequirementsDomain.md +132 -0
- package/.windsurf/workflows/a-007-DefineTechStack.md +121 -0
- package/.windsurf/workflows/a-008-DefineRepositoryStructure.md +118 -0
- package/.windsurf/workflows/a-009-DefineScreenDesign.md +121 -0
- package/.windsurf/workflows/a-010-DefineDataModel.md +125 -0
- package/.windsurf/workflows/a-011-DefineAPISpec.md +123 -0
- package/.windsurf/workflows/a-012-DefineArchitecture.md +119 -0
- package/.windsurf/workflows/a-013-DefineInfrastructure.md +120 -0
- package/.windsurf/workflows/a-014-ReviewDesign.md +122 -0
- package/.windsurf/workflows/b-001-CreateTaskDirectory.md +71 -0
- package/.windsurf/workflows/b-002-CreateTaskDefinition.md +165 -0
- package/.windsurf/workflows/b-003-CreateTaskResearch.md +412 -0
- package/.windsurf/workflows/b-004-CreateTaskImplementation.md +97 -0
- package/.windsurf/workflows/b-005-ReviewTask.md +312 -0
- package/.windsurf/workflows/c-001-ImplementTask.md +493 -0
- package/.windsurf/workflows/c-002-UpdateDocumentation.md +797 -0
- package/.windsurf/workflows/x-Accessibility-Check.md +469 -0
- package/.windsurf/workflows/x-Bundle-Optimize.md +386 -0
- package/.windsurf/workflows/x-CI-FixFailure.md +636 -0
- package/.windsurf/workflows/x-CI-Setup.md +641 -0
- package/.windsurf/workflows/x-Code-Refactor.md +71 -0
- package/.windsurf/workflows/x-Code-ResearchAndReview.md +78 -0
- package/.windsurf/workflows/x-Component-Create.md +359 -0
- package/.windsurf/workflows/x-Context-CatchUp.md +63 -0
- package/.windsurf/workflows/x-Database-Seed.md +300 -0
- package/.windsurf/workflows/x-Dependencies-Update.md +315 -0
- package/.windsurf/workflows/x-DevEnvironment-Setup.md +437 -0
- package/.windsurf/workflows/x-Logging-Add.md +682 -0
- package/.windsurf/workflows/x-Migration-Create.md +354 -0
- package/.windsurf/workflows/x-Problem-RootCauseAnalysis.md +65 -0
- package/.windsurf/workflows/x-Repository-Push.md +375 -0
- package/.windsurf/workflows/x-Repository-PushToGithub.md +72 -0
- package/.windsurf/workflows/x-Requirements-Clarify.md +61 -0
- package/.windsurf/workflows/z-CreateWorkflow.md +77 -0
- package/README.md +280 -0
- package/bin/cli.js +74 -0
- package/package.json +28 -0
|
@@ -0,0 +1,641 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: GitHub Actions/GitLab CIでビルド・テスト・デプロイを自動化するCI/CDパイプラインをセットアップするワークフロー
|
|
3
|
+
auto_execution_mode: 1
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CI-Setup (x-CI-Setup)
|
|
7
|
+
|
|
8
|
+
## 目的
|
|
9
|
+
|
|
10
|
+
- コードをプッシュするたびに自動でビルド・テスト・デプロイを実行する CI/CD パイプラインを構築する。
|
|
11
|
+
- Pull Request ごとに自動テストを実行し、品質を担保する。
|
|
12
|
+
- main/master ブランチへのマージ時に自動デプロイを実行する。
|
|
13
|
+
- CI/CD のベストプラクティス(キャッシュ、並列実行、失敗時の通知)を適用する。
|
|
14
|
+
|
|
15
|
+
## 前提
|
|
16
|
+
|
|
17
|
+
- Git リポジトリが GitHub または GitLab でホストされている。
|
|
18
|
+
- プロジェクトに package.json または requirements.txt などの依存関係ファイルが存在する。
|
|
19
|
+
- テストコマンドが定義されている(`npm test`, `pytest`, など)。
|
|
20
|
+
- デプロイ先が決まっている(Vercel, Netlify, AWS, Heroku, など)。
|
|
21
|
+
|
|
22
|
+
## 手順
|
|
23
|
+
|
|
24
|
+
### 1. CI/CD プラットフォームの選択
|
|
25
|
+
|
|
26
|
+
プロジェクトに適した CI/CD プラットフォームを選択します。
|
|
27
|
+
|
|
28
|
+
**主要なCI/CDプラットフォームの特徴**:
|
|
29
|
+
- **GitHub Actions**: GitHub ホスティングなら推奨。無料枠が充実(2,000分/月)
|
|
30
|
+
- **GitLab CI**: GitLab ホスティングなら推奨。無料枠あり(400分/月)
|
|
31
|
+
- **CircleCI**: 高機能だが設定が複雑。無料枠(2,500クレジット/月)
|
|
32
|
+
- **Jenkins**: セルフホスト型。柔軟だが保守コストが高い
|
|
33
|
+
- **Azure Pipelines**: Azure 統合。無料枠(1,800分/月)
|
|
34
|
+
|
|
35
|
+
### 2. GitHub Actions のセットアップ
|
|
36
|
+
|
|
37
|
+
#### 2.1. ワークフローファイルの作成
|
|
38
|
+
|
|
39
|
+
**一般的な CI ジョブの種類**:
|
|
40
|
+
- **リント**: コードスタイルチェック(ESLint, Prettier, Ruff, Black, RuboCop など)
|
|
41
|
+
- **ユニットテスト**: アプリケーションロジックのテスト
|
|
42
|
+
- **統合テスト**: コンポーネント間の統合テスト
|
|
43
|
+
- **E2E テスト**: エンドツーエンドの動作確認(Playwright, Cypress など)
|
|
44
|
+
- **ビルド**: 本番用ビルドの生成
|
|
45
|
+
- **セキュリティスキャン**: 脆弱性検出(npm audit, Snyk, Trivy など)
|
|
46
|
+
- **デプロイ**: 本番環境またはステージング環境への自動デプロイ
|
|
47
|
+
|
|
48
|
+
**ワークフローファイルの配置**:
|
|
49
|
+
```
|
|
50
|
+
.github/
|
|
51
|
+
└── workflows/
|
|
52
|
+
├── ci.yml # PR ごとのテスト
|
|
53
|
+
├── deploy.yml # main マージ時のデプロイ
|
|
54
|
+
└── nightly.yml # 定期実行(夜間テスト)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
#### 2.2. 基本的な CI ワークフロー
|
|
58
|
+
|
|
59
|
+
**.github/workflows/ci.yml**:
|
|
60
|
+
```yaml
|
|
61
|
+
name: CI
|
|
62
|
+
|
|
63
|
+
# トリガー: PR 作成・更新、main プッシュ
|
|
64
|
+
on:
|
|
65
|
+
pull_request:
|
|
66
|
+
branches: [main, develop]
|
|
67
|
+
push:
|
|
68
|
+
branches: [main, develop]
|
|
69
|
+
|
|
70
|
+
# 並列実行をキャンセル(同じ PR の古いビルドをキャンセル)
|
|
71
|
+
concurrency:
|
|
72
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
73
|
+
cancel-in-progress: true
|
|
74
|
+
|
|
75
|
+
jobs:
|
|
76
|
+
lint:
|
|
77
|
+
name: Lint
|
|
78
|
+
runs-on: ubuntu-latest
|
|
79
|
+
steps:
|
|
80
|
+
- name: Checkout code
|
|
81
|
+
uses: actions/checkout@v4
|
|
82
|
+
|
|
83
|
+
- name: Setup Node.js
|
|
84
|
+
uses: actions/setup-node@v4
|
|
85
|
+
with:
|
|
86
|
+
node-version: '20'
|
|
87
|
+
cache: 'npm'
|
|
88
|
+
|
|
89
|
+
- name: Install dependencies
|
|
90
|
+
run: npm ci
|
|
91
|
+
|
|
92
|
+
- name: Run linter
|
|
93
|
+
run: npm run lint
|
|
94
|
+
|
|
95
|
+
test:
|
|
96
|
+
name: Test
|
|
97
|
+
runs-on: ubuntu-latest
|
|
98
|
+
strategy:
|
|
99
|
+
matrix:
|
|
100
|
+
node-version: [18, 20, 22]
|
|
101
|
+
steps:
|
|
102
|
+
- name: Checkout code
|
|
103
|
+
uses: actions/checkout@v4
|
|
104
|
+
|
|
105
|
+
- name: Setup Node.js ${{ matrix.node-version }}
|
|
106
|
+
uses: actions/setup-node@v4
|
|
107
|
+
with:
|
|
108
|
+
node-version: ${{ matrix.node-version }}
|
|
109
|
+
cache: 'npm'
|
|
110
|
+
|
|
111
|
+
- name: Install dependencies
|
|
112
|
+
run: npm ci
|
|
113
|
+
|
|
114
|
+
- name: Run tests
|
|
115
|
+
run: npm test
|
|
116
|
+
|
|
117
|
+
- name: Upload coverage
|
|
118
|
+
uses: codecov/codecov-action@v4
|
|
119
|
+
if: matrix.node-version == '20'
|
|
120
|
+
with:
|
|
121
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
122
|
+
files: ./coverage/coverage-final.json
|
|
123
|
+
|
|
124
|
+
build:
|
|
125
|
+
name: Build
|
|
126
|
+
runs-on: ubuntu-latest
|
|
127
|
+
steps:
|
|
128
|
+
- name: Checkout code
|
|
129
|
+
uses: actions/checkout@v4
|
|
130
|
+
|
|
131
|
+
- name: Setup Node.js
|
|
132
|
+
uses: actions/setup-node@v4
|
|
133
|
+
with:
|
|
134
|
+
node-version: '20'
|
|
135
|
+
cache: 'npm'
|
|
136
|
+
|
|
137
|
+
- name: Install dependencies
|
|
138
|
+
run: npm ci
|
|
139
|
+
|
|
140
|
+
- name: Build project
|
|
141
|
+
run: npm run build
|
|
142
|
+
|
|
143
|
+
- name: Upload build artifacts
|
|
144
|
+
uses: actions/upload-artifact@v4
|
|
145
|
+
with:
|
|
146
|
+
name: build
|
|
147
|
+
path: dist/
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### 2.3. デプロイワークフロー
|
|
151
|
+
|
|
152
|
+
**.github/workflows/deploy.yml**:
|
|
153
|
+
```yaml
|
|
154
|
+
name: Deploy
|
|
155
|
+
|
|
156
|
+
on:
|
|
157
|
+
push:
|
|
158
|
+
branches: [main]
|
|
159
|
+
|
|
160
|
+
jobs:
|
|
161
|
+
deploy:
|
|
162
|
+
name: Deploy to Production
|
|
163
|
+
runs-on: ubuntu-latest
|
|
164
|
+
environment:
|
|
165
|
+
name: production
|
|
166
|
+
url: https://myapp.com
|
|
167
|
+
steps:
|
|
168
|
+
- name: Checkout code
|
|
169
|
+
uses: actions/checkout@v4
|
|
170
|
+
|
|
171
|
+
- name: Setup Node.js
|
|
172
|
+
uses: actions/setup-node@v4
|
|
173
|
+
with:
|
|
174
|
+
node-version: '20'
|
|
175
|
+
cache: 'npm'
|
|
176
|
+
|
|
177
|
+
- name: Install dependencies
|
|
178
|
+
run: npm ci
|
|
179
|
+
|
|
180
|
+
- name: Build project
|
|
181
|
+
run: npm run build
|
|
182
|
+
|
|
183
|
+
- name: Deploy to Vercel
|
|
184
|
+
uses: amondnet/vercel-action@v25
|
|
185
|
+
with:
|
|
186
|
+
vercel-token: ${{ secrets.VERCEL_TOKEN }}
|
|
187
|
+
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
|
|
188
|
+
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
|
|
189
|
+
vercel-args: '--prod'
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### 3. GitLab CI のセットアップ
|
|
193
|
+
|
|
194
|
+
**.gitlab-ci.yml**:
|
|
195
|
+
```yaml
|
|
196
|
+
# Docker イメージ
|
|
197
|
+
image: node:20
|
|
198
|
+
|
|
199
|
+
# ステージ定義
|
|
200
|
+
stages:
|
|
201
|
+
- lint
|
|
202
|
+
- test
|
|
203
|
+
- build
|
|
204
|
+
- deploy
|
|
205
|
+
|
|
206
|
+
# キャッシュ設定
|
|
207
|
+
cache:
|
|
208
|
+
paths:
|
|
209
|
+
- node_modules/
|
|
210
|
+
key:
|
|
211
|
+
files:
|
|
212
|
+
- package-lock.json
|
|
213
|
+
|
|
214
|
+
# リント
|
|
215
|
+
lint:
|
|
216
|
+
stage: lint
|
|
217
|
+
script:
|
|
218
|
+
- npm ci
|
|
219
|
+
- npm run lint
|
|
220
|
+
|
|
221
|
+
# テスト(複数 Node バージョン)
|
|
222
|
+
test:node18:
|
|
223
|
+
stage: test
|
|
224
|
+
image: node:18
|
|
225
|
+
script:
|
|
226
|
+
- npm ci
|
|
227
|
+
- npm test
|
|
228
|
+
coverage: '/Lines\s*:\s*(\d+\.\d+)%/'
|
|
229
|
+
artifacts:
|
|
230
|
+
reports:
|
|
231
|
+
coverage_report:
|
|
232
|
+
coverage_format: cobertura
|
|
233
|
+
path: coverage/cobertura-coverage.xml
|
|
234
|
+
|
|
235
|
+
test:node20:
|
|
236
|
+
stage: test
|
|
237
|
+
image: node:20
|
|
238
|
+
script:
|
|
239
|
+
- npm ci
|
|
240
|
+
- npm test
|
|
241
|
+
|
|
242
|
+
# ビルド
|
|
243
|
+
build:
|
|
244
|
+
stage: build
|
|
245
|
+
script:
|
|
246
|
+
- npm ci
|
|
247
|
+
- npm run build
|
|
248
|
+
artifacts:
|
|
249
|
+
paths:
|
|
250
|
+
- dist/
|
|
251
|
+
expire_in: 1 week
|
|
252
|
+
only:
|
|
253
|
+
- main
|
|
254
|
+
- develop
|
|
255
|
+
|
|
256
|
+
# デプロイ(本番環境)
|
|
257
|
+
deploy:production:
|
|
258
|
+
stage: deploy
|
|
259
|
+
script:
|
|
260
|
+
- npm ci
|
|
261
|
+
- npm run build
|
|
262
|
+
- npm run deploy
|
|
263
|
+
environment:
|
|
264
|
+
name: production
|
|
265
|
+
url: https://myapp.com
|
|
266
|
+
only:
|
|
267
|
+
- main
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### 4. 環境変数とシークレットの設定
|
|
271
|
+
|
|
272
|
+
デプロイに必要な API キーやトークンなどの機密情報を安全に管理します。
|
|
273
|
+
|
|
274
|
+
#### 4.1. GitHub Actions のシークレット設定
|
|
275
|
+
|
|
276
|
+
**GitHub リポジトリページ**:
|
|
277
|
+
1. Settings → Secrets and variables → Actions
|
|
278
|
+
2. "New repository secret" をクリック
|
|
279
|
+
3. シークレット名と値を入力
|
|
280
|
+
|
|
281
|
+
**よく使われるシークレット**:
|
|
282
|
+
- `VERCEL_TOKEN`: Vercel デプロイトークン
|
|
283
|
+
- `AWS_ACCESS_KEY_ID`: AWS アクセスキー
|
|
284
|
+
- `AWS_SECRET_ACCESS_KEY`: AWS シークレットキー
|
|
285
|
+
- `DOCKER_USERNAME`: Docker Hub ユーザー名
|
|
286
|
+
- `DOCKER_PASSWORD`: Docker Hub パスワード
|
|
287
|
+
- `CODECOV_TOKEN`: Codecov トークン
|
|
288
|
+
|
|
289
|
+
**ワークフローで使用**:
|
|
290
|
+
```yaml
|
|
291
|
+
- name: Deploy to AWS
|
|
292
|
+
env:
|
|
293
|
+
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
|
294
|
+
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
|
295
|
+
run: |
|
|
296
|
+
aws s3 sync dist/ s3://my-bucket/
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
#### 4.2. GitLab CI の変数
|
|
300
|
+
|
|
301
|
+
**GitLab プロジェクトページ**:
|
|
302
|
+
1. Settings → CI/CD → Variables
|
|
303
|
+
2. "Add variable" をクリック
|
|
304
|
+
3. Key, Value, Flags(Protected, Masked)を設定
|
|
305
|
+
|
|
306
|
+
**ワークフローで使用**:
|
|
307
|
+
```yaml
|
|
308
|
+
deploy:production:
|
|
309
|
+
script:
|
|
310
|
+
- echo "Deploying with token $DEPLOY_TOKEN"
|
|
311
|
+
variables:
|
|
312
|
+
DEPLOY_TOKEN: $CI_DEPLOY_TOKEN
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### 5. キャッシュの最適化
|
|
316
|
+
|
|
317
|
+
依存関係のキャッシュを設定することで、CI 実行時間を大幅に短縮できます。
|
|
318
|
+
|
|
319
|
+
#### 5.1. GitHub Actions のキャッシュ設定
|
|
320
|
+
|
|
321
|
+
**npm キャッシュ**:
|
|
322
|
+
```yaml
|
|
323
|
+
- name: Setup Node.js
|
|
324
|
+
uses: actions/setup-node@v4
|
|
325
|
+
with:
|
|
326
|
+
node-version: '20'
|
|
327
|
+
cache: 'npm' # 自動キャッシュ
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
**手動キャッシュ**:
|
|
331
|
+
```yaml
|
|
332
|
+
- name: Cache dependencies
|
|
333
|
+
uses: actions/cache@v4
|
|
334
|
+
with:
|
|
335
|
+
path: ~/.npm
|
|
336
|
+
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
|
|
337
|
+
restore-keys: |
|
|
338
|
+
${{ runner.os }}-node-
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**ビルドキャッシュ(Next.js)**:
|
|
342
|
+
```yaml
|
|
343
|
+
- name: Cache Next.js build
|
|
344
|
+
uses: actions/cache@v4
|
|
345
|
+
with:
|
|
346
|
+
path: ${{ github.workspace }}/.next/cache
|
|
347
|
+
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
|
|
348
|
+
restore-keys: |
|
|
349
|
+
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
#### 5.2. GitLab CI のキャッシュ
|
|
353
|
+
|
|
354
|
+
```yaml
|
|
355
|
+
cache:
|
|
356
|
+
paths:
|
|
357
|
+
- node_modules/
|
|
358
|
+
- .next/cache/
|
|
359
|
+
key:
|
|
360
|
+
files:
|
|
361
|
+
- package-lock.json
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### 6. マトリックスビルド(複数環境テスト)
|
|
365
|
+
|
|
366
|
+
複数のランタイムバージョンや OS でテストすることで、互換性を確保します。
|
|
367
|
+
|
|
368
|
+
**GitHub Actions でのマトリックスビルド例**:
|
|
369
|
+
```yaml
|
|
370
|
+
test:
|
|
371
|
+
runs-on: ${{ matrix.os }}
|
|
372
|
+
strategy:
|
|
373
|
+
matrix:
|
|
374
|
+
os: [ubuntu-latest, windows-latest, macos-latest]
|
|
375
|
+
node-version: [18, 20, 22]
|
|
376
|
+
steps:
|
|
377
|
+
- uses: actions/checkout@v4
|
|
378
|
+
- name: Setup Node.js ${{ matrix.node-version }}
|
|
379
|
+
uses: actions/setup-node@v4
|
|
380
|
+
with:
|
|
381
|
+
node-version: ${{ matrix.node-version }}
|
|
382
|
+
- run: npm ci
|
|
383
|
+
- run: npm test
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### 7. E2E テストの実行
|
|
387
|
+
|
|
388
|
+
E2E テストを CI に組み込み、実際のユーザー操作をシミュレートして動作を確認します。
|
|
389
|
+
|
|
390
|
+
**主要な E2E テストフレームワーク**: Playwright, Cypress, Selenium, Puppeteer
|
|
391
|
+
|
|
392
|
+
**Playwright を使用した例(GitHub Actions)**:
|
|
393
|
+
```yaml
|
|
394
|
+
e2e:
|
|
395
|
+
name: E2E Tests
|
|
396
|
+
runs-on: ubuntu-latest
|
|
397
|
+
steps:
|
|
398
|
+
- uses: actions/checkout@v4
|
|
399
|
+
- uses: actions/setup-node@v4
|
|
400
|
+
with:
|
|
401
|
+
node-version: '20'
|
|
402
|
+
cache: 'npm'
|
|
403
|
+
- run: npm ci
|
|
404
|
+
- run: npx playwright install --with-deps
|
|
405
|
+
- run: npm run build
|
|
406
|
+
- run: npm run test:e2e
|
|
407
|
+
- uses: actions/upload-artifact@v4
|
|
408
|
+
if: failure()
|
|
409
|
+
with:
|
|
410
|
+
name: playwright-report
|
|
411
|
+
path: playwright-report/
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
**Cypress + GitHub Actions**:
|
|
415
|
+
```yaml
|
|
416
|
+
e2e:
|
|
417
|
+
name: E2E Tests
|
|
418
|
+
runs-on: ubuntu-latest
|
|
419
|
+
steps:
|
|
420
|
+
- uses: actions/checkout@v4
|
|
421
|
+
- uses: cypress-io/github-action@v6
|
|
422
|
+
with:
|
|
423
|
+
build: npm run build
|
|
424
|
+
start: npm start
|
|
425
|
+
wait-on: 'http://localhost:3000'
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### 8. Docker イメージのビルドとプッシュ
|
|
429
|
+
|
|
430
|
+
コンテナ化されたアプリケーションの場合、Docker イメージを自動ビルドしてレジストリにプッシュします。
|
|
431
|
+
|
|
432
|
+
**主要なコンテナレジストリ**: Docker Hub, GitHub Container Registry (ghcr.io), AWS ECR, Google GCR
|
|
433
|
+
|
|
434
|
+
**GitHub Actions での Docker ビルド例**:
|
|
435
|
+
```yaml
|
|
436
|
+
docker:
|
|
437
|
+
name: Build and Push Docker Image
|
|
438
|
+
runs-on: ubuntu-latest
|
|
439
|
+
steps:
|
|
440
|
+
- uses: actions/checkout@v4
|
|
441
|
+
|
|
442
|
+
- name: Set up Docker Buildx
|
|
443
|
+
uses: docker/setup-buildx-action@v3
|
|
444
|
+
|
|
445
|
+
- name: Login to Docker Hub
|
|
446
|
+
uses: docker/login-action@v3
|
|
447
|
+
with:
|
|
448
|
+
username: ${{ secrets.DOCKER_USERNAME }}
|
|
449
|
+
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
450
|
+
|
|
451
|
+
- name: Build and push
|
|
452
|
+
uses: docker/build-push-action@v5
|
|
453
|
+
with:
|
|
454
|
+
context: .
|
|
455
|
+
push: true
|
|
456
|
+
tags: myusername/myapp:latest
|
|
457
|
+
cache-from: type=gha
|
|
458
|
+
cache-to: type=gha,mode=max
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### 9. 通知の設定
|
|
462
|
+
|
|
463
|
+
CI の失敗や成功をチームに通知することで、問題を迅速に把握できます。
|
|
464
|
+
|
|
465
|
+
**主要な通知先**: Slack, Discord, Microsoft Teams, Email
|
|
466
|
+
|
|
467
|
+
**Slack 通知の例(GitHub Actions)**:
|
|
468
|
+
```yaml
|
|
469
|
+
- name: Notify Slack on failure
|
|
470
|
+
if: failure()
|
|
471
|
+
uses: slackapi/slack-github-action@v1
|
|
472
|
+
with:
|
|
473
|
+
payload: |
|
|
474
|
+
{
|
|
475
|
+
"text": "CI failed for ${{ github.repository }}",
|
|
476
|
+
"blocks": [
|
|
477
|
+
{
|
|
478
|
+
"type": "section",
|
|
479
|
+
"text": {
|
|
480
|
+
"type": "mrkdwn",
|
|
481
|
+
"text": "❌ CI failed\n*Repository:* ${{ github.repository }}\n*Branch:* ${{ github.ref }}\n*Commit:* ${{ github.sha }}"
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
]
|
|
485
|
+
}
|
|
486
|
+
env:
|
|
487
|
+
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### 10. ステータスバッジの追加
|
|
491
|
+
|
|
492
|
+
**README.md にステータスバッジを追加**:
|
|
493
|
+
|
|
494
|
+
**GitHub Actions**:
|
|
495
|
+
```markdown
|
|
496
|
+
[](https://github.com/username/repo/actions/workflows/ci.yml)
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
**GitLab CI**:
|
|
500
|
+
```markdown
|
|
501
|
+
[](https://gitlab.com/username/repo/-/commits/main)
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
**Codecov**:
|
|
505
|
+
```markdown
|
|
506
|
+
[](https://codecov.io/gh/username/repo)
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
### 11. CI の実行と動作確認
|
|
510
|
+
|
|
511
|
+
CI ワークフローの設定が完了したら、実際にコードをプッシュして動作を確認します。
|
|
512
|
+
|
|
513
|
+
**確認手順**:
|
|
514
|
+
1. テスト用のブランチを作成してコードを変更
|
|
515
|
+
```bash
|
|
516
|
+
git checkout -b feature/ci-setup
|
|
517
|
+
git add .
|
|
518
|
+
git commit -m "ci: add CI/CD workflows"
|
|
519
|
+
git push origin feature/ci-setup
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
2. Pull Request を作成
|
|
523
|
+
|
|
524
|
+
3. CI の実行状況を確認
|
|
525
|
+
- **GitHub Actions**: リポジトリの Actions タブ
|
|
526
|
+
- **GitLab CI**: プロジェクトの CI/CD → Pipelines
|
|
527
|
+
- **CircleCI**: ダッシュボード
|
|
528
|
+
|
|
529
|
+
4. ログを確認
|
|
530
|
+
- すべてのジョブ(lint, test, build)が成功しているか確認
|
|
531
|
+
- エラーがある場合は、ログを読んで原因を特定
|
|
532
|
+
- `/x-CI-FixFailure` ワークフローを使用して修正
|
|
533
|
+
|
|
534
|
+
5. PR で CI ステータスを確認
|
|
535
|
+
- PR ページで緑色のチェックマークが表示されることを確認
|
|
536
|
+
- "All checks have passed" が表示されれば成功
|
|
537
|
+
|
|
538
|
+
### 12. デプロイの動作確認
|
|
539
|
+
|
|
540
|
+
main ブランチへのマージ時に自動デプロイが実行されることを確認します。
|
|
541
|
+
|
|
542
|
+
**確認手順**:
|
|
543
|
+
1. CI が成功した PR を main ブランチにマージ
|
|
544
|
+
```bash
|
|
545
|
+
git checkout main
|
|
546
|
+
git pull origin main
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
2. デプロイワークフローの実行を確認
|
|
550
|
+
- GitHub Actions / GitLab CI のページでデプロイジョブが実行されていることを確認
|
|
551
|
+
|
|
552
|
+
3. デプロイ先で動作確認
|
|
553
|
+
- デプロイ先の URL にアクセスして、変更が反映されているか確認
|
|
554
|
+
- ログを確認して、エラーが発生していないか確認
|
|
555
|
+
|
|
556
|
+
### 13. Git コミット
|
|
557
|
+
|
|
558
|
+
```bash
|
|
559
|
+
git add .github/workflows/
|
|
560
|
+
# または
|
|
561
|
+
git add .gitlab-ci.yml
|
|
562
|
+
|
|
563
|
+
git commit -m "ci: setup CI/CD pipeline
|
|
564
|
+
|
|
565
|
+
- Add GitHub Actions workflows for lint, test, build
|
|
566
|
+
- Add deploy workflow for Vercel
|
|
567
|
+
- Enable dependency caching for faster builds
|
|
568
|
+
- Add matrix build for Node 18, 20, 22
|
|
569
|
+
- Add E2E tests with Playwright
|
|
570
|
+
- Add Docker image build and push
|
|
571
|
+
- Add Slack notification on failure
|
|
572
|
+
- Add status badges to README
|
|
573
|
+
|
|
574
|
+
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
575
|
+
|
|
576
|
+
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
## 完了条件
|
|
580
|
+
|
|
581
|
+
- CI/CD ワークフローファイルが作成されている
|
|
582
|
+
- リント・テスト・ビルドが自動実行される
|
|
583
|
+
- PR ごとに CI が実行される
|
|
584
|
+
- main マージ時にデプロイが実行される
|
|
585
|
+
- 依存関係のキャッシュが設定されている
|
|
586
|
+
- シークレット(API キー、トークン)が安全に管理されている
|
|
587
|
+
- 失敗時の通知が設定されている(オプション)
|
|
588
|
+
- ステータスバッジが README に追加されている
|
|
589
|
+
- すべてのジョブが成功する
|
|
590
|
+
|
|
591
|
+
## エスカレーション
|
|
592
|
+
|
|
593
|
+
- **CI が失敗する**:
|
|
594
|
+
- 「CI が失敗しました。以下を確認してください:」
|
|
595
|
+
- ログを確認してエラー原因を特定
|
|
596
|
+
- ローカル環境で再現するか確認
|
|
597
|
+
- 依存関係のインストールエラー(`npm ci` → `npm install` に変更)
|
|
598
|
+
- テストの失敗(ローカルでテストを実行)
|
|
599
|
+
- ビルドエラー(環境変数の不足)
|
|
600
|
+
|
|
601
|
+
- **キャッシュが効かない**:
|
|
602
|
+
- 「キャッシュが効いていません。以下を確認してください:」
|
|
603
|
+
- キャッシュキーが正しいか(`package-lock.json` のハッシュ)
|
|
604
|
+
- `npm ci` を使用しているか(`npm install` はキャッシュ効率が悪い)
|
|
605
|
+
- キャッシュの有効期限(GitHub Actions は 7 日間)
|
|
606
|
+
|
|
607
|
+
- **デプロイが失敗する**:
|
|
608
|
+
- 「デプロイが失敗しました。以下を確認してください:」
|
|
609
|
+
- シークレットが正しく設定されているか
|
|
610
|
+
- デプロイ先のサービス(Vercel, AWS)の権限
|
|
611
|
+
- ビルド成果物が正しく生成されているか
|
|
612
|
+
- デプロイコマンドが正しいか
|
|
613
|
+
|
|
614
|
+
- **CI が遅い**:
|
|
615
|
+
- 「CI の実行時間が長すぎます。以下を検討してください:」
|
|
616
|
+
- キャッシュの有効化
|
|
617
|
+
- 並列実行の活用(マトリックスビルド)
|
|
618
|
+
- 不要なステップの削除
|
|
619
|
+
- 依存関係の削減
|
|
620
|
+
- セルフホストランナーの使用(GitHub Actions)
|
|
621
|
+
|
|
622
|
+
- **費用が高い**:
|
|
623
|
+
- 「CI/CD の費用が高騰しています。以下を検討してください:」
|
|
624
|
+
- 無料枠の確認(GitHub Actions: 2,000 分/月)
|
|
625
|
+
- 不要なワークフローの削除
|
|
626
|
+
- `concurrency` でキャンセル設定
|
|
627
|
+
- マトリックスビルドの削減
|
|
628
|
+
- セルフホストランナーの使用
|
|
629
|
+
|
|
630
|
+
## ベストプラクティス
|
|
631
|
+
|
|
632
|
+
- **キャッシュの活用**: 依存関係とビルド成果物をキャッシュ
|
|
633
|
+
- **並列実行**: 複数ジョブを並列で実行して時間短縮
|
|
634
|
+
- **早期失敗**: リントを最初に実行し、早期にフィードバック
|
|
635
|
+
- **マトリックスビルド**: 複数環境で互換性を確認
|
|
636
|
+
- **シークレット管理**: 機密情報は絶対にコードに含めない
|
|
637
|
+
- **ステータスチェック必須化**: PR マージ前に CI 成功を必須に
|
|
638
|
+
- **通知設定**: 失敗時のみ通知(成功時は通知しない)
|
|
639
|
+
- **ワークフロー分離**: lint, test, deploy を別ワークフローに
|
|
640
|
+
- **環境の分離**: ステージング環境と本番環境を分ける
|
|
641
|
+
- **ロールバック計画**: デプロイ失敗時のロールバック手順を準備
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 技術的負債の棚卸しから改善案立案・リファクタリング実施・検証までを体系化したコード改善ワークフロー
|
|
3
|
+
auto_execution_mode: 1
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code-Refactor (x-Code-Refactor)
|
|
7
|
+
|
|
8
|
+
## 目的
|
|
9
|
+
|
|
10
|
+
- 技術的負債やコードスメルを体系的に洗い出し、優先度に基づく改善を実施する。
|
|
11
|
+
- SOLID原則やデザインパターンを適用し、保守性・可読性・テスト容易性を高める。
|
|
12
|
+
- リファクタリング結果を裏付けるテストとメトリクスを整備し、継続的改善サイクルを確立する。
|
|
13
|
+
|
|
14
|
+
## 前提
|
|
15
|
+
|
|
16
|
+
- 対象リポジトリの最新ブランチを取得済みで、既存テストが動作すること。
|
|
17
|
+
- 静的解析ツール(Ruff / ESLint / Stylelint など)とテストランナー(pytest / npm test 等)が `run_command` または既存ランナブル経由で実行可能。
|
|
18
|
+
- 依存する設計ガイドラインやコーディング規約、アーキテクチャ決定記録(ADR)が参照可能。
|
|
19
|
+
- 影響範囲が大きい場合は、レビュー担当者や関係チーム(QA / SRE / プロダクトオーナー)と連携できる体制が整っていること。
|
|
20
|
+
|
|
21
|
+
## 手順
|
|
22
|
+
|
|
23
|
+
1. **スコーピングとゴール定義**
|
|
24
|
+
- 依頼元の課題(例: 高循環複雑度、重複ロジック、依存性の肥大化)をヒアリングし、改善完了の判定基準を明文化する。
|
|
25
|
+
- 影響範囲(モジュール、サービス、UIコンポーネントなど)とリスクレベルを整理し、必要ならステークホルダーの承認を得る。
|
|
26
|
+
|
|
27
|
+
2. **現状診断と負債インベントリ作成**
|
|
28
|
+
- 静的解析(`run_command` で Ruff / ESLint / sonar など)を実行し、重大度別に指摘を収集する。
|
|
29
|
+
- 循環的複雑度・LOC・依存グラフなどのメトリクスを取得し、改善効果の測定項目を決定する。
|
|
30
|
+
- コードレビューやログ調査を通じて、ドメイン知識を持つメンバーから非機能的な問題(パフォーマンス、セキュリティ)もヒアリングする。
|
|
31
|
+
|
|
32
|
+
3. **改善方針と設計プランの策定**
|
|
33
|
+
- SOLID 原則/デザインパターン適用方針、分割単位(モジュール化、関数抽出、クラス化)を決定する。
|
|
34
|
+
- 変更前後の依存関係図や簡易シーケンスを作成し、副作用の有無を評価する。
|
|
35
|
+
|
|
36
|
+
4. **安全策とテスト体制の準備**
|
|
37
|
+
- 既存テストのカバレッジを確認し、欠けているユースケースは先にテスト追加またはゴールデンマスター生成でカバーする。
|
|
38
|
+
- 回帰防止のための統合テスト/スナップショットテスト/E2E(Playwright MCP や既存CI)を実行計画に組み込む。
|
|
39
|
+
- リファクタリング前にブランチを切り、CI/CDパイプラインや検証用環境が正しく動くか確認する。
|
|
40
|
+
|
|
41
|
+
5. **リファクタリング実施**
|
|
42
|
+
- 小さなコミット単位で変更し、各ステップ後に lint・フォーマッタ・単体テストを実行して動作確認する。
|
|
43
|
+
- 変換処理が大規模な場合は MorphLLM などのコード変換MCPを活用しつつ、生成結果をレビュー基準に照らして手修正する。
|
|
44
|
+
- 公開APIやドメイン契約を変更する場合は、互換性やマイグレーション手順を同時に整備する。
|
|
45
|
+
|
|
46
|
+
6. **検証と品質ゲート通過**
|
|
47
|
+
- 追加・更新したテストが成功することを確認し、CIステータスとカバレッジ変化を記録する。
|
|
48
|
+
- スタティックアナライザの再実行で警告が減少しているか、残課題がある場合は理由と対応計画を明記する。
|
|
49
|
+
- Web UI 変更を伴う場合は Playwright MCP や Chrome DevTools MCP でレンダリング/パフォーマンスを検証する。
|
|
50
|
+
|
|
51
|
+
7. **レビュー準備とナレッジ共有**
|
|
52
|
+
- 変更の意図、リファクタリングパターン、残課題を PR テンプレートやドキュメントに整理する。
|
|
53
|
+
- 影響範囲を受けるドキュメント(設計図、開発ガイド、スタイルガイド)を更新し、PM Agent へのナレッジ登録を検討する。
|
|
54
|
+
- レビュワーに必要な検証手順やスクリーンショット/ログを添付し、レビューサイクルを円滑化する。
|
|
55
|
+
|
|
56
|
+
8. **フォローアップ**
|
|
57
|
+
- デプロイ後のモニタリング(エラーレート、レスポンス時間、ユーザー行動)をチェックし、回帰がないか確認する。
|
|
58
|
+
- 追加で必要な改善項目や後続タスクが判明した場合は、技術負債リストやバックログへ記録する。
|
|
59
|
+
- リファクタリングの効果(メトリクス改善、レビュー所要時間短縮など)を定量的に振り返り、学びを共有する。
|
|
60
|
+
|
|
61
|
+
## 完了条件
|
|
62
|
+
|
|
63
|
+
- リファクタリング対象の課題が解消され、事前に定めた成功基準を満たしている。
|
|
64
|
+
- lint・テスト・カバレッジ・パフォーマンスなどの品質ゲートが通過し、残課題は文書化されている。
|
|
65
|
+
- 変更内容・検証結果・フォローアップが関係者へ共有され、レビューまたはデプロイ準備が整っている。
|
|
66
|
+
|
|
67
|
+
## エスカレーション
|
|
68
|
+
|
|
69
|
+
- 重大な設計変更やビジネス影響が懸念される場合は、アーキテクト/プロダクトオーナーと合意形成する。
|
|
70
|
+
- リファクタリング過程でブロッキングなバグや既存仕様の不備に遭遇した際は、直ちにチームリードへ報告し対応方針を協議する。
|
|
71
|
+
- CI/CD や MCP ツールで障害が発生し作業継続が困難な場合は、SRE/DevOps担当へ連絡し復旧を依頼する。
|