はじめに
こんにちは、YOUTRUST Webエンジニアのしぶしゅん(YOUTRUST / X)です。 今回は、昨年末に行った不要ファイル整理でCI設定の不具合を見つけて修正した話を紹介します。
不要ファイルの削除PR(Pull Request)
昨年末にリポジトリのソースコードの大掃除をWebエンジニアメンバーで行いました。私はフロントエンドコードを担当しました。継続的な改修によってコンポーネントが新しくなるなどして、不要なコードが残っていました。
削除方針としてはKnipで不要ファイルを一覧にして不要と判断したコンポーネントを特定し、削除するPRをDevinを使って作成しました。
KnipはJavaScript/TypeScriptプロジェクトの未使用ファイルを探して一覧化してくれるツールです。Devinは対話的なAIエージェントです。依頼内容を調査・実装してPR作成してくれます。
発生した問題
PRのCIが通っていたのでマージしました。マージしたものを取得した後に動作確認してTypeScriptコンパイルにエラーがあることがわかりました。
すぐに気づくことができたためPRをリバートし、ユーザー影響はありませんでした。
原因と修正
原因を調査したところCI設定の不備がわかりました。ファイルの差分チェックで削除を検出できておらず該当CIがスキップになり全体としてCIが成功となっていました。
このリポジトリではバックエンドやフロントエンドのファイルを含んでいます。PRごとにファイルの差分を見て必要なCIを実行します。
たとえばPRにRailsのバックエンドのファイルの変更を含む場合はRSpecなどを実行します。TypeScriptのフロントエンドのファイルの変更を含む場合はtsc(TypeScriptの型チェック)などを実行します。
差分検出には tj-actions/changed-files を使用しています。
修正前は次のような記述となっていました。
- uses: tj-actions/changed-files@v46.0.1 with: files: | ${{ matrix.directory }}/**/*.{js,jsx,ts,tsx} - name: tsc if: steps.changed-files.outputs.any_changed == 'true' # ← 問題箇所 run: yarn ts:check
any_changed の部分が誤りでファイル削除の差分を検出できず、必要なCIが実行されていませんでした。
リポジトリ内のCI設定で any_changed の箇所を any_modified に変更することでファイル削除が検出できるようになりました。
changed-filesの判定と検出対象をまとめると次の表になります。
| 判定 | 検出対象 |
|---|---|
| any_changed | Added, Copied, Modified, Renamed (ACMR) - 削除を除外 |
| any_modified | Added, Copied, Modified, Renamed, Deleted (ACMRD) - 削除を含む |
最終的な差分は次の通りです。
- if: steps.changed-files.outputs.any_changed == 'true' + if: steps.changed-files.outputs.any_modified == 'true'
まとめ
極めて基本的なことですがAI任せ・CI任せにすることなく自分自身で確認することの必要性を再認識しました。
コミット時に自動チェックするLefthookを設定しました。
他にも各種AIのhooksなどでファイル変更時に実行するものを設定中です。
最後に
YOUTRUSTではWebエンジニアを募集しています。
興味のある方はぜひご応募ください!