LoginSignup
3
0

【Github Actions】 PullRequestトリガー時にdiffのファイルリスト見て何かしたい

Posted at

作業メモですが情報がなかったので備忘録

課題感

  • PR作成時にPRのFile Changedタブに表示されるファイルリストがほしい
    • headで触ったファイルのみにdiffがでる
    • headにbaseブランチをマージしてもdiffがでない
      • コンフリクト解消を除く
    • baseブランチにコミットが追加されてもdiffが増えない
  • Githubのcheckoutは基本 shallow clone(depth=1でとってくる)で、cloneに時間のかかるツリーを使った比較はしたくない
    • 3点ドット( git diff branchA…branchB)を使うとツリー上の2ブランチの共通の親コミットまで遡ってbranchBとのdiffをだしてくれるが、2ブランチが互いの共通コミットまで深くfetchする必要がある(baseブランチの共通コミットまでの深さは追えない)
    • つまり2点のコミット間の比較にしたい

このメモでの言葉の使い方

  • baseブランチ: PRの向き先
  • headブランチ: PRの指定ブランチ

ほぼやりたいこと

全体方針は良いがやりたい要件には少し合わなかった

必要なこと

  • PR作成後、baseブランチに変更が入るとdiffにどんどん追加されていく
    • github.event.pull_request.base.shagithub.shaのどちらかが片方しか更新されてない

参照できる変数

説明はみれるが具体的にどのタイミングの何を指してるかがわかりづらい

検証した結果

github.sha

Githubが作成するPRのマージブランチ(baseブランチの最新にheadブランチをマージしたブランチ)の最新コミット。参照するごとに更新されていて常にbaseの最新を向いてる

  • refs/remotes/pr/*/merge ブランチのHEAD

github.event.pull_request.base.sha

PR作成時のbaseブランチの最新コミット(用途がわからん、バグ?)

参照ごとに更新されるわけでも、baseブランチとheadブランチの共通の親コミットでもないので今回のユースケースに利用すべきではない

github.event.pull_request.head.sha

baseブランチの最新コミット、常に更新される

  • refs/remotes/pr/*/headブランチのHEAD

解決策

github.shaとbaseブランチ( github.event.pull_request.base.refからdepth: 1でとってくる)の2点を比較する

  • github.shaのマージブランチへのマージコミットの前後を比較する

実際のワークフロー

steps:
  # baseブランチの最新のコミットの取得
  # 公式のaction使った方が早いらしい
  # https://qiita.com/osakiy/items/0e18eee444446307b970
  - name: Fetch Base Branch Latest Commit
    uses: actions/checkout@v3
    with:
      ref: ${{ github.event.pull_request.base.ref }}
      fetch-depth: 1

  # マージブランチのチェックアウト(デフォはgithub.shaに向いてる)
  - name: Checkout Pull Request
    uses: actions/checkout@v3

  - name: Notice diff files
    id: skip-test
    run: |-
      diff=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }}..${{ github.sha }})
      echo "::notice diff: $diff"
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0