えいむーさんは明日も頑張るよ

GitHub Actionsで定期実行しよう

価格

# GitHub Actions

当 HP では何度か GitHub Actions について触れているので、GitHub Actions ってなんぞっていう方はまずそっちを読むことをおすすめします。

価格

# 北米版 BD 販売予定リスト (opens new window)

せっかくなので成果物は先に載せておきます。

# 今後の展望

  • ソート機能
  • フィルタリング機能
  • 画像を表示したりとか

# 定期実行

GitHub Actions は様々なトリガーに対して Action を起こすことができます。たとえばコミットがプッシュされたときや、タグが付けられたときなどがあります。

GitHub Actions は Cron を利用して定期実行されます。

GitHub Actions の定期実行

Cron は本来は一分単位で実行が可能なのだが、GitHub Actions では最短五分あけないと実行されないようになっている。

負荷がかかるので当然だが、逆に言えば五分に一回実行できるのはありがたい。

# 定期実行の設定

GitHub Actions の実行内容は.github/workflows/***.ymlに記述します。

ymlのファイル名は何でもいいです。

name: Scheduled build # 名前は必須

on:
  schedule:
    - cron: "0 0 * * *" # 定期実行のコマンド

で、この定期実行のコマンドが若干ややこしいです。公式ドキュメント (opens new window)に設定例などがあるのですが、案の定英語なので日本語で軽く解説します。

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * *

要するに五つのパラメータで設定し、左から順に「分」「時間」「日」「月」「曜日」を指します。 更に四つのメタ文字があり、これでありとあらゆる表現が可能になります。

  • *
    • 任意の値
  • '
    • 区切り
  • -
    • 範囲
  • /
    • ステップ

# 定期実行コマンドの例

# 一日一回実行

これが一番使い所が多い気がします。

0 0 * * *   # 毎日00:00(UTC)に実行

UTC と JST

ここで注意すべき点は、GitHub Actions は UTC(協定世界時)で動いているので日本とは九時間の時差があります。

この書き方をすると日本では毎朝 09:00 に実行されることを覚えておきましょう。

# 一時間ごとに実行

0 * * * *   # 毎時0分に実行

30 * * * *  # 毎時30分に実行

こうかけば「分」が 0 になったタイミングで実行されます。このタイミングは一時間に一回だけです。

# N 分または N 時間ごとに実行

*/10 * * * *  # 10分置きに実行 -> 00, 10, 20, ... , 55

* */1 * * *   # 1時間置きに実行

この書き方をすると常に N 時 0 分, 10 分, 20 分, ... 50 分のタイミングで実行されます。5 分, 15 分のように微妙なタイミングで実行したい場合は、

05-59/10 * * * *  # 10分置きに実行 -> 05, 10, 15, 20, ... ,55

とする必要があります。

# YML を記述しよう

今回は以前の記事で紹介した RightStuf から北米版 BD の販売情報を取得するプログラムを考えます。

あれは Python で動作するので、GitHub Actions でも Python を実行する環境を与えます。

jobs:
  build:
    name: build
    runs-on: ubuntu-latest # Ubuntuを使えば基本的には問題ない
    steps:
      - uses: actions/checkout@v2 # おまじない

      - name: Setup Python # Pythonのセットアップ
        uses: actions/setup-python@v2
        with:
          python-version: "3.9" # Pythonのバージョン指定

      - name: Install dependencies # 依存パッケージのインストール
        run: |
          python -m pip install --upgrade pip
          pip install requests

      - name: Run right.py # PythonでRigthStufからデータ取得
        run: |
          python right.py

      - name: Commit and Push # 実行結果をプッシュしてレポジトリに反映
        run: |
          git config --local user.email "XXXXXXXXXXXX" # メールアドレスを設定 
          git config --local user.name "XXXXXX" # ユーザ名を設定
          git add .
          git commit -m "ZZZZZZZZZZ" # コミットメッセージを記述
          git pull
          git push origin master

これがテンプレートで Python を実行したいのであればこの書き方で問題ありません。

こうしておけば、一日一回実行され、そのときにright.pyが新しいファイルを作成してその内容が自動的にプッシュされ、プッシュされることで Netlify の自動ビルドが始まるという仕組みです。

GitHub のプッシュについて

今回の例でいうとpython right.pyのコマンドで新規ファイルまたはファイルに変更がないとgit commitのときに「変更点がないよ」と怒られてしまう。

何らかの差分が生じるようなコードにしよう。

# デプロイ

ひょっとしたら GitHub Actions の Push は自動で検知してくれないかもしれないので、一応 Netlify へのデプロイも含めたコードの紹介をしておきます。

Netlify へのデプロイをビルド時間 0 で行うための GitHub Actions (opens new window)の内容が大変参考になるので、こちらを読んでください。

記事は以上。

価格

価格
    えいむーさんは明日も頑張るよ © 2021