Upgrade to Pro — share decks privately, control downloads, hide ads and more …

はじめてのIssueOps - GitHub Actionsで実現するコメント駆動オペレーション

tmknom
March 10, 2025

はじめてのIssueOps - GitHub Actionsで実現するコメント駆動オペレーション

IssueOpsとはGitHubのコメントから、任意のオペレーションを実行するプラクティスです。ChatOpsのようにコメントするだけで、誰でも簡単に使えます。IssueOpsはGitHub Actionsの標準機能だけで実装でき、デプロイやInfrastructure as Codeではとくに役立ちます。

本スライドではIssueOpsの概要・実装・設計・運用について、コードも交えながらポイントをお伝えします。IssueOpsは想像以上に心地よい体験を提供します。本スライドを参考にしつつ、ぜひお試しいただきたいです。

tmknom

March 10, 2025
Tweet

More Decks by tmknom

Other Decks in Programming

Transcript

  1. 1. issue_comment : トリガーの設定 GitHub へのコメント投稿を起点に、ワークフローを起動する on: # ワークフローのトリガーを設定 issue_comment:

    # デフォルトでは編集や削除でも発火 types: [created] # 新規投稿でのみ発火するよう、最低限のフィルタリング issue_comment イベントの注意点 プルリクエストとIssue のコメントを、区別できない トリガーの設定では、コメント本文でフィルタリングできない 11
  2. 2. Parser: コマンドのパース コメントに含まれる「コマンド」を解析し、パラメータを抽出 - id: parser env: # 環境変数へコメント本文をセット

    COMMENT: ${{ github.event.comment.body }} # 複数行の場合がある点に留意 run: | command="$(head -n 1 <<<"${COMMENT}" | tr -d '\r\n')" # コメント1行目のみ使用 IFS=$' ' read -ra tokens <<<"${command#/}" # "/"除去後、スペース区切りで分割 echo "operation=${tokens[0]}" >> "${GITHUB_OUTPUT}" # 操作名(例: plan) echo "environment=${tokens[1]}" >> "${GITHUB_OUTPUT}" # 環境名(例: dev) 例: /plan dev → operation= plan, environment= dev と抽出 コマンド体系(/plan dev の部分)は自由に設計 12
  3. 3. Worker: オペレーションの実行 パラメータを受け取り、任意のオペレーションを実行 - id: worker env: # Parserで抽出したパラメータを環境変数へセット

    OPERATION: ${{ steps.parser.outputs.operation }} ENVIRONMENT: ${{ steps.parser.outputs.environment }} run: | # 受け取ったパラメータを使って、自由にスクリプトを記述 terraform -chdir="stacks/${ENVIRONMENT}" "${OPERATION}" 例: /plan dev → terraform -chdir=stacks/dev plan を実行 Terraform だけでなく、他の処理も自由に実装可能 13
  4. 不安を解消する3 つのGitHub API GitHub API 情報量 概要 ステータスチェック ◦ ワークフローの成功・失敗・実行中を

    PR ページ下部に表示 リアクション △ ワークフロー起動時などに 絵文字で最低限のフィードバック コメント投稿 ◎ 実行結果やエラー詳細などを ログページへ行き来せずに把握可能 各GitHub API はそれぞれ情報量が異なる フィードバックしたい情報の重要度に応じて使い分ける 23
  5. 実装例(リアクションの場合) 各種GitHub API の実行には、GitHub CLI の利用が手軽 # Reaction APIを実行し、コメントへ絵文字でリアクションする -

    env: COMMENT_ID: ${{ github.event.comment.id }} GITHUB_TOKEN: ${{ github.token }} run: | set -x gh api --method POST \ -f content="eyes" \ # 絵文字はココで切り替え "/repos/${GITHUB_REPOSITORY}/issues/comments/${COMMENT_ID}/reactions" ※ GitHub CLI はランナーにデフォルトでインストールされているため、すぐに使える 25
  6. PR の状態に応じてブランチを切り替える例 PR が「オープン状態」なら、そのPR ブランチでチェックアウト - id: branch env: PULL_REQUEST:

    ${{ github.event.issue.number }} # プルリクエスト番号を取得 run: | # プルリクエストの「状態」と「ブランチ名」をGitHub CLIで取得 json="$(gh pr view "${PULL_REQUEST}" --json state,headRefName)" # プルリクエストが「オープン状態」の場合、プルリクエストブランチを使う if [[ "$(jq -r .state <<<"${json}")" == "OPEN" ]]; then branch="$(jq -r .headRefName <<<"${json}")" fi # プルリクエストがマージ済みまたはクローズ済みの場合は、mainブランチを使う(後続のステップでは、この値でチェックアウト) echo "target=${branch:-main}" >> "${GITHUB_OUTPUT}" ※ スペースの都合から、actions/checkout アクションの呼び出し部分は省略しています 29
  7. コマンド体系はシンプルに 複雑なコマンドを提供しても、結局使われなくなってしまう 覚えやすさを重視し、入力する単語数を増やしすぎない 単語数は3 〜4 個ぐらいに留めよう(例: /plan dev app )

    大量のコマンドを一気に導入せず、利用者の慣れを待つ 本当に必要な、少数のコマンドだけ提供しよう ヘルプコマンド(例: /help )の提供もオススメ 利用者の自己解決を促そう 32