拡張機能付き Gemini CLI を使用したコードレビューとセキュリティ分析

1. 📖 はじめに

838a11ffed94b79e.png

この Codelab では、Gemini CLI の基本を学び、ソフトウェア開発ワークフローでコードレビューとセキュリティ分析の拡張機能を使用します。

学習内容

  • Gemini CLI を設定する方法
  • Gemini CLI を構成する方法
  • Gemini CLI 拡張機能をインストールする方法
  • コードレビューとセキュリティ分析に Gemini CLI 拡張機能を使用する方法
  • Gemini CLI 用に MCP を構成する方法
  • CI/CD で Gemini CLI を検査する方法

必要なもの

  • Chrome ウェブブラウザ
  • Gmail アカウント
  • 請求先アカウントが有効になっている Cloud プロジェクト

2. 🚀 ワークショップの開発環境を準備する

ステップ 1: Cloud Console でアクティブなプロジェクトを選択する

[Google Cloud コンソール] の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します(コンソールの左上をご覧ください)。

6da543936f051b95.png

クリックすると、次の例のようにプロジェクトのリストが表示されます。

3c3963e0fbb5ba4f.png

赤いボックスで示されている値はプロジェクト ID であり、この値はチュートリアル全体で使用されます。

Cloud プロジェクトに対して課金が有効になっていることを確認します。これを確認するには、左上のバーにあるハンバーガー アイコン ☰ をクリックしてナビゲーション メニューを表示し、[請求] メニューを見つけます。

3291845833270d7f.png

ddf6f055d710f7a9.png

[Billing / Overview] タイトル( クラウド コンソールの左上 )の下に「Google Cloud Platform トライアル請求先アカウント」が表示されている場合、このプロジェクトはこのチュートリアルで使用できます。表示されていない場合は、このチュートリアルの最初に戻って、トライアル請求先アカウントを引き換えてください。

45539d4ac57dd995.png

ステップ 2: Cloud Shell に慣れる

チュートリアルのほとんどの部分で Cloud Shell を使用します。Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] をクリックします。承認を求めるメッセージが表示されたら、[承認] をクリックします。

26f20e837ff06119.png

79b06cc89a99f840.png

Cloud Shell に接続したら、シェル(またはターミナル)がアカウントで認証されているかどうかを確認する必要があります。

gcloud auth list

次の例の出力のように個人の Gmail が表示されていれば、問題ありません。

Credentialed Accounts

