てくなべ

ansible / network automation / 学習メモ / 思考メモ

ドキュメント自動生成の前に考えたいこと

はじめに

技術の進歩は早く、少し前に「あんなことできたらいいなぁ」と思っていたことが、結構身近に感じることも多くなりました。

ドキュメントの自動生成もその一つです。

ですが「できるようになった」=「やるべき」とは限りません。仮に誰も(AI含め)読まないドキュメントを生成しても、意味がないでしょう。

この記事では(体系的ではなくメモ書き程度ですが)飛びつく前に個人的にこの辺は考えておきたいなと思っている点を書きます。

先に簡単にまとめますと、ドキュメントを自動生成する前に、そのドキュメントの「目的(具体的な利用シーンを含む)」と「メンテナンス方法」を定義すべきだと私は考えています。

各ドキュメントの性質の違いを押さえる

一口にドキュメントといっても、本当に様々なものがあります。提案書、設計書、仕様書、手順書などなど。

名前をつけてラベリングすることはとても便利ではありますが、反面、記号的な意味しか持たず、何を指すのかがぼやけることもあります。

よく「そのドキュメントの目的は何か?」のように考えるタイミングはあると思いますが、目的(や性質)を以下のように分解して考えてみたいところです。

  • 誰が、なぜ、いつ、読むか
  • 誰が、なぜ、いつ、書くか
  • 誰が、なぜ、いつ、メンテナンスするか
  • 意図を示すものか、実装(設定)を示すものか

もっとシステマチックに 5W1H と「書く・読む・メンテナンス」を組み合わせてもいいかもしれませんが、この段階ではHow(どのように)はやや優先度が低そうです。

以下、設計書とパラメーターシートに絞って少し掘り下げてみます。

設計書

単に「設計書を書いて」と言われたら、どんなものをイメージすればよいでしょうか。

「このフォーマット参考にして」と渡してもらったとしても、目的や利用シーンをおさえておかないと、意味のないものを書いてしまったり、カスタマイズするときに明後日の方向に行ってしまったりすることもあり得ます。

私は多くの場合「設計書」と言われたら、まずいったん、設計の方針のようなものを書くものだと捉えます。たとえば、コーディング規約、命名規則、処理の分割方針などです。

先ほどのポイントを押さえながら目的を表現すると以下の通りです。

  • 新規開発時に、開発者が迷わず実装できるようにするために書く
  • 機能追加や修正時に、開発者が読み、迷わず追加や修正できるようにするために書く
  • あとからプロジェクトに参入した人が実装を追うための手がかりにするために書く
  • 方針変更や追加があったら開発者、設計者がメンテナンスする
    • 逆に、ちょっとしたコード修正時はドキュメント修正は発生しない
  • 実装よりも意図を示すもの

「実装を追うための手がかり」のレベル感が肝で、例えば「あれ系の処理ならこのディレクトリにあるはずだな。どれどれ・・」を促す程度が分かるイメージです。抽象度が高めで、実装との乖離も発生しにくいタイプです。

仮に「そのドキュメントを見れば完全に処理が分かる」ようなものが期待されていると、実装からドキュメント生成という方向が向いていそうです。それができない場合は、実装との乖離が発生しないようなプロセスを整備したり、実装のどの時点のドキュメントなのかを管理する必要があります。

私が思う設計書は、方針の取り決め的なものなのであり、基本的には実装からドキュメント生成という方向はないです。

ただし「今の実装と今のドキュメントを照らし合わせて、ドキュメントに反映したほうがいいものを提案して」と生成AIに依頼するのはありかもしれません。

パラメーターシート

「パラメーターシート」と言われたらどうでしょうか。ここでは、サーバーやプロダクトの設定を事細かに書いたものという前提を置きます。

事細かに書くので、なかなか労力がかかります。目的もなく作成すると、徒労に終わってしまうかもしれないためなかなか注意が必要です。

目的を表現すると以下の通りです。

  • 利用者が設定を確認するために書く
    • ドキュメント上でしか設定を確認できない場合など
  • 設定が変更、追加されたらメンテナンスする
  • 意図よりも設定を示すもの

