Github Actions Pull RequestでもSkipCIするやり方

Tweet

git push時にGithub Actionsでskip ciする方法は色々あるけど、Pull Requestに対しては見つからなかった。
ので、トライしてみました。

YAML

name: pull

on:
  pull_request:
    types: [assigned, opened, synchronize, reopened]

jobs:
  skipci:
    runs-on: ubuntu-18.04
    outputs:
      git_message: ${{ steps.save-message.outputs.GIT_MESSAGE }}
    steps:
      - name: Checkout Repo
        uses: actions/checkout@v1
      - run: git switch ${{ github.head_ref }}
      - id: save-message
        run: echo "::set-output name=GIT_MESSAGE::`git log --oneline -n 1`"
  test:
    runs-on: ubuntu-18.04
    needs: skipci
    if: contains(needs.skipci.outputs.git_message, '[skip ci]') == false
    steps:
      - run: echo "TEST"

実際の結果

何をしている?

pull_requestイベントで実行されるワークフローではコミットメッセージが取得できず、メッセージに含まれるskip ciを検知できませんでした。
なので,「チェックアウトして、最新のメッセージ持ってこよう」というパワープレイです、

jobs.skipci

Gitチェックアウトと最新のコミットメッセージ取得を行い、他のjobでも利用できるようにoutputsで設定します。

jobs.test

skip ci がコミットメッセージに含まれているとき、SKIPしたいjobです。
jobs.skipciで保存したgit_messageの中に、[skip ci]が含まれている場合はjobを実行しないという定義しています。

参考

https://qiita.com/peaceiris/items/28e302996ccf04551434
https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-syntax-for-github-actions#jobsjob_idoutputs