1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Antigravity CLIでJIRAのバグチケットに基づいてバグフィックスする

1
Posted at

JIRAで起票されたバグを自動で直したい

先日、エラー発生時に自動的にJIRAチケットを起票してみました。

JIRAチケットの自動起票ができたら、次はバグフィックスの自動化がやりたくなりますよね。
今回はAntigravity CLIにJIRAチケットを読み込ませ、修正をさせてみました。

Antigravity CLIに調査をさせる

修正対象のアプリがあるディレクトリに移動し、下記プロンプトに含まれる環境変数を設定したターミナルでAntigravity CLIを起動します。

調査指示のプロンプト
JIRAに起票された障害チケットに基づいてカレントディレクトリのアプリケーションの障害原因を調査してください。
原因を特定できたら修正プランを立ててください。
デプロイ環境はGoogle CloudのCloud Runです。必要に応じてCloud Loggingからログを調査してください。

JIRAチケットにアクセスするための環境変数(echoしないでください)
* JIRA_BASE_URL ※値の例:"https://your-domain.atlassian.net"
* JIRA_USER_EMAIL
* JIRA_API_TOKEN
* JIRA_PROJECT_KEY

Antigravity CLIは以下の動きをしてくれました。

  1. JIRAチケットの一覧と詳細を取得するPythonコードを作成し、起票内容を確認
  2. Cloud Loggingからログの確認
  3. ローカルのソースコード確認
  4. ローカルのテスト実行

その結果、以下のようにエラー個所を特定し、修正プランを作ってくれました。

Antigravity CLIによる調査結果
### 1. JIRAチケット情報およびエラー概要

• チケットID: TEST-12
• サマリー: [ERROR] Cloud Run: demo-app - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing
failed: java.lang.NumberFormatException: For input string: "user"]
• 影響サービス: Cloud Run (demo-app)
• スタックトレース:
  java.lang.NumberFormatException: For input string: "user"
      at java.base/java.lang.NumberFormatException.forInputString(Unknown Source)
      at java.base/java.lang.Integer.parseInt(Unknown Source)
      at com.example.demo.controller.LoginController.home(LoginController.java:28)

──────
### 2. 障害原因の調査結果

• 該当箇所: LoginController.java 28行目
• 原因詳細:
ログイン成功後にトップページ (GET /) へアクセスした際、LoginController.home() で認証情報 (Authentication) からユーザー名を取得しています。
しかし、28行目で文字列型のユーザー名(例: "user")に対して不可解な数値変換 (Integer.parseInt(...))
を行っているため、ユーザー名に数字以外の文字が含まれている場合に java.lang.NumberFormatException が発生していました。
  // LoginController.java (28行目周辺)
  @GetMapping("/")
  public String home(Model model, Authentication authentication) {
      if (authentication != null) {
          model.addAttribute(
              "username",
              Integer.parseInt(authentication.getName()) // ← 障害の原因:数字以外の文字列でNumberFormatExceptionが発生
          );
      }
      return "index";
  }

• ローカル検証結果:
./gradlew test を実行したところ、統合テスト LoginIntegrationTest.authenticatedUserAccessHome において全く同じ NumberFormatException
でテストが失敗することを確認しました。
──────
### 3. 修正プラン

#### 【Step 1】ソースコードの修正

LoginController.java の home メソッドで、authentication.getName() をそのまま文字列として Model に設定するように修正します。

   @GetMapping("/")
   public String home(Model model, Authentication authentication) {
       if (authentication != null) {
  -        model.addAttribute(
  -            "username",
  -            Integer.parseInt(authentication.getName()) // 検証用に仕込んだバグ!ユーザー名に数字以外が含まれていたらエラー
  -        );
  +        model.addAttribute("username", authentication.getName());
       }
       return "index";
   }

#### 【Step 2】ローカルでの動作確認およびテスト実行

Gradle テストを実行して全テストケースが正常にパスすることを確認します。

  ./gradlew test

#### 【Step 3】Cloud Run への再デプロイ

テスト通過後、CI/CD パイプラインまたは Cloud Run へのビルド・デプロイコマンド(gcloud run deploy や Docker
イメージの更新)を実施し、本番環境に反映します。

今回は意図的に埋め込んだ簡単なバグなので難なく特定してくれました。
ただ、実際のバグはもっと複雑な原因で埋め込まれているので、毎回ここまでうまくいくと考えないほうがよさそうです。

Antigravity CLIに修正させる

調査結果を確認し、以下のプロンプトで修正してもらいました。

修正指示のプロンプト
修正をお願いします。

修正が完了すると以下のように表示されました。