前述の私が思う設計書とは違い、方針というより実装(または設定)を示すドキュメントなので、実装(設定)から自動生成したくなる気持ちが強くなる類のドキュメントかなと思います。

IaC的に管理していて、もしそれだけで事が済む場合はであればドキュメントを人が作る必要はないでしょう。ただし、生成AIによって作成コストが極端に落ちて「事が済む」の判定基準がガラッと変わる場合は、この限りではありません。

とはいえ、冒頭にも書きましたが、誰も(AI含め)読まないドキュメントを生成しても、意味がないどころか、場合によっては混乱のもとになってしまうこともあるかもしれません。

一度自動生成したらおわり?メンテナンスする?

仮にドキュメントを自動生成したとして、そのドキュメントは継続的なメンテナンスが必要なものでしょうか?

どうメンテナンスするか、しないのか、も見越して考えないと破綻してしまいます。

ケース1: 一度生成して終わり

一度生成すれば良くて、実装や要件が変わってもメンテナンスする必要がなく、正しく有益な情報を与える状態を維持し続けられるケースです。

実際のところ、あまり多いケースではないような気もします。

ケース2: メンテナンス含めて自動生成する必要がある

自動生成のたびにドキュメントのフォーマットや章立てがころころ変わったりすると、人間が読むのに負荷がかかってしまいます。その辺を含めてうまく仕組み化する必要があります。

ネットワーク図のようにビジュアル要素が強いドキュメントは特に難しそうです。

ケース3: 一度修正したあとは手動でメンテナンス

メンテナンスは必要だけど自動生成し続けられないケースです。もしかしたら結構あるケースかもしれません。

自動生成したときの楽しいノリに任せて、手動でメンテナンスしにくいものを生成してしまうと、次第に当てにならないドキュメントなり、機能しなくなってしまう可能性があります。自動生成し続けられない場合は、手動でのメンテナンスを見越したボリューム、粒度にする必要があるでしょう。

まとめ

ドキュメントの話は対象分野や風習、価値観などによって呼び方や内容が大きく変わります。

なので、この記事内容で汎用的な考え方を定義できたとは思っていませんが、少なくともドキュメントの「目的」と「メンテナンス方法」は定義する必要はあるだろうなと思っています。

[Ansible] tagged, untagged, all タグを Playbook 内で適用すると警告が表示されようになった(ansible-core 2.20.0 から)

はじめに

Ansible には、Playbook 内の実行するタスクを細かく制御するためのタグという機能があります。例えば、ansible-playbook コマンドのオプションで --tags sakana を指定したら、sakana というタグが適用されているタスクのみが実行される、というものです。(厳密にはタスク以外に Play などの単位でもタグを適用できる)

タグは基本的に任意の文字列を使えますが、いくつか特殊な用途として予約されたタグがあります。たとえば、ansible-playbook コマンドのオプションで指定するタとしては、taggeduntaggedall という予約されたタグがあります。

  • tagged: 何かしらのタグが適用されているタスクを実行
  • untagged: タグが適用されていないタスクを実行
  • all: すべてのタスク(ただし never 以外)を実行

これら 3つの予約されたタグは、ansible-playbook コマンドのオプションで指定する特殊なタグなので、Playbook 内には適用できません。正確には「適用(tags ディレクティブに指定)すること自体はできるけど、適用した人の意図通りの挙動にはならない」という状態でした。つまり、うっかり taggeduntaggedall というタグを Playbook 内で適用できてしまう状態でした。

2025年11月にリリースされた ansible-core 2.20.0 では、こんなうっかりを発見できるように、警告が表示されるようになりました。親切設計ですね。

  • ansible-core 2.20.0 CHANGELOGより引用
    • tags now warn when using reserved keywords.

    • ansible now warns if you use reserved tags that were only meant for selection and not for use in play.

どういう警告が表示されるのか、簡単に試してみたのでその結果をまとめます。

  • 検証環境
    • ansible-core 2.20.0

検証 Playbook

以下のように、taggeduntaggedall をそれぞれ適用した3つのタスクを準備しました。

