毎週自動で動かす|GitHub Actions の決まった時刻と、手で動かすボタン

コース6 API編 9 / 13・読む時間 約10分・最終確認日

いまは無料で公開中です

このレッスンの要点

  • 毎週の自動実行は、GitHub Actions の schedule で書きます。時刻は、はじめの設定では UTC(日本時間より9時間前)です
  • workflow_dispatch も足しておくと、GitHub の画面のボタンで、いつでも手で動かせます
  • APIキーは、リポジトリの Secrets に入れて使います。ファイルには書きません

GitHub Actions で、決まった時刻に動かす

は、GitHub の上で、決まった時刻やボタンを押したときに手順を動かすしくみです。手順は、リポジトリの .github/workflows/ に置く YAML のファイルに書きます。

いちばん上の「いつ動くか(on)」に、schedule(決まった時刻)と workflow_dispatch(手で動かすボタン)を書きます。時刻は cron という形で、「分 時 日 月 曜日」の5つを空白で区切って書きます。

on:(いつ動くか)
 schedule:
  - cron: "17 21 * * 0" ← 毎週日曜 21:17(UTC)
 workflow_dispatch: ← 「Run workflow」のボタンで手でも動かせる
日本時間は UTC より9時間進んでいるので、日曜 21:17(UTC)は月曜 6:17(日本時間)です。

公式によると、混んでいるときは schedule が遅れることがあり、とても混んだときは動かないこともあります。毎時0分ちょうどは特に混みやすいので、分をずらすようすすめています。上の例で「17分」にしているのはそのためです。動かなかった週は、あとで「Run workflow」で手で動かします。schedule が動くのは、既定のブランチ(ふつうは main)に置いたファイルだけです。

時刻は、はじめの設定では UTC です。公式によると、タイムゾーンを指定して、日本時間で書くこともできます。UTC に直すのがむずかしければ、依頼文に「日本時間の月曜 6:17 で、タイムゾーンを指定して書いて」と頼んでもかまいません。

APIキーは Secrets に入れる

ワークフローで Claude API を使うには APIキーが要ります。キーはファイルに書かず、リポジトリの Secrets に入れます。Settings → Secrets and variables → Actions →「New repository secret」で、名前と値を入れます。

1この自動のしくみ専用のキーを Console で作る
2GitHub の Secrets に ANTHROPIC_API_KEY として入れる
3ワークフローでは、使うステップだけに環境変数として渡す
Secrets の値は、ログでは伏せ字になります。ただし公式は、それも絶対ではないとしています。ログにキーを出す書き方はしません。

キーをこの用途専用に分けておくと、漏れたときに止めるのも、使った量を見分けるのもかんたんです。もう使わなくなったら、Secrets から消すだけでなく、Console でキーも削除します。

中身は Claude Code に書いてもらう

ワークフローの中でやることは、先週の CSV があるかを確かめてから、これまでのレッスンで作った3つのプログラムを順に動かして、できたファイルをリポジトリに保存(コミットして push)することです。この中身も、Claude Code に書いてもらいます(下の「やってみよう」の依頼文)。

0先週の CSV があるか確かめる(なければ止まる)
1rank.mjs(順位を計算)
2write.mjs(Claude が紹介文。ここだけキーを渡す)
3make-page.mjs(draft: true のファイル)
4コミットして main と preview に push。どこかで止まったら push しない
「止まったら push しない」を必ず入れます。まちがった下書きが残らないようにするためです。

コミットするのは、下書きの md だけではありません。順位の JSON(data/ranking/)と紹介文の JSON(data/draft/)も入れます。ワークフローは毎回まっさらな場所で動くので、push しなかったファイルは、次に動く公開のワークフロー(レッスン10)からは見えないからです。

同じコミットを preview というにも push すると、Cloudflare Pages がそのブランチ用の確認用のページを作ります。レッスン8の作りで、このページにだけ下書きが出ます。

できたら GitHub の Actions の画面で「Run workflow」を押し、手で1回動かして確かめます。公開リポジトリでは、60日間リポジトリに動きがないと schedule のワークフローが自動で止まります。止まっていたら、同じ画面の「Enable workflow」で戻します。

