GitHub Actionsの小ネタです。
crontabのようにスケジュールで起動する方法を知りました。
目次
- 目次
- スケジュールで起動するGitHub Actions
- 設定の背景:sphinx-new-tab-linkリポジトリにて
- GitHub Actionsのスケジュールの設定
- 複数のonにscheduleを加えるには?
- 終わりに
スケジュールで起動する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 イベントを使うと、スケジュールした時刻にワークフローをトリガーできます。
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構文を書ける)