---
- name: Tag Test Play
  hosts: localhost
  gather_facts: false

  tasks:
    - name: Tag test tagged
      ansible.builtin.debug:
        msg: "This task is tagged with 'tagged'"
      tags:
        - tagged

    - name: Tag test untagged
      ansible.builtin.debug:
        msg: "This task is tagged with 'untagged'"
      tags:
        - untagged

    - name: Tag test all
      ansible.builtin.debug:
        msg: "This task is tagged with 'all'"
      tags:
        - all

実行結果

Playbook を実行したところ、意図しない結果を生むのでおすすめしませんという警告(WARNING)が冒頭に表示されました。

$ ansible-playbook -i localhost, tag_test.yml
[WARNING]: Found reserved tagnames in tags: ['tagged'], we do not recommend doing this as it might give unexpected results
Origin: /home/sakana/ansible/ac220/tag_test.yml:11:9

 9         msg: "This task is tagged with 'tagged'"
10       tags:
11         - tagged
           ^ column 9

[WARNING]: Found reserved tagnames in tags: ['untagged'], we do not recommend doing this as it might give unexpected results
Origin: /home/sakana/ansible/ac220/tag_test.yml:17:9

15         msg: "This task is tagged with 'untagged'"
16       tags:
17         - untagged
           ^ column 9

[WARNING]: Found reserved tagnames in tags: ['all'], we do not recommend doing this as it might give unexpected results
Origin: /home/sakana/ansible/ac220/tag_test.yml:23:9

21         msg: "This task is tagged with 'all'"
22       tags:
23         - all
           ^ column 9


PLAY [Tag Test Play] *******************************************************************************

TASK [Tag test tagged] *****************************************************************************
ok: [localhost] => {
    "msg": "This task is tagged with 'tagged'"
}

TASK [Tag test untagged] ***************************************************************************
ok: [localhost] => {
    "msg": "This task is tagged with 'untagged'"
}

TASK [Tag test all] *********************************************************************************
ok: [localhost] => {
    "msg": "This task is tagged with 'all'"
}

PLAY RECAP *****************************************************************************************
localhost   : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

比較のため、ansible-core 2.18.11 で実行したらエラーにはなりませんでした。

おわりに

taggeduntagged は、ネットワークの VLAN の文脈で使ってしまうことはあり得るかもしれません。all もまぁまぁ使ってしまうかもしれません。

意図しない挙動を誘発させてしまう状況では、警告やエラーでお知らせしてくれたほうがいいので、ありがたい変更でした。

JANOG57 Meeting in OSAKA オンライン参加レポート

はじめに

2026/02/11-13 に JANOG57 Meeting in OSAKA が開催されました。ホストはさくらインターネットさんです。

www.janog.gr.jp

現地参加はできませんでしたが、オンラインで参加しました。

登録者数は 6,000人を超え、実際の入場者数も合計 5,000 人を超えたとのことです。

本記事では、リアルタイムで視聴できたプログラムを中心にした感想や、全体的な所感についてまとめます。

なお、各プログラムの詳細ページから資料や、アーカイブ動画が公開される予定です(一部を除く)。

([2026/03/11 追記] アーカイブが公開されていました)

※ 参加された方でアンケート回答がまだの方は 2026/2/27 までにお忘れなく!

視聴プログラム

当日リアルタイムで視聴できたプログラムについての感想です。

(張り付いて見れていたわけではないので、一部は遡ってインプットしました)

ネットワークのデジタルツインに求める要件は何ですか?~理想的な仮想環境への期待と現状~

www.janog.gr.jp

自動化の文脈を含め、しばしば話題にあがるのが検証環境、ラボ環境をどうするかという課題。本プログラムはそんな「ネットワークのデジタルツイン」として何を求めるのかを整理、議論する場でした。

「デジタルツイン」という言葉自体はほかの分野でも利用されますが、ネットワークの分野では単なるラボ環境ではなく、より本番環境に近いモノをといった意味合いを感じました。

