Claude CodeのHooks機能を活用して開発を自動化しよう

Claude CodeのHooks機能を活用して開発を自動化しよう | mohablog

Claude CodeのHooks機能は、開発ワークフローを劇的に効率化できる強力なツールだと思います。本記事では、Hooks機能の基本から実践的な活用方法まで、具体例を交えて詳しく解説していきます。開発の自動化に興味のある方は、ぜひ最後までご覧ください。

目次

Claude CodeのHooks機能とは

Hooks機能は、Claude Codeにおいて特定のイベントやタイミングで自動的にコードを実行する仕組みですね。ライフサイクルの各段階で処理を挟み込むことで、開発プロセスを大幅に自動化できるんです。

従来の手動開発では、テストの実行やコード品質チェック、デプロイメント準備など、繰り返し行う作業が本当に多くありました。Hooks機能を活用することで、こうした定型業務を自動化し、開発者はより創造的な作業に集中できるようになります。

Hooks機能の主な特徴

  • イベント駆動型:コードの変更やビルドなど、特定のイベントをトリガーに自動実行される
  • カスタマイズ可能:プロジェクトに合わせて処理内容を柔軟に定義できる
  • チェーン処理:複数のHooksを組み合わせて複雑なワークフローを構築できる
  • エラーハンドリング:失敗時の処理を明確に定義できるので、予期しない動作を防げる

Hooks機能の基本的な使い方

Claude CodeでHooks機能を使用するには、まずプロジェクト設定ファイルにHook定義を追加する必要があります。基本的な構文を見ていきましょう。

Hook定義の基本形式

以下は、claude.hooks.jsonファイルにHookを定義する例です。

{
  "hooks": {
    "beforeBuild": [
      {
        "name": "lint-check",
        "command": "npm run lint",
        "failOnError": true
      }
    ],
    "afterTest": [
      {
        "name": "coverage-report",
        "command": "npm run coverage",
        "failOnError": false
      }
    ],
    "beforeDeploy": [
      {
        "name": "security-scan",
        "command": "npm audit",
        "failOnError": true
      }
    ]
  }
}

このファイルにおいて、各フィールドがどういった役割を果たすかを説明します:

  • beforeBuild:ビルド前に実行するHook。ここでコード品質をチェックすることが多いです
  • afterTest:テスト後に実行するHook。カバレッジレポートの生成などに使われます
  • beforeDeploy:デプロイ前に実行するHook。本番環境への安全性確認に重要ですね

実践的な活用例

例1:自動コード品質チェック

プロジェクトにコミットする前に、自動的にコード品質をチェックする設定を紹介しますね。実際のプロジェクトでこれを導入したときの経験から、かなり効果的だと実感しています。

{
  "hooks": {
    "beforeCommit": [
      {
        "name": "eslint",
        "command": "npx eslint . --fix",
        "failOnError": true
      },
      {
        "name": "prettier",
        "command": "npx prettier --write .",
        "failOnError": false
      },
      {
        "name": "type-check",
        "command": "tsc --noEmit",
        "failOnError": true
      }
    ]
  }
}

この設定により、コミット前に以下の処理が自動実行されるようになります:

  • ESLintによるコード品質チェック(エラーが見つかると失敗します)
  • Prettierによるコードフォーマット(エラーが出てもワークフロー継続します)
  • TypeScriptの型チェック(型エラーがあると失敗します)

最初はfailOnErrorの設定で悩みましたが、公式ドキュメントを読んでみると、重要なチェック(lintと型チェック)はtrueに、フォーマットのような軽い処理はfalseにするのが慣例なんですね。

例2:テストと自動報告

テスト実行後に、カバレッジ報告を自動生成する例を見ていきましょう。これは現場でも重宝する設定です。

{
  "hooks": {
    "afterTest": [
      {
        "name": "generate-coverage",
        "command": "jest --coverage",
        "failOnError": false
      },
      {
        "name": "upload-coverage",
        "command": "codecov --token=$CODECOV_TOKEN",
        "failOnError": false,
        "env": {
          "CODECOV_TOKEN": "$CODECOV_TOKEN"
        }
      }
    ]
  }
}

環境変数の$CODECOV_TOKENは、システムの環境変数から自動的に参照されます。この方式だと、トークンをファイルに直書きせずに済むので、セキュリティ面でも安心ですね。

例3:デプロイメント前の安全性確認

本番環境へのデプロイ前に、複数の安全性チェックを実行する設定です。私が実装した際には、ここでかなり多くのバグが事前に検出されました。

{
  "hooks": {
    "beforeDeploy": [
      {
        "name": "dependency-audit",
        "command": "npm audit --production",
        "failOnError": true
      },
      {
        "name": "run-tests",
        "command": "npm test -- --coverage",
        "failOnError": true
      },
      {
        "name": "build-verification",
        "command": "npm run build && npm run build:verify",
        "failOnError": true
      },
      {
        "name": "notify-team",
        "command": "curl -X POST $SLACK_WEBHOOK -d 'Deploy starting...'",
        "failOnError": false
      }
    ]
  }
}

ここで注目すべき点は、依存関係のチェックやテスト実行はfailOnError: trueにしていることです。デプロイ失敗は許されないので、問題があれば絶対に止めるべきですね。一方、Slackへの通知はfalseにしておくと、通知サービスの問題でデプロイが止まるという悲劇を避けられます。

Hooks機能の詳細設定

環境変数の活用

Hookの実行時に環境変数を使用することで、機密情報の安全な管理ができるんです。ここは特にセキュリティ的に重要なポイントですね。

