😁

SpringとSpringBootを使っているリポジトリのアップデート作業をwithCopilotでやった振り返り

に公開

はじめに

お久しぶりです、k1mu21です

世間ではclaudecodeが話題になっていたり、Copilotを導入している企業がここ数ヶ月で一気に増えた印象があります

話題が沸騰中のAIですが、アップデート作業もAIに任せている、任せたい人がいると思います。

自分がここ数ヶ月でSpringBootとSpringで動いていたリポジトリをアップデートしたのですが、
ずっとCopilotを使い倒して作業していたのでその際得た経験を書きたいと思います

色々な方の参考になれば幸いです!

Springリポジトリの作業に関して

大体去年の12月くらいに3,4週間かけてリリースした内容になります

上げたライブラリ

  • Spring 5系 → 5系の最新
  • Spring Data2系 → 2系の最新
  • hibernate3系 → hibernate5系
  • Java11 → Java21
  • doma2 → doma3
  • その他使ってるライブラリ
    • 上げたり、別のを利用するようにしたり...

実際作業をしてどうだったか

  • 調査作業が圧倒的に楽だった
    • IDEのエラーが出てもとりあえずCopilotに聞いてみることを繰り返していましたが、明確な答えが出てこなかったとしても今までの情報を元に自ら調査をすることができるので調査時間はかなり減ったと思います
  • ドキュメントを訳してくれる
    • Springのドキュメントは基本英語なので、正直読むのは大変だったのですがよくわからない部分はCopilotに投げて訳してもらうだけでメソッドの理解が深まりました
    • そのメソッドを使ったコード例も出してくれたのも理解しやすかったです

微妙だった点

  • 出してくるコードが古い

    • 提示してきたコードが古い書き方の場合が多く結局自分で書き直す時が多々
  • SpringなのにSpringBootのライブラリを使い始める

    • 世の中はSpring単体ではなくSpringBootの使い方をしているのが多いので、ネット上のコンテキスト量的にもSpringBootのやり方を模倣してしまうのか...と言った感じです
    • あえてSpringであることを明記しても、何度がチャットでやり取りしてるとSpringBootになってしまうので多分copilotのチャット履歴の保持数(というか推論に使う履歴数?)に引っかかった場合またコンテキストを渡してあげないといけない時があったのがネックでした
  • サジェストが同様の書き方を提案してくれない

    • 既存の記載を元にサジェストしてくるので少し面倒...
    • 例えばnull判定にobjectクラスを使って何かするor==を使うなどで共通化してくれなかった

まとめ的なもの

  • 当時はまだCopilotAgentは存在していなかったので基本チャットモードや、サジェストをメインに使っていましたが、これらだけでも圧倒的に調査コスト、実装コストはかなりおさえられたなという実感がありました
    • Copilotの利用料から自分の人件費などを考慮しても全然Payできてるという実感はありました
  • アプデ作業をする前にもっとCopilotが動きやすい環境を作るべきだったなと思ってます
    • copilot-instructionsを作ってライブラリの概要を理解させるなどは簡単なのでしておくべきでした

https://copilot-instructions.md/

  • やっぱり最新の情報は反映してくれないので、直近で破壊的変更があってコード修正が必要になった場合は自分で調べないといけないです
    • 提案してくれるバージョンは基本的に最新のものではないので...

SprigBootのリポジトリの作業に関して

7月に1か月かけて修正した内容になります

上げたライブラリ

  • Spring Boot1系 → 3系の最新
  • Java11 → Java21
  • その他使ってるライブラリ
    • 上げたり、別のを利用するようにしたり...

実際作業をしてどうだったか?

  • Springのバージョンアップの経験もあったので、ある程度引っかかる部分は事前に把握した上で作業できました

    • AIもエージェントが出たのでだいぶ楽に作業することができるようになりました
  • Copilotの性能も上がってるので出してくれる修正方法が基本的にそのまま流用すれば動いたため修正が楽になった

    • 出してくれる内容が古かったりはしますが、基本的に動くようになったなという実感がありました
    • TemplateEngineをthymereafにする必要がありましたが、そんなに大きく詰まったという印象もありません
    • Junit4をJunit5に書き換えるのもそこまで苦労しませんでした
  • Agentが便利

    • 修正に関連する部分を直してくれるので修正漏れが少なくなったなという印象がありました

微妙だった点

  • やっぱりコンテキストが少なめの変更は弱い

  • 内容が古い

    • ここはしょうがないのかと思ってほぼ諦めてました
  • Agentが暴れる

    • そこまで動かなくていいという部分まで暴走するので逆に面倒臭いと感じる時がありました

どちらもやった感想

  • Copilotに〇〇のライブラリを最新にしてと言っても基本的にはマイナーバージョンが最新に追いついてないのが提案されます

    • 自分でnpmやらmaven repositoryを調べに行くのも面倒なので、dependabotなどを入れて修正させた上でCopilotに任せるのが一番良いやり方だと思います
    • 基本的に最新情報は出てこないので、フレームワークのリリースノートなどは見に行きましょう
  • Agentに任せっきりもトークンを使い果たすので上手いやり方をしてAIの作業量を減らしたほうがいいなと思いました

    • Springだとjavaxがjakaltaになったという大きな変更があったのですが、膨大なプロジェクトだと全て変更させるだけでも意外とトークンを食ってしまうので、共通して変更できるようなものはAst-grepなどのツールを使うようにしたほうがいいと感じました

https://github.com/ast-grep/ast-grep

  • テストカバレッジを充実されるなどテストに関する部分に力を入れたほうがいいなと思いました

    • AIが出したコードの整合性を担保するという上でとても大事
    • テストコードがないと結合テスト、E2Eでその機能を重点的に見ないといけなかったりしてかなり大変です
  • Copilotが修正しやすいようにcopilot-inspectionは入れておきましょう

    • フォーマットはこれに従ってなどが指定できるので、無駄な修正が減るのが大きいです
  • 静的解析する何かを導入しておきましょう

    • やっぱり出してくるコードがよくない時もあるので実装時に気付けるようにしておくのは必須だと思いました
    • CodeRabbitとかQodanaやSonarを入れましょう、無料で使えるので

https://www.coderabbit.ai/ja
https://www.jetbrains.com/ja-jp/qodana/
https://www.sonarsource.com/jp/

  • GitHooksなどを使ってリモートリポジトリにpushする前に必ず実行するタスクなどを定義しておくと楽です
    • フォーマットさせるためにこのコマンドをコミット毎に実行させるなどができるので余計なミスを減らすことができます
      • GitHooksは管理が面倒なのでlefthookを使うなりしたほうがいいです

https://github.com/evilmartians/lefthook

最後に

  • この記事は参考程度にしていただきたいです

    • AIの進歩が早すぎて1か月後とかには意味のない記事になってる可能性もありそう...
  • 間違いや、よくない利用法をしている可能性もあるので、ここはこういうやり方があったよ!などがあれば教えてきただけると励みになります!

GitHubで編集を提案

Discussion