ネットワークデジタルツインの「実装の分類」では「数理モデル型」「仮想NW型」に分けて説明がされていました。仮想NW側のプロダクト例に Cisco Modeling Labs(CML)が載っていて、なじみがあってイメージが付きやすかったです。プロダクトや実装の話と対応させると分かりやすく感じてありがたいです。

お話を聞いて全体的に感じたのは、完全に本番環境と同じ環境にはできないので、その環境に何を期待して、何を期待しないのかを明確にすることが重要という点です。様々な立場の人が利用することになるため、これらの期待のすり合わせができていないと、全然使えないものという評価に落とされてしまいます。

たとえば、物理インターフェース名が本番環境と違うのはあるあるです。仮に「ふるまいが確認できればいい」と一言で言ったとしても、どのポートからどのポートにいくかという物理レベルの流れを「ふるまい」と指す人もいるでしょうし、IPレベルの経路を「ふるまい」と指す人もいるかもしれません。「ふるまい」という言葉がでてきたときはどのレイヤーの話なのかを合わせる必要があるなと思いました。

他に印象的だったのが、「信用を積み上げるプロセスを作る」というお話です。いきなり「これデジタルツインだから」とポンと渡されても、使う側はなかなか信用できません。なので、過去の障害を再現できることを確認するなどして、信用の起点を作り、積み上げるのが重要だというお話でした。ネットワークデジタルツインにかかわらず、いろいろなことに通じる話だなと思いました。

また、確か質疑応答の中であった「完璧なものではないという点は、従来の物理的な検証環境も同じ。従来もその環境でヨシとした経緯があったはず。仮想環境でも同様に、何が懸念で、どうだったらGoなのかを見極めることが重要」という趣旨のお話も印象的でした。新しいものにはどこか抵抗があったりもしますが、よく考えたら本質的には今まで同じ、という点も確かにありそうです。

発表内容でも質疑応答の時間でも containerlab の話が出てきたので、結構ちゃんと使われているのだなと思いました。

ほか「(完璧なものではなく)80点なら80点の活用方法がある」という意見も印象的でした。確かに。

生成AI × ネットワーク故障解析~AIエージェントを現場に導入して見えた課題と可能性~

www.janog.gr.jp

ネットワークの運用を支援するためにAIエージェントを利用して、そこから得られた評価や課題、可能性についてのプログラムでした。

こんなことできたらいいな、ではなく実際に試して得られたフィードバックから何を学んだか、という二周目、あるいはそれ以上のプログラムが増えてきました気がします。ありがたいです。

AI活用のアプローチにはさまざまあると思いますが、今回は「特定NWに特化しない」というコンセプトで作られたそうです。チューニングするのも大変なので、逆に利用者に柔軟に使ってもらうことを想定されていました。

具体的でわかりやすかったのは資料 P20 からの、役に立った例と役に立たなかった例です。役に立った例は、リソース状況やエラーログなどの確認。一方で、インターフェースのdown状態を正しく認識できない、コンフィグ生成時にACLの向きが考慮されないなどが役に立たなかった例として挙げられていました。

総じて、複数機器を組み合わせた「系」としての解析が難しいのかなという印象を受けました。ネットワーク的にはこの「系」で見ることが大事だったりしますよね。

この弱点を改善するために今回は、AIエージェントが状況に合わせて手順書などの外部情報を参照させる仕組みを組み合わせることを考えられたそうです。必要になってくるのは手順書や暗黙知なので、人間がきちんと情報を準備することがやはり重要そうです。

質疑応答のパートでのどなたかのお話で印象的だったのは、上級エンジニアの方がこの手のものを使いこなせていた、という事例です。スキルの底上げする目的で生成AIを導入するケースもあると思いますが、扱う対象業務や技術的な領域の理解の深さがモノを言うケースも結構多いのではないかと思います。

Local LLM×AIエージェントで挑むNOC DevOps — 商用AIOpsのリアル

www.janog.gr.jp

引き続き生成AIの話題。

いくつかトピックがありましたが、特に印象に残ったのは P11 からの「非構造化データの構造化」のお話です。

