Slide 1

Slide 1 text

まだチケットを手動で書いてるの?! GitHub Actionsと生成AIで チケットの作成を自動化してみた話 株式会社SHIFT ソリューション本部 ソリューション事業部 アジャイル推進部 DevOps推進1グループ 片山 嘉誉

Slide 2

Slide 2 text

◼会社:株式会社SHIFT ◼名前:片山 嘉誉 ◼職業:DevOpsリードエンジニア ◼専門分野:CI/CDの環境構築 とその上で動作するジョブの作成 ◼好きなAIモデル:Claude 3.5 Sonnet 1 自己紹介と宣伝 【SHIFTの技術ブログで公開している記事】 ◼ pytest-bddを使って振る舞い駆動でテストを自動化! 生成AIでテストスクリプトも作れます! ◼ 振る舞い駆動っぽい書き方ができるCodeceptJSは 使いやすい?!生成AIとの相性もチェックしてみた! ◼ CucumberとPlaywright+生成AIを使って TypeScriptで自動テストを書こう! WebアプリやAndroidネイティブアプリもBDDで!

Slide 3

Slide 3 text

趣味で作ったもの 2 ◼GitHubトレンドで上位のリポジトリの内容を 生成AIで要約して投稿するBlueskyの BOT ◼生成AIでランダムな英文と穴埋め問題を作 成するアプリ ◼URLを入力するとサイトの情報を取得して生 成AIでコンテンツを精査、その内容から生成 AIで対話シナリオを作成し、VOICEVOXを 使って対話動画を作成するツール ◼テキストで図が作れるMermaidやSVGを生 成AIで編集するツール

Slide 4

Slide 4 text

本日のアジェンダ 1. チケット作成について 2. GitHub Actionsによる自動化 3. 生成AIのプロンプト 4. デモ環境の紹介 5. まとめ 3 話を聞く上でのポイント 今回はGitHubでの実現例を紹介しますが、 生成AIの部分はRedmineやJenkins など異なる環境でも使えるものです!

Slide 5

Slide 5 text

4 突然ですが、チケットを作るのって 面倒じゃないですか? (面倒じゃない人なんていないはず…)

Slide 6

Slide 6 text

◼タスクが大きすぎる場合 設計 → 実装 → テストなど、工程ごとにチケットを作成する ◼複数の担当者が作業を行う必要がある場合 担当者ごとにチケットを作成する ◼一部の作業だけ期限が異なる場合 期限がある作業のチケットを作成する ◼依存関係がある場合 先行タスクと後続タスクを分割してチケットを作成する ◼進捗を管理したい場合 アジャイルであればスプリント毎にチケットを作成する 5 子チケットを作成する例 現在のプロジェクトは アジャイル開発であり、 1週間毎にチケットを 作成している

Slide 7

Slide 7 text

6 チケットの親子関係(チケットの構造) ○○機能開発 設計 実装 テスト ひとつの親から複数 分岐するパターン ○○機能開発 タスク(1W) タスク(2W) タスク(3W) 子から新しい子が作られる 数珠繋ぎパターン タスク タスク(4W) こちらの使い方 を想定 このケースでも ある程度使える

Slide 8

Slide 8 text

[自動生成]○○の動作確認を行う。 #111 ⦿Open 概要 〇〇を修正したので動作確認を行う。 達成条件 〇〇の動作確認を行い、正常に動作していることを確認する。 作業 ☐ 〇〇の動作確認を行う。 ☐ 動作に問題が無ければ結果を報告する。 ☐ 問題があれば解決策を模索し、修正を行う。 結果 ・ なし 残課題 ・ なし 参照 ○○の実装を行う。 #110 補足 ・ なし 7 生成AIを使うとチケットの作成はどうなる? ○○の動作確認を行う。 #111 ⦿Open ## 概要 ## 達成条件 ## 作業 - [ ] ## 結果 - なし ### 残課題 - なし ## 参照 - なし ## 補足 - なし 毎回ゼロから内容を 埋めていくのは大変… 少し時間が空くと 前の作業で何をしたか 思い出す所から始まる 親チケットの内容を参照 することである程度 意図を汲み取ってくれる チケット 更新時間 3~5分 作業内容を考えて いると話が脱線する チケット 更新時間 1~2分 自動で生成されるので 打ち合わせを中断しない! (実務に合わせて内容の見直しは必要だが) 一般的にやるべき内容が生成されるので修正も楽にできる 考慮漏れで後から 作業が増える 7~8割ぐらいの精度で生成AIが ドラフトを作ってくれるイメージ ?

