$30 off During Our Annual Pro Sale. View Details »

まだチケットを手動で書いてるの?!GitHub Actionsと生成AIでチケットの作成を自動...

SHIFT EVOLVE
December 07, 2024

まだチケットを手動で書いてるの?!GitHub Actionsと生成AIでチケットの作成を自動化してみた話 / 20241207 Yoshinori Katayama

2024/12/7 ソフトウェアテスト自動化カンファレンス2024
https://testautomationresearch.connpass.com/event/333442/
株式会社SHIFT
ソリューション本部 ソリューション事業部 アジャイル推進部 DevOps推進1グループ
片山 嘉誉

SHIFT EVOLVE

December 07, 2024
Tweet

More Decks by SHIFT EVOLVE

Other Decks in Technology

Transcript

  1. ◼会社:株式会社SHIFT ◼名前:片山 嘉誉 ◼職業:DevOpsリードエンジニア ◼専門分野:CI/CDの環境構築 とその上で動作するジョブの作成 ◼好きなAIモデル:Claude 3.5 Sonnet 1

    自己紹介と宣伝 【SHIFTの技術ブログで公開している記事】 ◼ pytest-bddを使って振る舞い駆動でテストを自動化! 生成AIでテストスクリプトも作れます! ◼ 振る舞い駆動っぽい書き方ができるCodeceptJSは 使いやすい?!生成AIとの相性もチェックしてみた! ◼ CucumberとPlaywright+生成AIを使って TypeScriptで自動テストを書こう! WebアプリやAndroidネイティブアプリもBDDで!
  2. 本日のアジェンダ 1. チケット作成について 2. GitHub Actionsによる自動化 3. 生成AIのプロンプト 4. デモ環境の紹介

    5. まとめ 3 話を聞く上でのポイント 今回はGitHubでの実現例を紹介しますが、 生成AIの部分はRedmineやJenkins など異なる環境でも使えるものです!
  3. ◼タスクが大きすぎる場合 設計 → 実装 → テストなど、工程ごとにチケットを作成する ◼複数の担当者が作業を行う必要がある場合 担当者ごとにチケットを作成する ◼一部の作業だけ期限が異なる場合 期限がある作業のチケットを作成する

    ◼依存関係がある場合 先行タスクと後続タスクを分割してチケットを作成する ◼進捗を管理したい場合 アジャイルであればスプリント毎にチケットを作成する 5 子チケットを作成する例 現在のプロジェクトは アジャイル開発であり、 1週間毎にチケットを 作成している
  4. 6 チケットの親子関係(チケットの構造) ◦◦機能開発 設計 実装 テスト ひとつの親から複数 分岐するパターン ◦◦機能開発 タスク(1W)

    タスク(2W) タスク(3W) 子から新しい子が作られる 数珠繋ぎパターン タスク タスク(4W) こちらの使い方 を想定 このケースでも ある程度使える
  5. [自動生成]◦◦の動作確認を行う。 #111 ⦿Open 概要 〇〇を修正したので動作確認を行う。 達成条件 〇〇の動作確認を行い、正常に動作していることを確認する。 作業 ☐ 〇〇の動作確認を行う。

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

    ・どこで(どの実行環境を使うか) ・何をする(どのような処理をするか) Issue 親チケット 子チケット ①子チケットを作成 (イベントが発生) runner(実行環境) ②イベントをトリガーに 実行環境が自動起動 ③チケット更新 (YAMLに記載した処理 をランナー上で実行) 子チケット
  7. 社内 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)を設定 親チケット 子チケット アクションの処理は 社内ネットワークに アクセスできる セルフホステッドランナー で実行される 社内からのみ アクセス可能 アクションの呼び出し
  8. 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 チケット作成のトリガー設定 チケットが作成されたタイミング いつ どこで なにを 実際の実装とは異なる箇所があります。
  9. 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 親チケットの情報を取得する方法 子チケットの番号が本文に含まれたチケット(親チケット候補)を検索 誤検知を防止するため特定の文字列が含まれるかチェック 子チケット作成時に自動変換される文字列 実際の実装とは異なる箇所があります。
  10. 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の本文:」や「```」など) 文字が出力される場合があるので、 そこはシェルスクリプトで削除している テンプレートに依存するが 特定の内容を指定することもできる 親チケットへのリンクを自動で追加、 このひと手間が地味に便利だったり
  11. 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だと チェックボックスに チェックが入った状態 で生成されたので 想定される状態を記載 特定のテンプレートに 依存しない内容に変更
  12. 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 不適正