いかに有用なデータを準備するかが大きなポイントの一つになっていそうですが、これがまた大変そうでした。Excel や PowerPoint などで作成された既存の非構造データはそのままインプットにするには難しく、今回紹介された事例では Markdown に変換するツールを作成したそうです。

なかなか一筋縄ではいかないなと思いました。

当日はあまり視聴できなかったので、アーカイブが公開されたら改めて視聴しようと思います。

アーカイブ視聴予定

当日参加できたプログラム以外にも、興味深いプログラムがあるため、アーカイブが公開されたら視聴しようと思います。

主に以下のプログラムを中心に視聴予定です。

また、オフレコプログラムだったため配信がなかった 「エンジニアリングする『組織』の育て方」については、後日、資料や関連記事がアップされました。現地にいたらぜひ参加したいプログラムだったのでありがたいです。

プログラム以外

プログラム本編以外で感じたことです。

NOC

NOC の活動も SNS で見かけることが多かったです。

参加者からは、Wi-Fi が快適だったという意見を複数見かけたので、安定した環境が提供されていたようです。

以下のように、気になる取り組みもされていました。

x.com

また、実際に NOC を担当された方のブログも拝見しました。

野良BoF がたくさん

BoF (Birds Of a Feather)は、通常のプログラムとは別で行われる座談会に近い場です。野良BoFは委員会による選考をしない点も特徴です。

通常はオンライン配信も行われないので、現地ならではの場です。

www.janog.gr.jp

すごい多いですね。もし現地にいたら、ぜひとも「NW自動化/SRE/NREについて語るBoF」「ネットワーク自律化BoF」などは参加してみたかったものです。

大盛況の現地

冒頭にも書きましたが、現地に非常に多くの参加者がいた影響で、会場間の移動にお約束事(プロトコル)が設けられたようです。

www.janog.gr.jp

各プログラムの終了時も、退場と次のプログラムの入場は別の扉を使う旨のアナウンスがされていました。

混雑による事故防止のため、スタッフの皆様は難しくて素早い判断が迫られたのではないかなと思います。お疲れさまでした。私は趣味でイベントやライブ会場に足を運ぶこともありますが、人の流れを制御するのって大変そうだなと思っています。

展示ブースインタビュー

スタッフの方によるブースへのインタビューが YouTube Live で配信されていました。ブース側の現地の盛り上がりも伝わってきました。

www.janog.gr.jp

リモートでも参加してる感が得られる Slack

「オンライン参加であれば、あとでアーカイブ見ればよくない?」という考え方もありますが、リアルタイムで見るメリットは Slack でコメントや質問を通じて参加できる点です。

今回もちょこちょこ活用させていただきました。

www.janog.gr.jp

弊社からスタッフ

[2026/03/03 追記]

あとから知ったのですが、今回は弊社(エーピーコミュニケーションズ)社員がスタッフとして参加していました。お疲れさまでした。

www.janog.gr.jp

おわりに

やはり今回も AI の話が増えてきたような印象でした。さまざまな経験や知見を共有いただけるのはありがたいです。全体的に、生成AIの話は「できる/できない」ではなく、精度や性能の話に移っている印象を受けました。

この度は、スタッフのみなさま、登壇者のみなさま、ホスト企業のみなさま、ありがとうございました!

また、弊社のブース対応をしてくれたメンバーにも感謝です。

次回の JANOG 58 は 2026/07/15-17 に愛媛県松山市で開催予定。アリスタネットワークスジャパンさんがホスト。四国での JANOG 開催はこれで3県目で、4県までリーチだそうです。副社長が松山出身というご縁があるそうです。

次回予告 (PDF)

参考

show int さんの関連動画

事前

www.youtube.com

ふりかえり

www.youtube.com

[2026/04/06 追記] 現地レポート(前編)

www.youtube.com

[2026/04/14 追記] 現地レポート(後編)

www.youtube.com

X ポストまとめ

実況ポスト、まとめありがとうございます!

posfie.com

私と JANOG のこれまで

[Ansible] to_json や to_nice_json フィルターで日本語が Unicode エスケープされないようにする

はじめに

Ansible には、いい感じのフォーマットの JSON に変換するためのansible.builtin.to_nice_json フィルターがあります。

