🎉

GitHub Actionsにおけるpaths(including/excluding)設定の試験結果

2024/07/21に公開

はじめに

  • GitHub Actionsにおいて、 on: pull_request の時に pathspaths-ignore を設定できます。一部のディレクトリやファイルをトリガーの対象とする場合のみや、一部のディレクトリやファイルをトリガーの対象とする場合のみ対象外とする場合は指定が簡単ですが、一部は対象一部は対象外の場合はやや難しい
  • 公式資料やウェブ上の資料を読んだけど、複雑なパターンの場合はどんな動きになるかなかなか詳細的に記載されている資料が見つからないため試験ベースで確認した結果をまとめて残したい

ポイント

negative pattern & positive pattern の組み合わせ

前提

  • positive pattern なしで negative pattern のみの指定ができない(構文エラーではなく無視される)。
    • 単純に全体から一部除外したい場合は negative pattern ではなく、paths-ignore を使ってください
    • 例:
      on:
        pull_request:
          paths:
          - '!dir-a/**'
      

試験結果

  • ①基本ルールは後勝ち。下記の公式資料の内容と一致する

    • A matching negative pattern (prefixed with !) after a positive match will exclude the path.
      A matching positive pattern after a negative match will include the path again.

  • ②path が被る項目は記載順を変更したら動きが変わる

    • 基本は後勝ちの前提と一致している
  • ③negative pattern は1個上の項目のみに対して除外するのではなく、上のすべての項目に対して除外する

  • ④path が被らない項目は記載順を変更しても動きが変わらない

    • これは正式資料も他の資料も記載がない(見つからなかった)
  • ⑤negative patternの前に除外対象 positive pattern が無い(あるいは前に設定があるけど path が被らない)場合は無視される

試験経過

  • ディレクトリ構成
.
├── README.md
├── animal
│   ├── cat
│   │   └── cat.txt
│   └── dog
│       ├── README.md
│       └── shibainu
│           └── taro.txt
├── plant
      └── tree.txt

①基本ルールは後勝ち

  • 期待: animal dir を対象としたいが、dog dir を対象外としたい(ただし、dog/shibainu dir を例外とする)。
  • workflow の書き方
pull_request:
    paths:
    - 'animal/**'
    - '!animal/dog/**'
    - 'animal/dog/shibainu/**'
  • 動作
    • animal/cat/tom.txt のみを編集して push すると workflow が実行される
    • animal/dog/README.md のみを編集して push しても workflow が実行されない
    • animal/dog/shibainu/taro.txt のみを編集して push すると workflow が実行される
    • 後勝ち

②path が被る項目は記載順を変更したら動きが変わる

  • 期待: animal dir を対象としたいが、dog dir を対象外としたい(dog/shibainu dir を前に入れると dog dir から除外できない)
  • 書き方
pull_request:
    paths:
    - 'animal/**'
    - 'animal/dog/shibainu/**'
    - '!animal/dog/**'
  • 動作
    • animal/cat/tom.txt のみを編集して push すると workflow が実行される
    • animal/dog/README.md のみを編集して push しても workflow が実行されない
    • animal/dog/shibainu/taro.txt のみを編集して push しても workflow が実行されない
    • 後勝ち
    • 'animal/dog/shibainu/**''!animal/dog/**' 位置を交換して動きが変わった

③negative pattern は1個上の項目のみに対して除外するのではなく、上のすべての項目に対して除外する

  • 期待:negative pattern の直前に path が被らない positive pattern を入れても OK。negative pattern は1個上の項目のみに対して除外するのではなく、上のすべての項目(の集合)に対して除外する
  • 書き方
pull_request:
    paths:
    - 'animal/**'
    - 'README.md'
    - '!animal/dog/**'
    - 'animal/dog/shibainu/**'
  • 動作
    • 上記①と同じ

④path が被らない項目は記載順を変更しても動きが変わらない

  • 期待:ルートの直下にある 'README.md' は animal dir と関係ないため、'README.md' を最初に入れる場合と最後に入れる場合と動きが変わらない
  • 書き方
pull_request:
    paths:
    - 'animal/**'
    - '!animal/dog/**'
    - 'animal/dog/shibainu/**'
    - 'README.md'
  • 動作
    • 上記③と同じ

⑤negative patternの前に除外対象 positive pattern が無い(あるいは前に設定があるけど path が被らない)場合は無視される

  • 期待:negative pattern の設定が無視される
  • 書き方
pull_request:
    paths:
    - 'README.md' # この設定を無くしても下記の動作確認結果が変わらない
    - '!animal/dog/**'
    - 'animal/dog/shibainu/**'
  • 動作
    • 'animal/dog/README.md' のみを追加する場合は実行されない(無視される)
    • 'animal/dog/shibainu/taro.txt' のみを編集すると実行される(ただの positive patternのため)
    • animal/cat/tom.txt のみを編集して push する場合 workflow が実行されない(positive pattern じゃないため)

参考資料

松の風

Discussion