Antigravity CLIによる修正完了報告
修正作業および動作検証が完了しました。

### 1. 実施した修正内容

LoginController.java の home メソッドにて、authentication.getName() を直接 Model に追加するよう修正しました(不必要な Integer.parseInt を削除)。

   @GetMapping("/")
   public String home(Model model, Authentication authentication) {
       if (authentication != null) {
  -        model.addAttribute(
  -            "username",
  -            Integer.parseInt(authentication.getName()) // 検証用に仕込んだバグ!ユーザー名に数字以外が含まれていたらエラー
  -        );
  +        model.addAttribute("username", authentication.getName());
       }
       return "index";
   }
  ──────
### 2. 動作検証結果

Gradle テスト (.\gradlew.bat test) を実行し、前回失敗していた統合テストを含め全 7 テストケースがすべて正常にパス (BUILD SUCCESSFUL)
したことを確認しました。

本修正により、JIRA チケット TEST-12 に記載されていた java.lang.NumberFormatException の障害は解消されました。

Antivravity CLIにデプロイさせる

無事修正できたことを確認したので以下のコマンドでデプロイをしてもらいました。

デプロイ指示のプロンプト
既にデプロイ済みのCloud Runを更新してください。

Antigravity CLIに備えられたCloud Run MCPでデプロイされました。

Cloud Run MCPが使用された際の表示
cloudrun/deploy_local_folder(Deploying local folder via Cloud Run MCP)
Antigravity CLIによる完了報告(特に面白いことないので畳んでおきます)
Antigravity CLIによるデプロイ完了報告
Google Cloud Run へのデプロイ(更新)が正常に完了しました!

### デプロイ結果

• サービス名: demo-app
• リージョン: asia-northeast1
• 最新リビジョン: demo-app-xxxx (Ready)
• サービス URL: https://demo-app-xxxx-an.a.run.app

ヘルスチェックを実施し、/login エンドポイントから正常にレスポンス (HTTP 200 OK) が返ることを確認しました。
バグが修正されたアプリケーションが本番環境(Cloud Run)に適用されています。

Antigravity CLIにバグチケットをメンテさせる

バグフィックスが完了したので、ここまでまとめをJIRAチケットにコメントさせてみました。

チケットメンテ指示のプロンプト
調査結果、修正内容、デプロイ作業内容、デプロイ後の動作確認結果をJIRAチケットに記載してください。

すると、Pythonのコードを書いてJIRA API経由でコメントを記載してくれました。

image.png

複数人でプロダクトを運用する際、修正内容を共有するのに便利ですね!

ローカルで実行したテスト結果レポートをバグチケットに添付させる

AIエージェントってやったと言ったけど、本当はやってないときありますよね。
AIが生成した文章ではなく、テスト結果のレポートを確認すべくJIRAチケットにアップしてもらいました。

テストレポートをアップさせるプロンプト
念のため、ローカルでテストした際のレポート(htmlファイル)を証跡としてJIRAチケットにアップロードしてください。

pythonコードをサクッと作って数秒のうちにアップロードしてくれました。(Antigravity CLIは本当に速いですね!)

しかし、JIRAチケットに添付されたファイルをダウンロードしてみると、表示崩れしていました。

image.png

gradleのテストレポートは別ファイルになっているcssとjsを参照していますが、index.htmlだけをアップロードしたため崩れてしまったようです。
以下のプロンプトでcssとjsをindex.htmlにマージして再アップロードしてもらいました。

表示崩れしていないテストレポートをアップロードさせるプロンプト
index.htmlをそのままアップロードするとcssとjsにアクセスできず、表示崩れした状態になってしまいます。
レポートから参照されるcssとjsをレポートにhtmlファイルに埋め込み、1ファイルにした状態でアップロードしてください。

無事、cssとjsをマージしたテストレポートstandalone_test_report.htmlがアップロードされました。

image.png

ダウンロードしてみるときれいに表示されました!

image.png

サマリのページだけ見たいならこれで良いのですが、リンクをクリックするとFile Not Foundエラーになってしまいます。
リンク先の内容は別のHTMLファイルですが、サマリのファイルしかアップロードしていないためです。
レポートを完全に保存したい場合は、レポートがあるディレクトリを圧縮してチケットに添付するのが望ましいと思います。

まとめ

今回はAntigravity CLIを使ってJIRAのバグチケットに基づくバグフィックス自動化をしてみました。
簡単な例だったのでサクッと実現できましたが、実際のプロダクトで利用するとここまで簡単には修正できないだろうと思います。
それでも、一次調査をAIで自動的に行い、チケットにコメントしてくれると便利そうに思いました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?