tekunabe.hatenablog.jp

日本語(おそらく非ASCII)が含まれているとデフォルトでは以下のように Unicode エスケープされます。

{
    "name": "\u51fa\u753a\u67f3"
}

ファイル出力時に不都合だったりするでエスケープされない方法を調べたら、このフィルターに ensure_ascii オプションがあって、これを無効にすると良いことが分かりました。

簡単ですが、試した結果をまとめます。

なお ansible.builtin.to_json フィルターにも ensure_ascii オプションがありますが、この記事のサンプルでは ansible.builtin.to_nice_json を利用します。

  • 検証環境
    • ansible-core 2.19.2

おためし

以下の Playbook でためします。

---
- name: JSON Test
  hosts: localhost
  gather_facts: false
  connection: local

  tasks:
    - name: Test to_nice_json
      ansible.builtin.copy:
        content: "{{ station | ansible.builtin.to_nice_json(ensure_ascii=false) }}"
        dest: station.json
      vars:
        station:
          name: 出町柳

実行すると、出力先の station.json は、以下のように日本語が普通に読める形式になります。

{
    "name": "出町柳"
}

なお、

    content: "{{ station | to_nice_json }}"

と指定したときは、ensure_ascii がデフォルトの true なので、以下のようになります(「はじめに」に載せた通り)。

{
    "name": "\u51fa\u753a\u67f3"
}

おわりに

この方法がうまくいくには環境的な条件があるかもしれませんが、試す価値はあるかなと思います。

[Ansible/AAP] コンテナ版 AAP のアンインストール方法

基本は Playbook ansible.containerized_installer.uninstall の実行

コンテナ版の AAP (Ansible Automation Platform) のインストール用コレクション ansible.containerized_installer の中には、ansible.containerized_installer.uninstall という Playbook があります。

AAP 2.6 のドキュメントにも、以下の実行コマンドが記載されています。

ansible-playbook -i inventory ansible.containerized_installer.uninstall

ドキュメント上は基本このくらいでなのすが、KB 上はもう少し記載があります。

対応 KB

要ログインなので、リンクのご紹介程度にしますが、「How to uninstall Containerized Ansible Automation Platform?」という KB に、アンインストール Playbook の実行後のディレクトリ削除、イメージ削除などが加えられた手順が掲載されています。

access.redhat.com

KB にあること自体を忘れそうなので、自分のブログ経由でただりつけるように記事としておいておきます。

GitHub で プルリクエストを無効化したりコラボレーターに制限できるようになった

はじめに

GitHub のプルリクエストの利用制限ができるようになったことを、以下の記事で知りました。

github.blog

具体的には、プルリクエストを完全に無効化したり、そのリポジトリのコラボレーター権限のユーザーに制限できるとのことです。

今まで、Issue や Wiki などは完全に無効化できましたが、プルリクエストはそこまでの制御ができなかったという経緯があります。

簡単にですが、ためしてみました。

おためし

設定変更を試してみます。とあるリポジトリで、デフォルトのプルリクエストが有効化されている状態ではじめます。

デフォルトでは PR 有効

無効化する

さっそく [Settings] > [General] ページにある、Features セクションの Pull requests のチェックボックスを外します。

オフにして無効化

すると、すぐに上部のメニューから Pull requests がなくなりました。

PR が無効に

コラボレーターに制限する

今度は、完全に無効化するのではなく、コラボレーター権限があるユーザーだけ利用できるようにしてみます。

先程と同じ設定項目で、Pull requests のチェックボックスをオンにしつつ、Pull request permissions コンボボックスを Collaborators only に変更します(デフォルトは All users) 。

コラボレーターのみ PR 可能に変更

なお、説明書きにもありますが、制限した場合でも他のユーザーからは見ること自体はできるそうです。個人的にはそういう仕様の方が良いかなと思っています。

実際、コラボレーター権限がないユーザーでは、PR を出すボタンが無効化されれたことが確認できました。PR 自体は閲覧できます。

PR は見れるけど出せない