ACTIVE: *
ACCOUNT: alvinprayuda@gmail.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`

表示されない場合は、ブラウザを更新して、プロンプトが表示されたら [承認] をクリックしてください(接続の問題で中断されることがあります)。

ステップ 3: Cloud Shell エディタに慣れ、アプリケーションの作業ディレクトリを設定する

これで、コードエディタを設定してコーディングを行うことができます。これには Cloud Shell エディタを使用します。

操作するデモ リポジトリのクローンを作成する必要があります。ターミナルで次のコマンドを実行して、リポジトリのクローンを作成し、Cloud Shell エディタを開きます。

git clone https://github.com/alphinside/gemini-cli-code-analysis-demo.git code-analysis-demo && cloudshell ws code-analysis-demo

これで、Cloud Shell エディタの作業ディレクトリは次のようになります。

3a72d901f5e78fcf.png

次に、シェルが正しいプロジェクト ID に構成されているかどうかを確認する必要があります。ターミナルの $ アイコンの前に ( ) 内に値 が表示されている場合(次のスクリーンショットでは、値は "your-workshop-project" )、この値はアクティブなシェル セッション用に構成されたプロジェクトを示します。

8785d925a094c260.png

表示された がすでに正しい 場合は、次のコマンドスキップ できます。正しくない場合や表示されない場合は、次のコマンドを実行します。

gcloud config set project <YOUR_PROJECT_ID>

これで次のフェーズに進むことができます。

3. 🚀 セットアップと構成

ローカル システムに Gemini CLI をインストールする場合は、次の手順を行います。

  1. システムに Node バージョン 20 以降 がインストールされていることを確認します。
  2. 次のいずれかの方法で Gemini CLI を有効にします。
  • グローバル パッケージとしてインストールする
# Install as an executor

npm install -g @google/gemini-cli

# then run it from terminal
gemini
  • または、ソースから直接実行して、常に最新バージョンを取得する
npx https://github.com/google-gemini/gemini-cli

初めて実行すると、いくつかの質問が表示されます。IDE(VSCode など)から実行すると、次の質問が表示されます。

91769e12a6214c89.png

次に、認証方法を選択するよう求められます。

61ba181d61e506dc.png

次のように、いくつかのオプションがあります。

  • [Google でログイン] を選択すると、ブラウザで Google 認証ページが開き、承認するだけで済みます。
  • [Gemini API キー] を使用する場合は、[AI Studio ページ] で作成し、作業ディレクトリに変数 [GEMINI_API_KEY] を設定した [.env] ファイルを作成します(または、コマンドラインで export GEMINI_API_KEY="your-api-key" コマンドを実行します)。
  • [Vertex AI] を使用する場合は、以前に設定したプロジェクトが必要です。.env ファイルを作成し、GOOGLE_CLOUD_PROJECTGOOGLE_CLOUD_LOCATION を設定します。

これらの認証方法を変更する場合は、Gemini CLI から /auth コマンドを実行するか、構成ファイルを編集します。構成ファイルを直接編集する場合は、Linux では $HOME/.gemini/settings.json にあります。securityauth のタイプが表示されるので、編集します。

{
  "security": {
    "auth": {
      "selectedType": "vertex-ai" # or "gemini-api-key" or "oauth-personal"
    }
  }
}

2b894cdf68057d6a.png

4. 🚀 基本コマンドと組み込みツール

Gemini CLI を操作して、詳細を確認しましょう。ターミナルで次のコマンドを実行して Gemini CLI を起動します。

gemini

使用できる基本コマンドを探している場合は、/help と入力すると、使用可能なすべてのコマンドが表示されます。

d4776f0c740ad723.png

/help

次のような出力が表示されます。 290d620f3787b3d0.png

Gemini CLI は AI エージェントであるため、ユーザーが指定したタスクを解決するためのツールが搭載されています。搭載されている組み込みツールを確認するには、/tools コマンドを実行します。

7367214e26b0da86.png

/tools

次のような出力が表示されます。

363ae783ae902fe4.png

Gemini CLI には、ファイルの読み取りと書き込み、ウェブ検索など、いくつかの機能があることがわかります。潜在的なリスクがあるため、これらのツールの多くはデフォルトでユーザーの確認が必要です。

実際に動作させてみましょう。Gemini CLI で次のプロンプトを実行します。

be23caafc0184a6d.png

Find top 10 OWASP security issue and write it down to owasp.md

GoogleSearch ツールが呼び出され、後で WriteFile を使用して結果が書き込まれます。IDE を使用している場合は、差分として表示され、提案を受け入れるか拒否するかを選択できます。Gemini CLI がファイルの書き込み権限を求めていることがわかります。

724bc8144b51752e.png

5. 🚀 拡張機能

AI エージェントで特定のタスクの出力を改善するには、適切なプロンプトを作成し、適切なツール統合で適切なコンテキスト エンジニアリングを管理する必要があります。

Gemini CLI 拡張機能は、外部ツールに接続できる、事前パッケージ化された簡単にインストールできるプロンプトと統合です。各拡張機能には、ツールを効果的に使用する方法に関する組み込みの「プレイブック」が含まれており、次のコンポーネントで構成できます。

  • カスタム スラッシュ コマンド
  • MCP 構成
  • コンテキスト ファイル

cfe24ebe1dfb0152.png

セキュリティ拡張機能をインストールする

たとえば、このチュートリアルでは、code-review 拡張機能と security 拡張機能をインストールする方法について説明します。

次のコマンドを実行して、ターミナルから security 拡張機能をインストールします。

gemini extensions install https://github.com/gemini-cli-extensions/security

次の質問が表示されるので、Enter キーを押して同意します。

Installing extension "gemini-cli-security".
**Extensions may introduce unexpected behavior. Ensure you have investigated the extension source and trust the author.**
This extension will run the following MCP servers:
  * securityServer (local): node /home/alvinprayuda/.gemini/extensions/gemini-cli-security/mcp-server/dist/security.js
This extension will append info to your gemini.md context using GEMINI.md
Do you want to continue? [Y/n]:
Extension "gemini-cli-security" installed successfully and enabled.

コードレビュー拡張機能をインストールする

次に、code-review 拡張機能をインストールします。次のコマンドを実行します。

gemini extensions install https://github.com/gemini-cli-extensions/code-review

完了したら、Gemini CLI を再度実行します。

gemini

/extensions コマンドを実行すると、これらの 2 つの拡張機能がすでにインストールされていることがわかります。

571556bdc2b3e914.png

/extensions

それでは、先ほどクローンしたサンプル リポジトリで実際に実行してみましょう。

6. 🚀 インタラクティブ モード - コード セキュリティ分析拡張機能の適用

Security 拡張機能は、リポジトリのセキュリティを強化するために構築されたオープンソースの Gemini CLI 拡張機能です。この拡張機能は、コード変更を分析してさまざまなセキュリティ リスクと脆弱性を特定する新しいコマンドを Gemini CLI に追加します。

まずデモ リポジトリを準備します。次のコマンドを実行して、セキュリティ リスクのある変更がすでに適用されているブランチに切り替えます。

git checkout refactor/analysis-demo

その後、ターミナルで Gemini CLI を実行します。

gemini

次に、拡張機能を実行します。

aab23afb4f4bfb3.png

/security:analyze

長時間実行されるプロセスが開始され、プロセス中に、次に示すように mkdir などの特定のオペレーションを実行する権限を求めるメッセージがいくつか表示されます。

f889f7aca882f87d.png

これは、Gemini CLI によって実行される内容をユーザーが認識できるようにするための保護メカニズムです。チュートリアルの残りの部分では、常に許可できます(オプション 2)。

この拡張機能は長時間実行されるプロセスを呼び出します。.gemini_security ディレクトリ内にプランニング ファイルが作成され、どのプロセスが完了したかを確認できるチェックリストが表示されます。次の例をご覧ください。

bf7f9e885f15ff89.png

タスクが完了するまでに時間がかかります。待っている間に、 Github リポジトリでこれらの拡張機能のソースを確認できます。この URL には、これらのセキュリティ スキャン プロセスをすべて実行するために使用されるプロンプトが表示されます。

e5592755fcdf5a64.png

ご覧のとおり、このスキャンを行うには、Gemini CLI に 2 パス チェックを行うようにプロンプトを表示します。Reconnaissance Pass と、より詳細な Investigation Pass です。

Gemini CLI で次のプロンプトが表示された場合は、オプション 2 を選択してループ検出を無効にできます。

74426d4ae8fae006.png

次に、Gemini CLI に続行するようにプロンプトを表示します。

3ea7391ccbf2b872.png

continue

これは、生産性の低いツールの呼び出しループを回避するメカニズムであり、今後も改善されていきます。

完了すると、インタラクティブ ターミナルにレポートが表示されます。わかりやすくするために、Gemini CLI に security-analysis.md に書き込むように指示しましょう。

86fcc1c406100224.png

write the result to security-analysis.md file

これで、ファイルに書き込まれた結果を確認できます。

7. 🚀 非インタラクティブ モード - コードレビュー拡張機能の適用

code-review 拡張機能は、コード変更を分析してさまざまなコード品質の問題を特定する新しいコマンドを Gemini CLI に追加します。

この拡張機能は、Gemini CLI の非インタラクティブ モードで実行できます。つまり、Gemini CLI シェルに入力しなくても、すべてのプロセスを実行できます。非インタラクティブ モードで Gemini CLI を実行するには、次のコマンド パターンを使用します。

gemini "put your command here"

ただし、非インタラクティブ モードで実行すると、ユーザー権限を必要とするツール オペレーションが無効になるため、--yolo フラグを追加してすべてのアクションを自動承認する必要があります。つまり、非インタラクティブ モードですべてのツールを有効にします。

Cloud Shell でこの yolo フラグを実行すると、システムのデフォルト構成により実行が禁止され、次のエラー メッセージが表示されます。

Cannot start in YOLO mode when it is disabled by settings

次のコマンドを実行して、ワークスペース レベルの構成ファイルを設定します。

mkdir .gemini && cloudshell edit .gemini/settings.json

これで、settings.json ファイルがエディタで開きます。次の構成をコピーして、yolo モードを有効にします。

{
    "security": {
        "disableYoloMode": false
    }
}

次のコマンドで code-review 拡張機能を実行しましょう。

gemini "/code-review" --yolo -e code-review > code-review.md

このコマンドは、Gemini CLI 出力の結果を code-review.md ファイルに書き込みます。ここで -e フラグに注意してください。このフラグは、セッション中に有効にする拡張機能を制御します。ここでは、code-review 拡張機能のみを有効にし、他の拡張機能を無効にします。

しばらく時間がかかりますが、完了すると、次の例のような結果が Markdown ファイルに書き込まれます。

Here are the results of the code review.

While the recent changes to rename `get_products` and `get_product` to `GetProducts` and `GetProduct` are minor, the codebase has some inconsistencies in its naming conventions. For instance, other functions like `create_product` use `snake_case`, while the newly renamed functions use `PascalCase`. For better code quality and readability, I recommend using a consistent naming convention throughout the project.

More importantly, I have identified several security vulnerabilities in the `main.py` file. Here is a summary of the findings:

### 1. SQL Injection
*   **Severity**: High
*   **Location**: 
    *   `main.py:99` in `get_products_by_category`
    *   `main.py:146` in `search_products`
    *   `main.py:372` in `get_user_transactions`
    *   `main.py:438` in `adjust_inventory_by_query`
*   **Description**: The endpoints directly use f-strings to construct SQL queries, making them vulnerable to SQL injection attacks. An attacker could manipulate the input to execute arbitrary SQL commands, potentially leading to data breaches or unauthorized modifications.
*   **Recommendation**: Use parameterized queries or an ORM to handle database interactions. This will ensure that user input is properly sanitized and prevent SQL injection attacks.

### 2. Server-Side Request Forgery (SSRF)
*   **Severity**: High
*   **Location**: `main.py:265` in `fetch_url`
*   **Description**: The `fetch_url` endpoint allows users to specify an arbitrary URL, which the server then requests. This can be exploited to make requests to internal services or local files, leading to information disclosure or other security breaches.
*   **Recommendation**: Implement a whitelist of allowed domains or protocols to restrict the URLs that can be requested. Additionally, you can disable redirects and use a timeout to limit the impact of an attack.

### 3. Information Exposure
*   **Severity**: Medium
*   **Location**: `main.py:423` in `get_environment_variables`
*   **Description**: The `get_environment_variables` endpoint exposes all environment variables to the user. This can include sensitive information such as API keys, database credentials, and other secrets.
*   **Recommendation**: Remove this endpoint or restrict access to it to authorized users. If you need to expose some environment variables, do so selectively and avoid exposing sensitive information.

8. 🚀 Model Context Protocol のサポート

拡張機能の説明で確認したように、Gemini CLI は MCP サーバー(Model Context Protocol を介してツールとリソースを提供するアプリケーション)に接続できます。この接続により、Gemini CLI は MCP サーバーをローカル環境や API などの外部サービスへのブリッジとして使用して、外部システムやデータソースとやり取りできます。

7d8738ee9c079aa1.png

独自の MCP サーバーを設定する場合は、.gemini/settings.json ファイルを変更して、次の構成を追加する必要があります。

{
    ...
    # Previous settings above if any
    "mcpServers": {
       "server_name": {
           # MCP server configurations here
       }
    }
}

このチュートリアルでは、Github アカウントとの接続を構成して、以前のレポートデータを Github に push します。

Github MCP サーバーを構成する

まず、Gemini CLI プロジェクト構成ファイルを作成しましょう。次のコマンドを実行します。

mkdir -p .gemini && touch .gemini/settings.json

次に、.gemini/settings.json ファイルを開き、次の構成を入力します。

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "your-personal-access-token"
            },
            "timeout": 5000
       }
  }
}

ここで、独自の Github 個人用アクセス トークンが必要になります。独自の Github アカウントがすでにあることを確認してください。

Github にログインして、[Settings] に移動します。

c7d83d4e503602e2.png

下にスクロールして [Developer settings] を見つけてクリックします。

c6c9bfafe5021b9e.png

次に、[Personal access tokens] を選択し、[Tokens (classic)] を選択します。

e21f0ed9f361fc13.png

c3c26d7f41c51e1c.png

ここで個人用アクセス トークンの名前を入力し、repo スコープを確認します。

b0830480eaf3c15d.png

下にスクロールして [Generate Token] ボタンをクリックします。

[Generate new token button] をクリックし、[Generate new token (classic)] を選択します。生成されたトークンをコピーして、.gemini/settings.json に書き込みます。

30d1ea92bb24a7ba.png

.gemini/settings.json は次の例のようになります。

{
  "mcpServers": {
       "github": {
            "httpUrl": "https://api.githubcopilot.com/mcp/",
            "headers": {
                "Authorization": "ghp-xxxx"
            },
            "timeout": 5000
       }
  }
}

接続を確認しましょう。次のコマンドを実行して Gemini CLI を起動します。

gemini

次に、/mcp コマンドを実行すると、Github MCP がすでに正しく構成されていることがわかります。

1e9c8585ecb39ccb.png

/mcp

次のコマンドを送信して、この MCP 接続をテストしましょう。

70e045049e8792a8.png

Aggregate the findings from @code-review.md and @security-analysis.md into a single report and ensure no duplicates issues reported. Post this report as a comment on the relevant pull request for the current git branch on GitHub and display the pull request URL for manual review

ここで @code-review.md@security-analysis.md の表記に注意してください。これは、Gemini CLI に渡す参照ファイルを参照する方法です。このコマンドは、両方のファイルの内容を読み取り、Github MCP 接続を使用して、このブランチに関連する pull リクエストにコメントを push します。その後、pull リクエストの URL で確認できます。

f6483c19e27d4d1c.png

9. 💡CI/CD ワークフローでの Gemini CLI

Github ユーザーの場合は、run-gemini-cli Github Action を使用して、Gemini CLI を CI/CD パイプラインに簡単に埋め込むことができます。重要な日常的なコーディング タスクの自律エージェントとして機能するだけでなく、作業を迅速に委任できるオンデマンドのコラボレーターとしても機能します。

これを使用して、pull リクエストのレビュー、問題のトリアージ、コード分析と変更などを、Github リポジトリ内で Gemini を使用して直接会話形式で行うことができます。

この統合の例は、この pull request で確認できます。ここでは、ランナー内で Gemini CLI Security 拡張機能を使用し、pull リクエストが作成されたときにレビューを提供します。

bc58be84fcbb313a.png

da9e2cde49cbebe5.png

3deda99e8a7fa4d3.png

d933d6b31b42e582.png

10. 💡その他の Gemini CLI 拡張機能を調べる

dd25e5619e91ad0b.png

https://geminicli.com/extensions で他の拡張機能を確認することもできます。他の興味深いツールもご確認ください。

11. 🧹 クリーンアップ

この Codelab で使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。

  1. Google Cloud コンソールで、[リソースの管理] ページに移動します。
  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。