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,636 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: CI/CDパイプラインの失敗をデバッグし、根本原因を特定して修正するワークフロー
|
|
3
|
+
auto_execution_mode: 1
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CI-FixFailure (x-CI-FixFailure)
|
|
7
|
+
|
|
8
|
+
## 目的
|
|
9
|
+
|
|
10
|
+
- CI/CD パイプラインの失敗を迅速にデバッグし、原因を特定する。
|
|
11
|
+
- ローカル環境で CI の失敗を再現し、修正する。
|
|
12
|
+
- 再発防止策を実施し、CI の安定性を向上させる。
|
|
13
|
+
- チームに失敗の原因と修正内容を共有する。
|
|
14
|
+
|
|
15
|
+
## 前提
|
|
16
|
+
|
|
17
|
+
- CI/CD パイプラインが設定されている(GitHub Actions, GitLab CI, など)。
|
|
18
|
+
- CI ログにアクセスできる。
|
|
19
|
+
- ローカル開発環境が整備されている。
|
|
20
|
+
- Git リポジトリが初期化されている。
|
|
21
|
+
|
|
22
|
+
## 手順
|
|
23
|
+
|
|
24
|
+
### 1. CI 失敗の確認
|
|
25
|
+
|
|
26
|
+
CI の失敗は通常、以下の方法で通知されます:
|
|
27
|
+
- **GitHub / GitLab の Pull Request ページ**: 赤い × マークが表示される
|
|
28
|
+
- **メール通知**: GitHub/GitLab から自動送信される
|
|
29
|
+
- **チャット通知**: Slack / Discord / Teams に通知される
|
|
30
|
+
- **CI/CD ダッシュボード**: Actions / Pipelines ページで確認
|
|
31
|
+
|
|
32
|
+
**GitHub Actions での確認方法**:
|
|
33
|
+
1. GitHub リポジトリ → Actions タブ
|
|
34
|
+
2. 失敗したワークフローをクリック
|
|
35
|
+
3. 失敗したジョブをクリック
|
|
36
|
+
|
|
37
|
+
**GitLab CI の確認**:
|
|
38
|
+
1. GitLab プロジェクト → CI/CD → Pipelines
|
|
39
|
+
2. 失敗したパイプラインをクリック
|
|
40
|
+
3. 失敗したジョブをクリック
|
|
41
|
+
|
|
42
|
+
### 2. エラーログの分析
|
|
43
|
+
|
|
44
|
+
失敗したステップとエラーメッセージを特定します。
|
|
45
|
+
|
|
46
|
+
**一般的な失敗ステップ**:
|
|
47
|
+
- **依存関係のインストール**: `npm install`, `pip install`, `bundle install`
|
|
48
|
+
- **リント**: ESLint, Prettier, Black, RuboCop
|
|
49
|
+
- **型チェック**: TypeScript, mypy, sorbet
|
|
50
|
+
- **ユニットテスト**: Jest, pytest, RSpec
|
|
51
|
+
- **E2E テスト**: Playwright, Cypress
|
|
52
|
+
- **ビルド**: `npm run build`, `cargo build`, `go build`
|
|
53
|
+
- **デプロイ**: Vercel, AWS, Heroku
|
|
54
|
+
|
|
55
|
+
**ログでのエラーメッセージの探し方**:
|
|
56
|
+
```bash
|
|
57
|
+
# 🔍 探すべきキーワード:
|
|
58
|
+
# ERROR, FAILED, ✗, ❌, Exit code 1, Exception
|
|
59
|
+
|
|
60
|
+
# 例:
|
|
61
|
+
# ✗ 3 tests failed
|
|
62
|
+
# ERROR: Command failed with exit code 1
|
|
63
|
+
# npm ERR! code ELIFECYCLE
|
|
64
|
+
# AssertionError: expected 3 to equal 4
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
エラーメッセージをコピーして、原因の分析に進みます。
|
|
68
|
+
|
|
69
|
+
### 3. よくある失敗パターンと修正方法
|
|
70
|
+
|
|
71
|
+
#### 3.1. 依存関係のインストール失敗
|
|
72
|
+
|
|
73
|
+
**エラー例**:
|
|
74
|
+
```
|
|
75
|
+
npm ERR! code ENOENT
|
|
76
|
+
npm ERR! syscall open
|
|
77
|
+
npm ERR! path /home/runner/work/myapp/myapp/package.json
|
|
78
|
+
npm ERR! errno -2
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**原因**:
|
|
82
|
+
- `package.json` が存在しない
|
|
83
|
+
- ディレクトリ構造が間違っている
|
|
84
|
+
- Git で追跡されていない
|
|
85
|
+
|
|
86
|
+
**修正方法**:
|
|
87
|
+
```bash
|
|
88
|
+
# package.json が存在するか確認
|
|
89
|
+
ls -la package.json
|
|
90
|
+
|
|
91
|
+
# Git で追跡されているか確認
|
|
92
|
+
git ls-files package.json
|
|
93
|
+
|
|
94
|
+
# 追跡されていない場合は追加
|
|
95
|
+
git add package.json
|
|
96
|
+
git commit -m "fix: add package.json to git"
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**CI ワークフローの修正**:
|
|
100
|
+
```yaml
|
|
101
|
+
- name: Install dependencies
|
|
102
|
+
working-directory: ./path/to/project # ディレクトリ指定
|
|
103
|
+
run: npm ci
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### 3.2. 依存関係のバージョン競合
|
|
107
|
+
|
|
108
|
+
**エラー例**:
|
|
109
|
+
```
|
|
110
|
+
npm ERR! Could not resolve dependency:
|
|
111
|
+
npm ERR! peer react@"^18.0.0" from react-dom@18.2.0
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**原因**:
|
|
115
|
+
- 依存関係のバージョンが競合している
|
|
116
|
+
- `package-lock.json` が古い
|
|
117
|
+
|
|
118
|
+
**修正方法**:
|
|
119
|
+
```bash
|
|
120
|
+
# package-lock.json を削除して再生成
|
|
121
|
+
rm package-lock.json
|
|
122
|
+
npm install
|
|
123
|
+
|
|
124
|
+
# または特定のバージョンを指定
|
|
125
|
+
npm install react@18.2.0 react-dom@18.2.0
|
|
126
|
+
|
|
127
|
+
# Git にコミット
|
|
128
|
+
git add package.json package-lock.json
|
|
129
|
+
git commit -m "fix: resolve dependency conflicts"
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
#### 3.3. テストの失敗
|
|
133
|
+
|
|
134
|
+
**エラー例**:
|
|
135
|
+
```
|
|
136
|
+
FAIL src/utils/math.test.ts
|
|
137
|
+
✕ adds 1 + 2 to equal 3 (5 ms)
|
|
138
|
+
|
|
139
|
+
● adds 1 + 2 to equal 3
|
|
140
|
+
|
|
141
|
+
expect(received).toBe(expected) // Object.is equality
|
|
142
|
+
|
|
143
|
+
Expected: 3
|
|
144
|
+
Received: 4
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
**原因**:
|
|
148
|
+
- テストコードのバグ
|
|
149
|
+
- 実装コードのバグ
|
|
150
|
+
- テストデータの不整合
|
|
151
|
+
|
|
152
|
+
**修正方法**:
|
|
153
|
+
```bash
|
|
154
|
+
# ローカルでテストを実行
|
|
155
|
+
npm test
|
|
156
|
+
|
|
157
|
+
# 特定のテストファイルのみ実行
|
|
158
|
+
npm test -- src/utils/math.test.ts
|
|
159
|
+
|
|
160
|
+
# デバッグモードで実行
|
|
161
|
+
node --inspect-brk node_modules/.bin/jest --runInBand
|
|
162
|
+
|
|
163
|
+
# 修正後、再度テスト
|
|
164
|
+
npm test
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**テストコードの修正例**:
|
|
168
|
+
```typescript
|
|
169
|
+
// Before
|
|
170
|
+
expect(add(1, 2)).toBe(4); // ❌ 間違い
|
|
171
|
+
|
|
172
|
+
// After
|
|
173
|
+
expect(add(1, 2)).toBe(3); // ✅ 正しい
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
#### 3.4. リントエラー
|
|
177
|
+
|
|
178
|
+
**エラー例**:
|
|
179
|
+
```
|
|
180
|
+
/home/runner/work/myapp/myapp/src/index.ts
|
|
181
|
+
1:1 error 'React' is defined but never used @typescript-eslint/no-unused-vars
|
|
182
|
+
5:3 error Missing trailing comma comma-dangle
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**原因**:
|
|
186
|
+
- コードがリントルールに違反している
|
|
187
|
+
- ESLint / Prettier の設定不足
|
|
188
|
+
|
|
189
|
+
**修正方法**:
|
|
190
|
+
```bash
|
|
191
|
+
# ローカルでリントを実行
|
|
192
|
+
npm run lint
|
|
193
|
+
|
|
194
|
+
# 自動修正
|
|
195
|
+
npm run lint -- --fix
|
|
196
|
+
|
|
197
|
+
# Git にコミット
|
|
198
|
+
git add .
|
|
199
|
+
git commit -m "fix: resolve lint errors"
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**ESLint 設定の調整**:
|
|
203
|
+
```json
|
|
204
|
+
// .eslintrc.json
|
|
205
|
+
{
|
|
206
|
+
"rules": {
|
|
207
|
+
"@typescript-eslint/no-unused-vars": "warn", // error → warn に緩和
|
|
208
|
+
"comma-dangle": ["error", "always-multiline"]
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
#### 3.5. ビルドエラー
|
|
214
|
+
|
|
215
|
+
**エラー例**:
|
|
216
|
+
```
|
|
217
|
+
ERROR in ./src/index.tsx
|
|
218
|
+
Module not found: Error: Can't resolve './App' in '/home/runner/work/myapp/myapp/src'
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**原因**:
|
|
222
|
+
- インポートパスが間違っている
|
|
223
|
+
- ファイルが存在しない
|
|
224
|
+
- 大文字小文字の不一致(Windows ↔ Linux)
|
|
225
|
+
|
|
226
|
+
**修正方法**:
|
|
227
|
+
```typescript
|
|
228
|
+
// Before
|
|
229
|
+
import App from './app'; // ❌ Linux では大文字小文字を区別
|
|
230
|
+
|
|
231
|
+
// After
|
|
232
|
+
import App from './App'; // ✅ 正しいファイル名
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
#### 3.6. 環境変数の不足
|
|
236
|
+
|
|
237
|
+
**エラー例**:
|
|
238
|
+
```
|
|
239
|
+
Error: Environment variable NEXT_PUBLIC_API_URL is not defined
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**原因**:
|
|
243
|
+
- CI 環境で環境変数が設定されていない
|
|
244
|
+
- `.env` ファイルが Git にコミットされていない(正しい挙動)
|
|
245
|
+
|
|
246
|
+
**修正方法(GitHub Actions)**:
|
|
247
|
+
```yaml
|
|
248
|
+
- name: Build project
|
|
249
|
+
env:
|
|
250
|
+
NEXT_PUBLIC_API_URL: https://api.example.com
|
|
251
|
+
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
|
252
|
+
run: npm run build
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
**または GitHub Secrets に追加**:
|
|
256
|
+
1. Settings → Secrets and variables → Actions
|
|
257
|
+
2. "New repository secret" をクリック
|
|
258
|
+
3. `DATABASE_URL` を追加
|
|
259
|
+
|
|
260
|
+
#### 3.7. タイムアウトエラー
|
|
261
|
+
|
|
262
|
+
**エラー例**:
|
|
263
|
+
```
|
|
264
|
+
Error: Timeout - Async callback was not invoked within the 5000ms timeout specified by jest.setTimeout
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
**原因**:
|
|
268
|
+
- テストの実行時間が長すぎる
|
|
269
|
+
- 非同期処理が完了していない
|
|
270
|
+
|
|
271
|
+
**修正方法**:
|
|
272
|
+
```typescript
|
|
273
|
+
// テストファイルでタイムアウトを延長
|
|
274
|
+
jest.setTimeout(30000); // 30 秒
|
|
275
|
+
|
|
276
|
+
// または特定のテストで延長
|
|
277
|
+
it('should fetch data', async () => {
|
|
278
|
+
// ...
|
|
279
|
+
}, 30000); // 30 秒
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**CI ワークフローでタイムアウトを延長**:
|
|
283
|
+
```yaml
|
|
284
|
+
- name: Run tests
|
|
285
|
+
run: npm test
|
|
286
|
+
timeout-minutes: 10 # デフォルト: 360 分
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
#### 3.8. メモリ不足エラー
|
|
290
|
+
|
|
291
|
+
**エラー例**:
|
|
292
|
+
```
|
|
293
|
+
FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**原因**:
|
|
297
|
+
- Node.js のヒープメモリが不足している
|
|
298
|
+
- 大量のデータを処理している
|
|
299
|
+
|
|
300
|
+
**修正方法**:
|
|
301
|
+
```yaml
|
|
302
|
+
- name: Build project
|
|
303
|
+
run: NODE_OPTIONS="--max-old-space-size=4096" npm run build # 4GB に拡張
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
**package.json のスクリプト修正**:
|
|
307
|
+
```json
|
|
308
|
+
{
|
|
309
|
+
"scripts": {
|
|
310
|
+
"build": "NODE_OPTIONS='--max-old-space-size=4096' next build"
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
#### 3.9. キャッシュの問題
|
|
316
|
+
|
|
317
|
+
**エラー例**:
|
|
318
|
+
```
|
|
319
|
+
Error: Cannot find module 'express'
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
**原因**:
|
|
323
|
+
- キャッシュが古くなっている
|
|
324
|
+
- 依存関係が正しくインストールされていない
|
|
325
|
+
|
|
326
|
+
**修正方法(GitHub Actions)**:
|
|
327
|
+
```yaml
|
|
328
|
+
- name: Clear cache
|
|
329
|
+
run: npm cache clean --force
|
|
330
|
+
|
|
331
|
+
- name: Install dependencies
|
|
332
|
+
run: npm ci
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
**または CI でキャッシュを無効化**:
|
|
336
|
+
```yaml
|
|
337
|
+
- name: Setup Node.js
|
|
338
|
+
uses: actions/setup-node@v4
|
|
339
|
+
with:
|
|
340
|
+
node-version: '20'
|
|
341
|
+
# cache: 'npm' # キャッシュを無効化
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
#### 3.10. 並行実行の競合
|
|
345
|
+
|
|
346
|
+
**エラー例**:
|
|
347
|
+
```
|
|
348
|
+
Error: Port 3000 is already in use
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
**原因**:
|
|
352
|
+
- 複数のジョブが同じポートを使用している
|
|
353
|
+
- 前のジョブが終了していない
|
|
354
|
+
|
|
355
|
+
**修正方法**:
|
|
356
|
+
```yaml
|
|
357
|
+
- name: Start development server
|
|
358
|
+
run: npm start &
|
|
359
|
+
env:
|
|
360
|
+
PORT: ${{ job.container.id }} # 一意のポート番号
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**または順次実行**:
|
|
364
|
+
```yaml
|
|
365
|
+
jobs:
|
|
366
|
+
test:
|
|
367
|
+
runs-on: ubuntu-latest
|
|
368
|
+
# strategy を削除して並列実行を無効化
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### 4. ローカル環境での再現
|
|
372
|
+
|
|
373
|
+
CI の失敗をローカル環境で再現することで、デバッグが容易になります。
|
|
374
|
+
|
|
375
|
+
**CI 環境を模倣した実行**:
|
|
376
|
+
```bash
|
|
377
|
+
# クリーンな環境で実行
|
|
378
|
+
rm -rf node_modules package-lock.json
|
|
379
|
+
npm install
|
|
380
|
+
|
|
381
|
+
# CI と同じコマンドを実行
|
|
382
|
+
npm run lint
|
|
383
|
+
npm test
|
|
384
|
+
npm run build
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
**Docker で CI 環境を再現**:
|
|
388
|
+
```bash
|
|
389
|
+
# CI と同じ Node バージョンを使用
|
|
390
|
+
docker run -it --rm -v $(pwd):/app -w /app node:20 bash
|
|
391
|
+
|
|
392
|
+
# コンテナ内で実行
|
|
393
|
+
npm ci
|
|
394
|
+
npm test
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
### 5. 修正の実装
|
|
398
|
+
|
|
399
|
+
原因が特定できたら、修正を実装します。
|
|
400
|
+
|
|
401
|
+
**修正と検証の手順**:
|
|
402
|
+
1. コードを修正
|
|
403
|
+
2. ローカルでテストを実行して動作確認
|
|
404
|
+
```bash
|
|
405
|
+
npm run lint
|
|
406
|
+
npm test
|
|
407
|
+
npm run build
|
|
408
|
+
```
|
|
409
|
+
3. すべてのテストが通ることを確認
|
|
410
|
+
4. Git にコミット
|
|
411
|
+
```bash
|
|
412
|
+
git add .
|
|
413
|
+
git commit -m "fix: resolve CI test failures
|
|
414
|
+
|
|
415
|
+
- Fix import path for App component
|
|
416
|
+
- Add missing environment variables
|
|
417
|
+
- Increase test timeout to 30 seconds"
|
|
418
|
+
|
|
419
|
+
git push origin feature/fix-ci
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### 6. CI の再実行と結果確認
|
|
423
|
+
|
|
424
|
+
修正をプッシュすると CI が自動的に再実行されます。手動で再実行することも可能です。
|
|
425
|
+
|
|
426
|
+
**GitHub Actions の手動再実行**:
|
|
427
|
+
1. Actions タブで失敗したワークフローを開く
|
|
428
|
+
2. "Re-run jobs" → "Re-run all jobs" をクリック
|
|
429
|
+
|
|
430
|
+
**GitLab CI の手動再実行**:
|
|
431
|
+
1. パイプラインページで "Retry" をクリック
|
|
432
|
+
|
|
433
|
+
**結果の確認**:
|
|
434
|
+
- すべてのジョブが緑色のチェックマーク ✅ になることを確認
|
|
435
|
+
- 失敗が続く場合は、ログを再度確認して追加の修正を実施
|
|
436
|
+
|
|
437
|
+
### 7. 根本原因の分析
|
|
438
|
+
|
|
439
|
+
修正が完了したら、なぜ問題が発生したのか根本原因を分析します。
|
|
440
|
+
|
|
441
|
+
**一般的な根本原因**:
|
|
442
|
+
- **コードのバグ**: ロジックエラー、タイポ、誤った実装
|
|
443
|
+
- **環境設定の不足**: 環境変数、シークレット、設定ファイルの不足
|
|
444
|
+
- **依存関係の問題**: バージョン競合、欠落したパッケージ
|
|
445
|
+
- **CI 設定の誤り**: ワークフローファイルの誤設定、パスの間違い
|
|
446
|
+
- **環境差異**: ローカル(Windows/Mac)と CI(Linux)の違い
|
|
447
|
+
- **フレーク(不安定なテスト)**: タイミング依存、非決定的な動作
|
|
448
|
+
|
|
449
|
+
### 8. 再発防止策の実施
|
|
450
|
+
|
|
451
|
+
同じ問題が再発しないよう、適切な対策を講じます。
|
|
452
|
+
|
|
453
|
+
**推奨される対策**:
|
|
454
|
+
|
|
455
|
+
#### 8.1. Pre-commit フックの追加
|
|
456
|
+
|
|
457
|
+
**husky + lint-staged のインストール**:
|
|
458
|
+
```bash
|
|
459
|
+
npm install --save-dev husky lint-staged
|
|
460
|
+
npx husky init
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
**.husky/pre-commit**:
|
|
464
|
+
```bash
|
|
465
|
+
#!/bin/sh
|
|
466
|
+
npx lint-staged
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
**package.json**:
|
|
470
|
+
```json
|
|
471
|
+
{
|
|
472
|
+
"lint-staged": {
|
|
473
|
+
"*.{js,jsx,ts,tsx}": [
|
|
474
|
+
"eslint --fix",
|
|
475
|
+
"prettier --write"
|
|
476
|
+
]
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
#### 8.2. CI ステータスチェック必須化
|
|
482
|
+
|
|
483
|
+
**GitHub**:
|
|
484
|
+
1. Settings → Branches → Branch protection rules
|
|
485
|
+
2. "Require status checks to pass before merging" をチェック
|
|
486
|
+
3. 必須にしたいチェック(lint, test, build)を選択
|
|
487
|
+
|
|
488
|
+
#### 8.3. フレークテストの修正
|
|
489
|
+
|
|
490
|
+
**Retry 機能の追加**:
|
|
491
|
+
```typescript
|
|
492
|
+
// Jest
|
|
493
|
+
jest.retryTimes(3);
|
|
494
|
+
|
|
495
|
+
// Playwright
|
|
496
|
+
test('flaky test', async ({ page }) => {
|
|
497
|
+
// ...
|
|
498
|
+
}, { retries: 3 });
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
**Wait を適切に使用**:
|
|
502
|
+
```typescript
|
|
503
|
+
// Bad: 固定時間待機
|
|
504
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
505
|
+
|
|
506
|
+
// Good: 要素が表示されるまで待機
|
|
507
|
+
await page.waitForSelector('.loading', { state: 'hidden' });
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
#### 8.4. ドキュメントの更新
|
|
511
|
+
|
|
512
|
+
**README.md に CI トラブルシューティングセクションを追加**:
|
|
513
|
+
```markdown
|
|
514
|
+
## CI Troubleshooting
|
|
515
|
+
|
|
516
|
+
### Common Issues
|
|
517
|
+
|
|
518
|
+
#### 1. Test Timeout
|
|
519
|
+
If you encounter timeout errors, increase the timeout:
|
|
520
|
+
\`\`\`typescript
|
|
521
|
+
jest.setTimeout(30000);
|
|
522
|
+
\`\`\`
|
|
523
|
+
|
|
524
|
+
#### 2. Port Already in Use
|
|
525
|
+
Kill existing processes:
|
|
526
|
+
\`\`\`bash
|
|
527
|
+
lsof -ti:3000 | xargs kill -9
|
|
528
|
+
\`\`\`
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
### 9. チームへの共有
|
|
532
|
+
|
|
533
|
+
失敗の原因と修正内容をチームに共有することで、他のメンバーが同じ問題を回避できます。
|
|
534
|
+
|
|
535
|
+
**Pull Request コメントでの共有例**:
|
|
536
|
+
```markdown
|
|
537
|
+
## CI Failure Fix
|
|
538
|
+
|
|
539
|
+
### Issue
|
|
540
|
+
CI was failing due to missing environment variable `DATABASE_URL`.
|
|
541
|
+
|
|
542
|
+
### Root Cause
|
|
543
|
+
The environment variable was not set in GitHub Actions secrets.
|
|
544
|
+
|
|
545
|
+
### Fix
|
|
546
|
+
- Added `DATABASE_URL` to GitHub Secrets
|
|
547
|
+
- Updated `.github/workflows/ci.yml` to use the secret
|
|
548
|
+
|
|
549
|
+
### Prevention
|
|
550
|
+
- Document required environment variables in README
|
|
551
|
+
- Add validation script to check for missing env vars
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### 10. Git コミット
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
git add .
|
|
558
|
+
git commit -m "fix: resolve CI failures and add prevention measures
|
|
559
|
+
|
|
560
|
+
- Fix test timeout issues by increasing timeout to 30s
|
|
561
|
+
- Add missing DATABASE_URL environment variable
|
|
562
|
+
- Fix import path case sensitivity for Linux
|
|
563
|
+
- Add pre-commit hooks with husky and lint-staged
|
|
564
|
+
- Document CI troubleshooting in README
|
|
565
|
+
|
|
566
|
+
Root cause: Environment variable was not set in CI
|
|
567
|
+
Prevention: Added environment variable validation script
|
|
568
|
+
|
|
569
|
+
🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
|
570
|
+
|
|
571
|
+
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
## 完了条件
|
|
575
|
+
|
|
576
|
+
- CI の失敗原因が特定されている
|
|
577
|
+
- ローカル環境で失敗が再現されている
|
|
578
|
+
- 修正が実装され、ローカルでテストが通る
|
|
579
|
+
- CI が成功する
|
|
580
|
+
- 根本原因が分析されている
|
|
581
|
+
- 再発防止策が実施されている
|
|
582
|
+
- チームに失敗の原因と修正内容が共有されている
|
|
583
|
+
- ドキュメントが更新されている(必要に応じて)
|
|
584
|
+
|
|
585
|
+
## エスカレーション
|
|
586
|
+
|
|
587
|
+
- **エラーログが不明瞭**:
|
|
588
|
+
- 「エラーメッセージが不明瞭です。以下を試してください:」
|
|
589
|
+
- CI のログレベルを DEBUG に変更
|
|
590
|
+
- ローカルで同じコマンドを実行
|
|
591
|
+
- スタックトレースを確認
|
|
592
|
+
- 関連する issue や Stack Overflow を検索
|
|
593
|
+
|
|
594
|
+
- **ローカルでは成功するが CI で失敗する**:
|
|
595
|
+
- 「環境差異の可能性があります。以下を確認してください:」
|
|
596
|
+
- Node バージョンの違い
|
|
597
|
+
- OS の違い(Windows ↔ Linux)
|
|
598
|
+
- 環境変数の違い
|
|
599
|
+
- タイムゾーンの違い
|
|
600
|
+
- ファイルシステムの違い(大文字小文字)
|
|
601
|
+
|
|
602
|
+
- **フレークテスト(不安定なテスト)**:
|
|
603
|
+
- 「テストが不安定です。以下を検討してください:」
|
|
604
|
+
- Retry 機能の追加
|
|
605
|
+
- Wait を適切に使用
|
|
606
|
+
- テストの独立性を確保(共有状態を削除)
|
|
607
|
+
- テスト実行順序の固定
|
|
608
|
+
- タイムアウトの延長
|
|
609
|
+
|
|
610
|
+
- **CI が非常に遅い**:
|
|
611
|
+
- 「CI の実行時間が長すぎます。以下を検討してください:」
|
|
612
|
+
- キャッシュの有効化
|
|
613
|
+
- 並列実行の活用
|
|
614
|
+
- 不要なステップの削除
|
|
615
|
+
- テストの最適化
|
|
616
|
+
- セルフホストランナーの使用
|
|
617
|
+
|
|
618
|
+
- **複数の問題が同時発生**:
|
|
619
|
+
- 「複数の問題が同時に発生しています。以下を実施してください:」
|
|
620
|
+
- 一つずつ修正して確認
|
|
621
|
+
- Git bisect で問題が発生したコミットを特定
|
|
622
|
+
- main ブランチに戻して動作確認
|
|
623
|
+
- 変更を段階的に適用
|
|
624
|
+
|
|
625
|
+
## ベストプラクティス
|
|
626
|
+
|
|
627
|
+
- **早期発見**: Pre-commit フックで事前にチェック
|
|
628
|
+
- **詳細なログ**: エラー発生時は詳細なログを出力
|
|
629
|
+
- **環境の統一**: Docker で CI 環境を再現
|
|
630
|
+
- **フレークテスト対策**: Retry 機能と適切な Wait
|
|
631
|
+
- **ドキュメント化**: よくある問題と解決策を README に記載
|
|
632
|
+
- **モニタリング**: CI の成功率と実行時間を監視
|
|
633
|
+
- **定期的なメンテナンス**: 依存関係の更新、キャッシュのクリア
|
|
634
|
+
- **チームへの共有**: 失敗の原因と修正内容を共有
|
|
635
|
+
- **再発防止**: 根本原因を分析し、対策を実施
|
|
636
|
+
- **ステータスチェック必須化**: PR マージ前に CI 成功を必須に
|