Slide 9

Slide 9 text

8 GitHub Actionsを使えば チケットを作成時に処理できる! (そして生成AIとの連携もできる)

Slide 10

Slide 10 text

GitHub GitHub Actions(CI/CD環境) 9 チケット作成から自動更新までの流れ(簡易版) Repository (開発用) .github/workflows/ workflow.yml ・いつ(何のイベントで開始するか) ・どこで(どの実行環境を使うか) ・何をする(どのような処理をするか) Issue 親チケット 子チケット ①子チケットを作成 (イベントが発生) runner(実行環境) ②イベントをトリガーに 実行環境が自動起動 ③チケット更新 (YAMLに記載した処理 をランナー上で実行) 子チケット

Slide 11

Slide 11 text

社内 GitHub GitHub Actions 10 生成AIでチケットを作成するツールの構成(詳細版) Repository (開発用) Repository (Action管理用) .github/workflows/ workflow.yml generate-issue-content/ action.yml shellscript self-hosted runner Microsoft Azure 各生成AIのモデル 生成AIの実行処理や チケットの更新処理 Issue 環境変数や 認証情報(secret)を設定 親チケット 子チケット アクションの処理は 社内ネットワークに アクセスできる セルフホステッドランナー で実行される 社内からのみ アクセス可能 アクションの呼び出し

Slide 12

Slide 12 text

11 具体的な実装内容を 紹介して行きます! (まずはGitHub関連のところから)

Slide 13

Slide 13 text

name: Generate Issue on: issues: types: [opened] permissions: issues: write contents: read jobs: generate-issue-content: runs-on: [self-hosted, linux, x64] steps: - name: Generate Issue env: GH_REPO: ${{ github.repository }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} uses: organization/github-actions/generate-issue-content@v1 with: repository: ${{ env.GH_REPO }} issue_number: ${{ github.event.issue.number }} ai_api_token: ${{ secrets.AI_API_TOKEN }} 12 チケット作成のトリガー設定 チケットが作成されたタイミング いつ どこで なにを 実際の実装とは異なる箇所があります。

Slide 14

Slide 14 text

get_parent_issue_number() { local -r repository="${1}" local -r issue_number="${2}" local -r issue_url="- [ ] https://github.com/${repository}/issues/${issue_number}" local -r issue_path="- [ ] #${issue_number}" gh issue list ¥ --state all ¥ --search "${issue_number} in:body" ¥ --json number,body ¥ --jq ".[] | select(.body | contains(¥"${issue_url}¥") or contains(¥"${issue_path}¥")) ¥ | .number" | head -n 1 } 13 親チケットの情報を取得する方法 子チケットの番号が本文に含まれたチケット(親チケット候補)を検索 誤検知を防止するため特定の文字列が含まれるかチェック 子チケット作成時に自動変換される文字列 実際の実装とは異なる箇所があります。

Slide 15

Slide 15 text

14 いよいよ生成AIの話! プロンプトが気になりますか? (といっても大したことはしていません)

Slide 16

Slide 16 text