{
  "hooks": {
    "beforeDeploy": [
      {
        "name": "secure-deploy",
        "command": "deploy-script.sh",
        "env": {
          "API_KEY": "$API_KEY",
          "DEPLOYMENT_ENV": "production"
        },
        "failOnError": true
      }
    ]
  }
}

調べてみたら、envフィールド内の$変数名は実行時に展開されるようになっています。つまり、システムで設定された環境変数がそのまま使われるわけです。ローカル開発環境では.envファイル、CI/CDではシークレット管理機能で環境変数を設定しておけば、同じ設定ファイルで対応できます。

条件付き実行

特定の条件下でのみHookを実行したい場合は、conditionフィールドを活用します。これがあると、本当に便利ですね。

{
  "hooks": {
    "afterBuild": [
      {
        "name": "docker-build",
        "command": "docker build -t myapp:latest .",
        "condition": "$BRANCH == 'main'",
        "failOnError": true
      }
    ]
  }
}

この例では、ブランチがmainの場合にのみDocker イメージのビルドが実行されます。開発ブランチではDockerビルドをスキップして、CI/CDの処理時間を短縮できるわけです。条件式では==!=&&||などの演算子が使えます。

トラブルシューティング

Hookが実行されない場合

実装してみると、設定がうまく反映されないことがたまにあります。そんなときはここをチェックしてみてください。

  • 設定ファイルのパスが正しいか確認。claude.hooks.jsonはプロジェクトのルートに配置されている必要があります
  • JSONの構文エラーをチェック。VS Codeの検証機能を使うと、タイプミスをすぐに見つけられます
  • コマンドが実行可能か、実行権限があるか確認。特にシェルスクリプトの場合はchmod +xで実行権限を付与しましょう
  • デバッグモードで詳細ログを表示:--debugフラッグを使用することで、各ステップの実行状況が可視化されます

パフォーマンスの最適化

Hookの実行時間が長い場合は、以下の対策を検討してみましょう。最初のころは全部有効にしていたので、毎回のコミットが遅くて大変でした。

  • 不要なチェックを削除または無効化。全てのチェックが常に必要とは限りません
  • 重い処理は別スレッドで非同期実行。async: trueオプションを使うと、他のHookと並列実行できます
  • キャッシング機構を導入して重複実行を避ける。例えば、依存関係が変わっていなければ監査をスキップするなど
  • Hookの実行順序を最適化。並列実行可能な処理は同時に走らせることで、全体の時間を短縮できます

Hooks機能を活用するベストプラクティス

開発効率の向上と品質の確保のため、Hooks機能は開発ワークフローの中核として位置づけることをお勧めします。

  • 段階的な導入:最初は最も重要なチェック(lintとテスト)から始めるべきです。全部一度に有効にするとチーム全体が混乱します
  • チームで共有claude.hooks.jsonをバージョン管理に含めて、全員が同じ設定で開発できるようにしましょう
  • ログの記録:Hookの実行結果をログファイルに出力して、後で問題を確認できるようにしておくと便利です
  • 定期的な見直し:Hookの設定が最適かどうか、定期的に評価する習慣をつけることが大事です
  • エラーハンドリングfailOnErrorを適切に設定し、重要な処理は失敗させることで、問題をできるだけ早く検出できます

まとめ

Claude CodeのHooks機能は、開発ワークフロー全体を自動化する強力なツールだと言えます。

  • Hooks機能の基本:イベント駆動型で、claude.hooks.jsonで定義される仕組みになっています
  • 主要なHookbeforeBuildafterTestbeforeDeployなど、ライフサイクルの各段階で活用できます
  • 実践的な活用:コード品質チェック、自動テスト、デプロイメント前の安全性確認など、多くのシーンで有効です
  • 詳細設定:環境変数、条件付き実行、エラーハンドリングで柔軟性を確保できます
  • ベストプラクティス:段階的導入、チーム共有、定期的見直しが成功の鍵になります

適切にHooks機能を設定することで、バグの早期発見、コード品質の向上、デプロイメントの信頼性向上など、本当に多くのメリットが得られるんです。ぜひあなたのプロジェクトで導入してみてください。

よくある質問(FAQ)

Q1: Hookの実行順序を変更することはできますか?

はい、できます。hooksオブジェクト内のHook配列の順序がそのまま実行順序になります。配列内の順序を変更することで、実行順序を制御できるわけです。ただし、非同期実行を有効にした場合は、順序が保証されないこともあるので注意しましょう。

Q2: 特定のHookだけを無効化したい場合はどうしますか?

設定ファイルから該当のHook定義を削除するか、"enabled": falseフィールドを追加することで無効化できます。公式ドキュメントによると、enabledフィールドがfalseの場合、そのHookは実行されません。デバッグ時に便利な機能ですね。

Q3: Hookが実行される前に通知を受け取ることはできますか?

はい、Slackやメール等への通知をHookで実装できます。例えば、デプロイ前にcurlコマンドを使ってWebhookを呼び出すことで、チームメンバーに通知を送ることができるんです。前述の例3で紹介したnotify-teamがその実装例になります。

Q4: 同じHookを複数のプロジェクトで再利用できますか?

複数のプロジェクトで共通のHook設定を使いたい場合は、共通ファイルを別途管理して、各プロジェクトからそれを参照する方法があります。あるいは、会社全体で統一された設定をclaude.hooks.jsonテンプレートとして提供することも可能です。チームで検討してみてください。

Q5: Hookの実行結果をCI/CDパイプラインと統合できますか?

できます。Hookが失敗すると、プロセス全体が終了コードを返すので、GitHubActionsやJenkins等のCI/CDツールと連携できるんです。実際のプロジェクトでは、Hookの失敗がCI/CDの失敗として報告されるように設定しておくと、問題を素早く検出できますね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次