LoginSignup
34
17

More than 3 years have passed since last update.

GitHub Actions で Skip CI を実現する

Last updated at Posted at 2020-01-07

追記: 2021-02-09, GitHub Actions Runner の方で実装されたので、この記事の方法は役目を終えました。[skip cd] のように独自キーワードを定義したい場合には引き続きこの方法が使えます。 GitHub Actions: Skip pull request and push workflows with [skip ci] - GitHub Changelog


GitHub Actions でも CircleCI や Netlify みたいに [skip ci] を実現する方法を紹介します。

Workflow の例

結論から言うとこんな感じの Workflow を作ればできます。

name: Test

on: [push]

jobs:
  skipci:
    runs-on: ubuntu-18.04
    steps:
      - run: echo "[skip ci] ${{ contains(github.event.head_commit.message, '[skip ci]') }}"

  test:
    runs-on: ubuntu-18.04
    if: contains(github.event.head_commit.message, '[skip ci]') == false
    steps:

(2020-07-04 追記) 上の書き方が安定しています。下のような書き方もできますが、たまに上手くいかないケースに遭遇しました。

name: Test

on: [push]

jobs:
  skipci:
    runs-on: ubuntu-18.04
    outputs:
      is_skip: ${{ steps.is_skip.outputs.is_skip }}
    steps:
      - name: Set is_skip
        id: is_skip
        run: echo "::set-output name=is_skip::${{ contains(github.event.head_commit.message, '[skip ci]') }}"
      - run: echo "[skip ci] ${{ steps.is_skip.outputs.is_skip }}"

  test:
    runs-on: ubuntu-18.04
    needs: skipci
    if: ${{ ! needs.skipci.outputs.is_skip }}
    steps:
    ...

あとはコミットメッセージを ci: Add skip job [skip ci] とかにして Push すれば skip job だけが実行されるはずです。簡単にカスタマイズできるので好きな文字列をトリガーとして設定できます。[skip cd] (Continuous Deployment) とか?

skip job を入れておかないと Job が開始されません。(Job が一つだとダメということです。) 今の GitHub Actions の仕様だとこの回避策が必要みたいです。Private repository だと実行時間をなるべく節約したいので、これくらいは我慢します。

GitHub Actions で Skip CI を実現する方法

(2020-04-23 追記) スキップされた Job はちゃんとその旨がログとして表示されるようになりました。

Screen Shot 2020-04-23 at 18.24.36.png

ちなみに paths-ignore を設定すれば「変更が **.md のみであればその Workflow をスキップする」ことができるのであわせて仕込んでおくと良いでしょう。また、 paths という項目もあり、こちらは「 Dockerfile の変更に対してのみ Workflow を実行する」のように設定できます。

on:
  push:
    branches:
      - master
    paths:
      - 'Dockerfile'
    paths-ignore:
      - '**.md'

pull_request ではできません

この方法では pull_request event の時に commit の情報が取れないので Pull Request に対しては使えません。今のところ push event に対してのみ有効な方法です。

これに至るまでの経緯

GitHub Actions Beta v2 の頃から試行錯誤していて、昨日これに落ち着いた。GitHub Actions for GitHub Pages の custom commit message option を実装している時に head_commit を見つけて、そう言えば Skip CI を github.event.commits[0].message でやっていたことを思い出し、今は Job レベルの if がサポートされているおかげで昔よりすっきりした。(昔は Step ごとにこの if を書いていた。)

34
17
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
34
17