nikkie-ftnextの日記

イベントレポートや読書メモを発信

GitHub Actionsをスケジュールで起動する 〜すでにイベントで構成されているところにscheduleを追加して知ったこと〜

GitHub Actionsの小ネタです。
crontabのようにスケジュールで起動する方法を知りました。

目次

スケジュールで起動するGitHub Actions

transformersにfix typoプルリクエストを出した1折、

毎夜GitHub Actionsのfail通知が届くようになりました。
fix typoとは全然関係ない箇所だったので特に調査はしていないのですが、「GitHub Actionsって定期実行できるのかなあ」と記憶に残りました

今回のエントリ執筆にあたって確認したところ、定期実行の設定がされていました。
https://github.com/huggingface/transformers/blob/v4.42.3/.github/workflows/doctests.yml#L8-L9

設定の背景:sphinx-new-tab-linkリポジトリにて

先日0.5.0をリリースしたsphinx-new-tab-link

この中でローカルではテストが通ったが、GitHub Actionsで落ちるという事象を経験しました。
原因はSphinxのマイナーバージョン違い。

ImportError: Error importing plugin "sphinx.testing.fixtures": No module named 'defusedxml'

7.3.7では defusedxml の依存が optional-dependencies の test に指定されています。
https://github.com/sphinx-doc/sphinx/blob/v7.3.7/pyproject.toml#L97

sphinx-new-tab-linkではpip install Sphinx[test]のようなインストールはしていないので、defusedxmlがインストールされていなくてImportErrorになるわけですね2

この事象の再発防止がなにかできないか(Sphinxのバージョンが上がった時点で気づけたんじゃないか?)と考えたときに、「GitHub Actionsは定期実行できるのでは」と思い出したのです。

GitHub Actionsのスケジュールの設定

ドキュメントより
https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#schedule

on:
  schedule:
    - cron: "15 4,5 * * *"

schedule イベントを使うと、スケジュールした時刻にワークフローをトリガーできます。

ワークフローを特定の UTC 時刻に実行するように、POSIX cron 構文でスケジュールすることができます。

cron構文については、crontab guruというサイトを知りました。

crontab guru を使うと、cron 構文の生成および実行時間の確認に役立ちます。

cron構文の読み方を教えてくれます(パッと分からない身なので大助かり!)。
例のスケジュールは「At minute 15 past hour 4 and 5.」だそうです。
毎日4時15分と5時15分ですね

1つのワークフローには複数のscheduleをもたせられるそうです

on:
  schedule:
    - cron: '30 5 * * 1,3'
    - cron: '30 5 * * 2,4'

複数のonにscheduleを加えるには?

onにscheduleを書けばよいと分かったのですが、小さな壁がありました。
すでにonに複数書いています。

# https://github.com/ftnext/sphinx-new-tab-link/blob/57db12c751dd9f9f15ed97bf97fdbb01720515a3/.github/workflows/testing.yml#L3
on: [push, pull_request]

onに他のイベントが指定されている中で、scheduleを追加するにはどうすればよいのでしょう?

ドキュメント「アクティビティの種類とフィルターを複数のイベントと共に使用する」
https://docs.github.com/ja/actions/using-workflows/triggering-a-workflow#using-activity-types-and-filters-with-multiple-events

on:
  label:
    types:
      - created
  push:
    branches:
      - main
  page_build:

こちらを参考に以下のようにしました https://github.com/ftnext/sphinx-new-tab-link/commit/ac25d29fe4bb812bd15ff3aacb6dc96932f83a2c

on:
  push:
  pull_request:
  schedule:
    - cron: '0 9 * * 1'

ドキュメント「イベントを使ってワークフローをトリガーする」によると

  • 単一のイベント
on: push
  • 複数のイベント

    • sphinx-new-tab-linkの当初の設定です
  • 複数のイベントを構成する場合、ここで示した書き方

    • 構成しないイベントも含め、すべてのイベントにはコロン (:) を追加する必要があります。

終わりに

今回得た知見をまとめます。

  • GitHub Actionsはスケジュールで起動できる(onにscheduleイベントを指定)
  • scheduleイベントはcron構文で構成する。cron構文の読み解きにはcrontab guruが便利
  • onに複数のイベントを指定する場合は、すべてのイベント末尾にコロンを追加(これでscheduleイベントにcron構文を書ける)

  1. マージされたので、transformersのコントリビューターです✌️
  2. 執筆時の最新は7.3.7ですが、修正プルリクエストがマージ済みなので、この次のリリースで解消されると思われます