🐙

GitHub Actionsで自動アサイン

2023/06/16に公開

学習用の手順メモです
今回はレビュワーとレビュイーを自動でアサインするワークフローを作ります

手順

  1. .github/workflowsディレクトリを作成
  2. .github/workflowsにyamlファイルを作成
  3. ワークフローの設定
  4. ジョブを作成

ワークフローの設定

公式ドキュメント

name

ワークフローの名前
リポジトリのアクションタブに表示される

name: GitHub Actions

on

onを使用してワークフローを実行する原因となるイベントを定義する

on: pull_request

細かい設定は公式ドキュメントを見る

ジョブを作成

ワークフローで実行される一連の処理
ジョブは複数作成できる

jobs:
 setup:
  (setupジョブの設定)
 assign:
   (assignジョブの設定)

以下をジョブごとに設定する

jobs.id

今回はassignとする

jobs:
 assign:

jobs.id.name

ジョブのid
github actionsにわかりやすく表示されるのであったほうがいい

jobs:
 assign:
  name: Assign reviewers and reviewers

jobs.id.runs-on

実行環境を指定する

jobs:
  assign:
    (略)
    runs-on: ubuntu-latest

jobs.id.steps

ジョブで実行される一連のタスク(配列)

jobs:
  assign:
    (略)
    steps: 
     - タスク
     - タスク

タスクごとに設定を行う
なおstepsにはいろいろなコマンドがあるので使うときに調べる
jobs.<job_id>.steps

以下はよく使う設定

jobs.id.steps[*].name

実行名
github actionsにわかりやすく表示されるのであったほうがいい

    steps: 
     - name: set assignee

jobs.id.steps[*].run

OS(オペレーションシステム)のシェルを使用して、実行したいコマンドをかく
今回はOSがubuntuだから、shellscriptを使用

    steps:
     - run: echo "🐧 assignee is ${{ github.actor }}"

jobs.id.steps[*].env

環境変数を設定できる

    steps:
     - env:
      ASSIGNEE: "my_account"
       run: echo "🐧 assignee is ${ASSIGNEE}"

jobs.id.step[*].if

実行条件を設定できる

    steps:
     - if: ${{ github.actor === 'my_account' }}
       run: echo "🐧 assignee is my_account"

github のコンテキスト

ワークフロー内で使えるコンテキスト
ワークフローの実行とその実行をトリガーしたイベントの情報が含まれる

以下のgithub.actor は ワークフローの実行をトリガーしたユーザ名

     - run: echo "🐧 assignee is ${{ github.actor }}"

たくさんあるので公式ドキュメントで確認

上記を踏まえて作成する

name: Auto Assignees and Reviewers

on: pull_request

jobs:
  assign:
    runs-on: ubuntu-latest
    steps:
      - name: Set Assignee
        run: |
          assignee_count=$(cat ${{ github.event_path }} | jq '.pull_request.assignees | length')
          if [[ 0 == $assignee_count ]]; then
            curl -X POST \
              -H "Content-Type: application/json" \
              -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
              -d "{ \"assignees\": \"${{ github.actor }}\" }" \
              https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/assignees
          fi
      - name: Set Reviewers
        env:
          REVIEWERS: "${{ vars.REVIEWERS }}"
        run: |
          reviewers=$(echo "\"${REVIEWERS// /}\"" | jq 'split(",") | .-["${{ github.actor }}"]')
          curl -X POST \
                -H "Content-Type: application/json" \
                -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
                -d "{ \"reviewers\": $reviewers }" \
                https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/requested_reviewers

補足

  • ${{ vars.REVIEWERS }} は リポジトリで設定した環境変数で、ここにアサインしたいアカウントをカンマ区切りで書いています
user1,user2,user3

https://docs.github.com/ja/actions/learn-github-actions/variables

  • Set Assignee では assignee が既にいる場合は上書きしないように条件分岐
  • Set Reviewers では assignee をレビュワーから除外

Discussion