created: 2022-11-12T14:14:40.880Z

GitHub Actions の cron で日報を push する実装をしたときのメモ

github-nippou というツールを使って、毎日の終わりに日記がわりにその出力をコミットするだけという実装を GitHub Action 上で動かしてみたが。「普段から使ってる人なら普通知ってることなんだろうなぁ」というところでことごとくハマったので、それぞれメモと参考リンクを残しておく。

diary.yaml

name: Diary Generator
on:
  schedule:
    - cron: "45 14 * * *"
  # workflow_dispatchがあるとでGitHubのUIから手動で実行できるようになる
  # https://qiita.com/chihiro/items/8b2918ceb709cb9079e8
  workflow_dispatch:
jobs:
  diary-generator:
    runs-on: ubuntu-latest
    env:
      GOBIN: "/usr/local/bin"
      # FIXME (日付の表記が期待通り動作しない)
      LC_ALL: "ja_JP.UTF-8"
      TZ: "Asia/Tokyo"
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
      - run: echo "${GOBIN}" >> $GITHUB_PATH
      - run: go install github.com/masutaka/github-nippou@latest
      - run: git config --global github-nippou.user myname
      - run: git config --global github-nippou.token ${{ secrets.FOR_ACTION_GITHUB_NIPPOU_GITHUB_TOKEN }}
      - run: git config --global github-nippou.settings-gist-id xxxxxxxx
      - run: github-nippou init
      - run: ./diary/add-today-diary.sh

add-today-diary.sh

#!/usr/bin/env bash
# http://redsymbol.net/articles/unofficial-bash-strict-mode/
set -euo pipefail
cd $(dirname $0)
readonly scriptname=$(basename ${0%.sh})

readonly tmpfile=$(mktemp)
echo $(date +"# %Y年%m月%d日(%a)") >> $tmpfile
github-nippou >> $tmpfile

readonly destfile=diary/$(date +"%Y/%m.md")
mkdir -p $(dirname $destfile)
cat $tmpfile >> $destfile

git config --global user.name myname
git config --global user.email 'xxxxxxxx@gmail.com'
git add $destfile
git commit -m "[GitHub Action] add diary $destfile"
git push origin master

GitHubAction ランタイムでの PATH の通し方

過去の仕様に脆弱性があったらしく、すこし前の記事だと動かない記述がのこっていたりする。

実行ファイルのパスを通すのには環境変数の設定以外の方法で行う。

今回だと go install で入れたツールにパスが通ってほしかったのでこのようなことをした。

echo "${GOBIN}" >> $GITHUB_PATH

go install で入れたツールのインストール先

GOBIN という環境変数で制御する。

env:
  GOBIN: "/usr/local/bin"

タイムゾーン

GitHub Action のランタイムだと、もちろんデフォルトでは UTC が設定されている。

github-nippouその日の GitHub のイベントをとってきてくれるツールなのでタイムゾーンは Asia/Tokyo にしておかないと期待通りに動作しない。

TZ: "Asia/Tokyo"

secrets.GITHUB_TOKEN でできないこともある

GitHub Action 上で使えるマジック変数の GITHUB_TOKEN は無敵の権限が渡されているわけではない。

今回は repo, gist という権限が必要だったが、GITHUB_TOKEN だと github-nippou が 401 になってしまったりしたので自前で払い出して secrets に埋めた。

GitHub Action の実行ログを verbose にする

この 2 つの特殊変数を secrets として登録するとログが詳細になって、実装時に試行錯誤がしやすくなる。

ACTIONS_RUNNER_DEBUG=true
ACTIONS_STEP_DEBUG=true

なぜ secrets として登録する実装になっているのかは不思議だった(yaml に設定できればいいような気もした)

commit/push をするときの git の設定

name, email は設定しないとダメ。

git config --global user.name myname
git config --global user.email 'xxxxxxxx@gmail.com'

GitHub Action の cron はまったく時間に正確でない

GitHub Action の cron をはじめてつかったので、動作確認で「指定した時刻にちゃんと動くかな」というのを試していたが、いっこうに動かないので設定ミスを疑ったり色々なおしたりしてしまったのだが、前提として GitHub Action の cron 機能は正確さを保証していないツールだった。

Note: The schedule event can be delayed during periods of high loads of GitHub Actions workflow runs.

ちなみに UTC 時刻での指定しかできないので、日本時間の hour から 9 引いた時間を設定する必要がある。

You can schedule a workflow to run at specific UTC times using POSIX cron syntax.