🧳

Claude Codeのカスタムコマンドで退職者対応をシュッとやる

に公開

これはGLOBIS アドベントカレンダーシリーズ1の9日目の記事です。

グロービス SREチームの坂口です。

グロービスでは全社的にAI活用を掲げて、各部門で取り組みが行われています。
そんな中で、半年ほど前に入社した私はというと、

  • 初日から生成AI利用に関するオンボーディングを受ける
  • 社内用語などドメイン領域で分からないことがあれば、オンボーディングサポーターより前にNotion AIに聞く[1]
  • Good First Issue系タスクをClaude Codeを使ってPRまで作らせる
  • Claude Code Actionによるレビュー結果を横目に見ながら、コードレビューをする
  • 全体会ではビジネス職の人がGoogle Apps Scriptを使って業務を自動化した取り組み事例を聞く
  • チーム読書会ではNotebookLMに洋書[2]のpdfを放り込んで、対話しながら中身を把握していく
  • その他わからないことがあればGeminiに聞く(学習に使用されないため、安心して業務利用できる)

こんな感じでAIにどっぷり浸かった半年を過ごしていました。

それまでは検索やちょっとしたコード生成(業務データを渡さない範囲での実装補助)に留まっていたので、改めて振り返ると変化の大きさをしみじみと感じます。

現在も業務の中でAIの活用を試行錯誤していますが、その中で退職者対応を効率化したので共有します。

既存の運用

SREチームでは、各プロダクトのインフラレイヤーをIaCで管理しています。その中にはクラウドのユーザー設定が一部あり[3]、毎月退職者のユーザー設定を削除する対応を、複数リポジトリの複数箇所で行う必要があります。
既存の運用としてはGitHubのリポジトリ横断検索を行うスクリプトがあり、削除用のPRは作業担当者が手動で都度作成していました。

Claude Codeにやってもらう

退職者対応を担当することになった時、試しにプロンプトを作成してAIにやらせてみたところ、想像以上にすんなりとPRまで作成してくれました。そのため自分の作業としてはPRの中身や対応の抜け漏れがないかをチェックし、レビュー依頼とマージを行うだけで済みました。

AIを使わずに行っても半日もかからない程度の作業ではありますが、実際に手を動かす回数を圧倒的に減らせたのは大きかったです。

  • Before

    1. 対象者を検索(スクリプト実行)
    2. 各リポジトリで対象ユーザーの設定(1〜複数人分)を削除
    3. コミット・プッシュ
    4. PR作成
    5. (2〜4をリポジトリの数だけ繰り返す)
    6. レビュー依頼
    7. マージして完了
  • After

    1. カスタムコマンドを実行(検索〜PR作成まで自動化)
    2. PRをセルフレビュー
    3. レビュー依頼
    4. マージして完了

カスタムコマンド化する

SREチームではClaude Codeをメインで利用しているため、このプロンプトをカスタムコマンド化して、共通利用できる形で残しておきたいと考えました。