なお、コラボレーター権限がなくてもフォーク自体はできました。実際に PR を出そうとすると、権限がない旨のメッセージが表示されて続けられませんでした。

PR を出す権限がない

おわりに

数年前に、Issue は制御できるけどプルリクエストが制御しにくいのはなんでだろうと思っていたので、解消されました。ありがたいです。

参考

docs.github.com

codezine.jp

[2026/02/20 追記]

www.publickey1.jp

Visual Studio Code 上で GitHub Copilot による差分レビューをする

はじめに

いままで、GitHub Copilot に依頼するレビューは、「GitHub 上で PR (プルリクエスト)を出すときに、レビュアーに copilot もアサインすることで、差分をレビューしてくれる」という仕組みを利用していました。

まずは Draft 状態で GitHub Copilot にレビューしてもらい、一通り修正し終わったら Draft を解除し、これをもって人のレビューが Ready な状態としていました。

ただ、PR を出す前に typo ミスやコピペミスなどの凡ミスは潰しておきたいという気持ちが芽生えました。なんならコミット前に修正したいものです。fix typos のようなコミットメッセージも減らしたいですし。

こんなことを思っていたところ、手元の VS Code(GitHub Codespacesでも)上でも差分レビューができることに気が付きました。(結構前からあった機能かもしれません)

docs.github.com

簡単ですが、試したときの方法をご紹介します。

  • 環境
    • Visual Studio Code 1.106.3

VS Code 上での差分レビュー方法

あくまで「差分レビュー」なので差分が git 管理上の差分が必要です。具体的には、変更はしたけどまだコミットしていない差分が対象です。

以下は、git 管理上の差分がなく、レビューボタンがない状態です。

差分がないときは レビューボタンが表示されない

まず、レビュー対象とする何かしらの修正します。すると VS Code 上の Git 操作の画面に「コードレビュー」のボタンが表示されるので、このボタンを押します。

コードレビューボタン

しばらくすると、レビューコメントが表示されます。今回は Ansible Playbook で Play レベルの become: true という指定についてコメントが付きました。インラインで表示されるのも便利ですね。

レビューコメントがついた

コメントはインラインだけでなく「コメント」パネルにも表示されます。

コメントパネルでも確認できる

なお、レビューコメントに方言が入っているのは、.github/copilot-instructions.md に「レビューコメントは京都弁で書くこと」と指示しているためです。違う指示をするとにコメントが変わったので、ちゃんとこのファイルを読み込んでカスタムできていることも確認できました。

いいところ

今回の VS Code 上での差分レビューは、差分に着目してレビューするときに有用そうです。

かといって、PR 出したときの GitHub Copilot のレビューは無くさない方が良いかなと思いました。開発者がうっかり VS Code 上の差分レビューをし忘れることを見越してのことです。

また、私は普段 git commitgit addgit push あたりの基本的な正常系の操作は、VS Code 上の GUI を利用することが多いです。なので、GUI による git 操作時にレビューボタンが目に入って来やすいのは私には合っています。

リモートリポジトリに GitHub を使っていなくてもできるレビューという点もありますね。実は今回のおためしもリモートリポジトリは GitLab です。

チャットでもレビュー依頼できてたじゃん?

これまでも、チャットでもレビューの依頼ができていました。

ただ、チャットで普通に依頼すると差分ではなく全体的なチェックになります。プロンプトを入力するのもやや手間に思っていました。差分レビューを手間なくチャットで行うための、カスタムプロンプトなどの工夫の余地はありそうですが、工夫なく差分レビューできる今回の方法はラクに感じました。

全体的にチェックしてほしいときは、今回紹介している差分レビューではなく不向きかもしれないので、使い分けが必要ですね。

おわりに

凡ミスは早めに修正したい私にとってはとても合っている方法だと感じたので、積極的に使っていこうと思います。

なお、差分レビューを自分の VS Code 上で行うか、PR を出したときに行うか、の比較については、レビュータイミング以外にもいつくか観点があるかもしれません。たとえば、GitHub リポジトリ側と自分の GitHub Copilot のプランの違いの都合など。

にしても、便利な時代になったものです。