Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
17
Help us understand the problem. What is going on with this article?
@peaceiris

GitHub Actions で Skip CI を実現する

追記: 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 を書いていた。)

17
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
peaceiris
Hugo ʕ◔ϖ◔ʔ や GitHub Actions について書いています。こっち https://peaceiris.com/ に引っ越しましたので、今後 Qiita への新規投稿はしませんが記事のメンテはします。
admin-guild
「Webサービスの運営に必要なあらゆる知見」を共有できる場として作られた、運営者のためのコミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
17
Help us understand the problem. What is going on with this article?