サイトの作り直しを確かめる

Cloudflare Pages を GitHub とつないでいれば、ふつうは push で自動で作り直されます。ただし公式によると、ワークフローの中の標準の鍵(GITHUB_TOKEN)で push したときは、ほかのワークフローは動きません。Cloudflare Pages がどう反応するかは公式に書かれていないので、はじめて動かしたら、Cloudflare のデプロイの一覧で作り直されたかを確かめましょう。

作り直されていれば
そのままで大丈夫
作り直されていなければ
Cloudflare の Deploy hook(作り直し用の URL)を、ワークフローの最後で呼ぶ
Deploy hook の URL は、だれでも作り直しを起こせる鍵です。Secrets に入れて、APIキーと同じように扱います。
よくある勘違い

「時刻を書けば、その時刻ぴったりに動く」とはかぎりません

7:00 ちょうどに公開される前提で作る
公式は、混んでいるときは schedule が遅れることがあり、とても混んだときは動かないこともあると書いています
余裕をもった時刻に、ずらして置く
公式は、毎時0分ちょうどは混みやすいので、分をずらすようすすめています

やってみよう

  1. Claude Console で、この自動のしくみ専用の APIキーを作ります(レッスン2。名前は cat-ranking-weekly など)
  2. GitHub のリポジトリの Settings → Secrets and variables → Actions → New repository secret で、名前 ANTHROPIC_API_KEY にキーを入れます
  3. 下の依頼文を Claude Code に送って、ワークフローのファイルを作ってもらいます
  4. 先週の CSV(レッスン6)が data/views/ に push されていることを確かめます(レッスン6の見本の CSV で練習するときは、ファイル名を先週の月曜の日付に変えてから push します。日付が先週でないと、ワークフローは止まります)
  5. push したら、GitHub の Actions の画面で、そのワークフローの「Run workflow」を押して、手で1回動かします
  6. 下書きのファイルができたこと、Cloudflare Pages のデプロイの一覧で main と preview の2つが作り直されたことを確かめます
ワークフローの「いつ動くか」の部分(.github/workflows/ranking-draft.yml の上のほう)on: schedule: - cron: "17 21 * * 0" workflow_dispatch:
ワークフローを作ってもらう依頼文(Claude Code に).github/workflows/ranking-draft.yml を作って。いつ動くかは「毎週日曜 21:17(UTC)=月曜 6:17(日本時間)」の schedule と、手で動かす workflow_dispatch。中でやることは、Node と必要なパッケージを入れてから、まず data/views/ のいちばん新しい CSV の名前の日付が、日本時間の今日から数えて7〜13日前の月曜(先週の CSV)かを確かめ、ちがえば理由を出して止める。そのあと scripts/rank.mjs → scripts/write.mjs → scripts/make-page.mjs の順に動かして、できた下書きの md と、data/ranking/・data/draft/ にできた JSON をコミットして main に push し、同じコミットを preview というブランチにも push する(preview は上書きしてよい)。APIキーは secrets.ANTHROPIC_API_KEY を環境変数 ANTHROPIC_API_KEY として、write.mjs のステップだけに渡して。どれかのステップが止まったら、そこで終わりにして push しないで。permissions は「contents を write」だけにして

確認問題

Q1. 月曜の朝 6:17(日本時間)に動かしたい。cron の時刻は?
Q2. 公開リポジトリで、しばらく何も変更しなかったら、自動の実行が止まっていました。なぜ?
今日の練習

自分が「毎週この時刻に更新したい」と思う時刻を決めて、UTC に直して cron の形で書いてみましょう。

この記事の用語

コース6 API編の目次

  1. 1APIとは?アプリ版との違い
  2. 2APIキーの作り方と守り方
  3. 3料金の考え方と、使いすぎを防ぐ上限設定
  4. 4はじめての呼び出し
  5. 5全体像
  6. 6データを集める
  7. 7Claude に文章を書かせる
  8. 8記事ファイルにしてサイトに載せる
  9. 9毎週自動で動かす
  10. 10公開前のチェック
  11. 11メール配信とつなぐ
  12. 12料金と、失敗したときの備え
  13. 13実例:週次レポートの裏側