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
は無敵の権限が渡されているわけではない。
- [GitHub]secrets.GITHUB_TOKEN で実行できる権限について簡単ながらマッピングしてみた | DevelopersIO
- Automatic token authentication - GitHub Docs
今回は 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.