ただ、ローカル環境での作業になるため、共通利用できるのかという懸念がありました。チームで話し合ったところ、リポジトリを置いているパスは様々ですが、各リポジトリは同じ階層に置いて管理されるケースが一般的という共通認識を確認できました。
そのためSREチームが作成したローカルツール用リポジトリがあるので、そのリポジトリにカスタムコマンド用ファイルを作成し、そこから相対パス(../*/)で他の作業対象リポジトリを参照するように指示しました。

最終的なプロンプトは以下です。

検索では、元々使われていた検索スクリプトを利用するようにしています。
AIに作業をさせると同じ作業でもクオリティに波があり再現性を得られないことが多々ありますが、コードを用いる形で確実性を得られるようになります。
また作業対象については、少ない月は0人の時もありますが、多い時は数人分の対応があるので、念のため作業履歴を細かく残すようにし、想定外の中断があった場合でも再開できるようにしています。

---
description: 組織の複数リポジトリから退職者を削除
argument-hint: issue_url user1 user2 [user3...]
---
組織が管理する複数のGitHubリポジトリから退職したユーザー(第2引数以降のユーザー名)を削除してください。

## 作業手順
以下の作業を行うにあたり、「output_remove-retired-users-YYYYMM.txt」(YYYYMM:作業対象月)を作成し、作業ステップごとに結果を残すようにすること。
1. このリポジトリ内にある bin/find-retired-users-repos.sh を使用して退職者を検索
    - コマンドの出力結果がユーザー単位になっているので、それを以下のようにリポジトリ単位になるように整理して、outputファイルに記載する
        ```
        # find-retired-users-repos.sh コマンドの出力例
        ℹ️ Checking for gh CLI...
        ✅ gh CLI found.

        🔑 Checking gh CLI authentication status...
        ✅ gh CLI already authenticated.

        --------------------------------------------------
        🔎 Starting GitHub code search for users: user1 user2
        --------------------------------------------------


        ➡️ Searching for user: user1 in globis-org repositories...
        --------------------------------------------------

        Showing 6 of 6 results

        globis-org/repo1 terraform/path/to/locals.tf
                "user1",

        globis-org/repo2 terraform/path/to/staging.tf
                "user1@globis.co.jp",

        globis-org/repo3 terraform/path/to/development.tf
                "user1@globis.co.jp",

        ✅ Search completed for user1.
        --------------------------------------------------

        ➡️ Searching for user: user2 in globis-org repositories...
        --------------------------------------------------
        no code results matched your search

        ✅ Search completed for user2.
        --------------------------------------------------

        🏁 GitHub code search finished.
        ```
        ```
        # リポジトリ単位にしたときの出力フォーマット
        {リポジトリ名} {path/to/file}
            {username}
            {username}
        検索結果0件
            {username}
            {username}
        ```
        ```
        # 出力例
        globis-org/repo1 terraform/path/to/locals.tf
            "user1_name",
        globis-org/repo2 terraform/path/to/staging.tf
            "user1_name"
        検索結果0件
            "user2_name"
        ```
2. リポジトリごとに検知された退職者を削除する
    - 作業対象リポジトリは、現在のリポジトリと同じ階層にあるので「../*/」で検出する
    - 対象リポジトリを検知したらmainブランチに移動し、最新化し、作業ブランチ「remove-retired-users-YYYYMM」を作成する(YYYYMM:作業対象月)
        - エラーが出て作業ブランチを作成できなかった場合、エラー内容をコンソールに出力して作業を中断する
    - 対象ユーザーの名前を削除したら、コミットし、pushする。
    - PRを作成する
        - GitHubのテンプレートがあるのでそれを参照する。
        - PRには以下を含める
            - issue_url($ARGUMENTSの一つ目)
            - 作業対象リポジトリと対象ユーザー(ステップ1と同じ形式で)
    - PRを作成したら、urlをoutputファイルに記載する
    - これをステップ1の出力分全てに行っていく
3. 全てのリポジトリに対して作業が完了したら、output ファイルの末尾に「ステータス:完了」を記す。

## 備考
- 途中で中断し、再開するケースがある。outputファイルの中身と上記手順を比較し、続きから行うようにする。

おわりに

今回の作業は頻度や1回あたりの作業時間の観点では、決して大きなトイルではありませんでした。
とはいえ作業者の立場で見ると無心で行う手作業が多く、そういったタスクをAIの力でごく少ない工数で対応できるようになったのは嬉しいところです。

脚注
  1. もちろんチームメンバーに聞いても嫌な顔はされません ↩︎

  2. 今はPlatform Engineeringを読んでいます(つい先日日本語版が出ました) ↩︎

  3. 基本的にはSAML/SCIMにより自動で削除されますが、一部手動対応が残っています ↩︎

GLOBIS Tech

Discussion