GitHub Actionsで実行中のworkflowを自動的にキャンセルする

私の周りのプロジェクトでは、最近Circle CIのテスト実行や自動デプロイをGithub Actionsに置き換える動きが盛んになっています。

しかし、どんどんと置き換えて、ワークフローを際限なく動かしていたら、気がつかない間に結構な費用負担になっていました。。。Github Actionsのドキュメントを見ると、時間単位で課金されるようだったので、新しいワークフローが実行された時、古いワークフローは自動キャンセルされるようにしてみました。

以下のように2回連続でworkflowを動くと、古い方は自動的にキャンセルされます。

f:id:moritamorie:20200616221730p:plain

Circle CI等他のCIサービスではデフォルトでキャンセルされるようになっていますが、Github Actionsはまだその機能はデフォルトではありません(2020/6/16時点)ので、自動キャンセル専用のアクション(workflow-run-cleanup-action)を追加します。

設定方法

.github/workflows/***.ymlworkflow-run-cleanup-actionを追加します。

on:
  push: []
  jobs:
    cleanup-runs:
      runs-on: ubuntu-latest
      steps:
      - uses: rokroskar/workflow-run-cleanup-action@master
        env:
          GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
    ...
    other-jobs:
      〜〜〜

今のところ ubunut-latestのみサポートされているようなので、今後 windows-latest, macos-latestといった他の環境もサポートもされると良いなぁと思っています。(そっちの方がお高いので。。)

補足

コミットに[skip ci]をつけて、workflowのジョブ自体動かないようにすると、よりworkflowの実行時間を削減できそうです。 2021/2/8に公式で[skip ci]がサポートされました。

github.blog

gh-build-cancellerというのもあるらしい

別のアクションでgh-build-cancelerというのもあるようなのですが、今のところスター数が少ないので、私は workflow-run-cleanup-actionの方を使うようにしています。今後こっちの方が人気が出てきたり、機能拡張の状況がよかったりしたら乗り換えるかもしれません。

GH actions stale run canceller · Actions · GitHub Marketplace · GitHub

参考