【Github】Github Actions ~ pull_request / pull_request_target ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/01/28/004128

の続き。

仕事で、Github の プルリクエストが発行された際に
Linter を起動してほしいってオーダーを受けたので
on: pull_request 周辺について調べてみた

目次

【1】プルリク契機のイベント
 1)補足:pull_request_target に関する詳細
【2】構文
 1)types
【3】判定
 1)プルリクかどうかを判定するには
 2)Draft プルリクかどうかを判定するには
【4】サンプル
 例1:プルリク時にSQL linter を実行

【1】プルリク契機のイベント

# Events Explanations Comments
1 pull_request プルリクのアクティビティが発生した時
2 pull_request_comment プルリクのコメントが作成/編集/削除された時
3 pull_request_review プルリクのレビューが送信/編集/無視された時
4 pull_request_review_comment プルリクのレビューコメントが変更された時
5 pull_request_target プルリクのアクティビティが発生した時 「1)pull_request_target に関する詳細」参照

1)補足:pull_request_target に関する詳細

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#pull_request_target

* pull request のベースのコンテキストで実行
 => 以下を避けられる
 + リポジトリを変更
 + ワークフローで使うシークレットを盗む
 + pull request の head から安全ではないコードが実行される

* ワークフローでは、pull request に対するラベルやコメントなどを
 フォークから行うことができる

pull_request vs pull_request_target

pull_request pull_request_target Comments
フォークしたリポジトリにも書き込み権限・Secretsを渡さない フォークしたリポジトリにも書き込み権限・Secretsを渡す フォーク 元で設定している secrets にアクセスできないとGITHUB_TOKEN / SLACK_TOKENを参照できない

使用上の注意

* pull request からコードをビルドまたは実行する必要がある場合は、
 このイベントを使わない

【2】構文

on:
  pull_request:
    types:
      - opened
      - reopened
      - synchronize
    branches:
      # プルリクエストのマージ対象がmainの場合実施
      - 'main'
    # ブランチ除外
    #branches-ignore:
    #  - 'mona/octocat'
    paths:
      # pull request に SQLファイル (.sql) への変更が含まれているときに実行
      - '**.sql'
    # paths-ignore:
    #   - 'tests/**.sql'

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#running-your-pull_request-workflow-based-on-the-head-or-base-branch-of-a-pull-request
https://docs.github.com/ja/actions/using-workflows/triggering-a-workflow#using-filters-to-target-specific-branches-for-pull-request-events

1)types

* デフォルトは、『types: [ opened, synchronize, reopened ]』

主なTypes

types Explanations
opened プルリク(Draft pull-requestを含む)が発行時
reopened プルリク(Draft pull-requestを含む)が再Open時
synchronize プルリクにコミットが追加された時
ready_for_review プルリクが Draft から Open になった時

【3】判定

* Reusable Github workflow を使う際に、
 プルリクかどうかを判定する必要があったのでメモ。 

1)プルリクかどうかを判定するには

github.event_name == 'pull_request'

2)Draft プルリクかどうかを判定するには

github.event.pull_request.draft == true

【4】サンプル

例1:プルリク時にSQL linter を実行

Github Actions ~ SQL Linter ~
https://dk521123.hatenablog.com/entry/2024/03/04/180308

name: DemoForPullRequest

on:
  pull_request_target:
    types:
      - opened
      - reopened
      - synchronize
    paths:
      - '**.sql'
jobs:
  sample-job:
    runs-on: ubuntu-latest
    steps:
      - name: Run checkout
        uses: actions/checkout@v4
      - name: Setup Python
        uses: actions/setup-python@v4
        with:
            python-version: '3.10'
      - name: install SQLFluff
        run: 'pip install sqlfluff'
      - name: format
        run: |
          for file in 'sqls/*.sql' 
          do
            sqlfluff lint $file --dialect snowflake --format github-annotation
          done

参考文献

https://qiita.com/Soh1121/items/b2bc51afc933c910806c
https://til.toshimaru.net/2021-12-12
https://madogiwa0124.hatenablog.com/entry/2022/05/29/110148
https://pankona.github.io/blog/2021/03/29/github-actions-pull-request-target/

関連記事

Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Actions ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2023/12/21/155224
Github Actions ~ 差分ファイルを抽出する ~
https://dk521123.hatenablog.com/entry/2024/08/11/123351
Github Actions ~ GITHUB_ENV ~
https://dk521123.hatenablog.com/entry/2023/12/29/000840
Github Actions ~ GITHUB_OUTPUT ~
https://dk521123.hatenablog.com/entry/2024/01/30/002943
Github Actions ~ ワークフロー制御 ~
https://dk521123.hatenablog.com/entry/2024/01/28/004128
Github Actions ~ SQL Linter ~
https://dk521123.hatenablog.com/entry/2024/03/04/180308
SQL Linter ~ SQLFluff ~
https://dk521123.hatenablog.com/entry/2024/02/28/225002
reviewdog ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/04/13/232832
Git ~ 基本編 / 基本コマンド ~
https://dk521123.hatenablog.com/entry/2020/10/02/000000