15 生成AIの具体的なプロンプト GitHubの親Issueから子Issueを作成したい。 以下の仕様に従い、子Issueの本文を作成して欲しい。 仕様: - 回答は子Issueの本文だけにする。 - 子Issueのフォーマットは親Issueと同じ形にする。 - 親Issueのタイトルと親Issueの本文を基に子Issueで行う作業を推測する。 - 「達成条件」は子Issueが完了するための条件を1行で記載する。 - 「結果」と「残課題」「詳細」の欄は項目を削除して「- なし」とだけ記載する。 - 「参照」の欄は「- 親Issue: #${parent_issue_number}」を記載する。 子Issueのタイトル: ${chiled_issue_title} 親Issueのタイトル: ${parent_issue_title} 親Issueの本文: ``` ${parent_issue_body} ``` 実際のプロンプトとは異なる箇所があります。 このように指示していても意図しない (例えば「Issueの本文:」や「```」など) 文字が出力される場合があるので、 そこはシェルスクリプトで削除している テンプレートに依存するが 特定の内容を指定することもできる 親チケットへのリンクを自動で追加、 このひと手間が地味に便利だったり

Slide 17

Slide 17 text

16 百聞は一見に如かず! デモ環境を用意しました (GoogleのGeminiで動作します)

Slide 18

Slide 18 text

17 デモ環境のプロンプト(汎用的に使えるよう修正) GitHubの親Issueから子Issueを作成したい。 以下の仕様に従い、子Issueの本文を作成して欲しい。 仕様: - 回答は子Issueの本文だけにする。 - 子Issueのフォーマットは親Issueと同じ形にする。 - 子Issueは作業を行う前の状態を想定して作成する。 - 各項目の初期値は「- なし」とする。 - 親Issueのタイトルと親Issueの本文を基に子Issueで行うタスクを推測する。 - 子Issueの本文に「参照」の項目を追加して「- 親Issue: #${parent_issue_number}」を記載する。 子Issueのタイトル: ${chiled_issue_title} 親Issueのタイトル: ${parent_issue_title} 親Issueの本文: ``` ${parent_issue_body} ``` Gemini-1.5-proだと チェックボックスに チェックが入った状態 で生成されたので 想定される状態を記載 特定のテンプレートに 依存しない内容に変更

Slide 19

Slide 19 text

◼アクションが格納されているリポジトリ https://github.com/aegisfleet/gemini-generate-issue ◼アクションを使ってチケットを自動生成するリポジトリ https://github.com/aegisfleet/generate-issue-test 18 デモ環境 GeminiのAPI キーがあれば 誰でも使えます

Slide 20

Slide 20 text

19 実際に運用してみた結果を まとめて行きます!

Slide 21

Slide 21 text

◼子チケットを作成するのが楽しくなった。 生成AIにはガチャ要素があるので、 どのようなチケットが作成されるかというワクワク感がある。 ◼親チケットの内容をきちんと書くことで作成される 子チケットの内容も正確になることが分かった。 これは後からチケットを見返した際にも 作業内容が分かり易くなるという副次的効果がある。 20 導入後の効果 ガチャなので アタリもあれば ハズレもある

Slide 22

Slide 22 text

◼成果物に高い品質が求められるような場所に生成AIを用いた自動化を 適用させるのは難しい。ドラフトを作成するぐらいが適している。 ◼最初はGPT-3.5 Turboで試作していたが、 生成される内容が安定しなかったのでGPT-4にした。 ◼コストを抑えるためにGPT-4oを試してみたが、 「子Issueのフォーマットは親Issueと同じ形とする。」 という指示が思うように解釈されなかった。 ◼モデルを変えると同じプロンプトでも出力される結果が異なるので、 モデルごとにプロンプトを調整する必要がある。 ◼(今回は紹介していないが)本文からタイトルを作る場合はGPT-4oで も問題無く、目的に合わせて生成AIのモデルを選定する必要がある。 21 生成AIを使う上での苦労

Slide 23

Slide 23 text

22 チケットの本文作成に適した生成AIモデル 生成AIモデル チケット本文作成への適正 Open AI GPT-3.5 Turbo 不適正 Open AI GPT-4 適正 Open AI GPT-4o 不適正 Google Gemini 1.5 Pro 適正 Google Gemini 1.5 Flash 不適正

Slide 24

Slide 24 text

23 ご清聴ありがとう御座いました!