【github actions】毎日定時にscrapboxへ投稿した記事の数を出力する機能をつくる
モチベーション
- 毎日(おそらく)増える数字を見て、インプット/アウトプットへのやる気を出すため
- github actionsの勉強になる
- ワークフローをcronのように定期実行できるようになる
- slackに投稿して毎日確認できる
- 自動的にgithubに草を生やせる(小声)
- 毎日githubにpushする強い人に擬態できる
要件
項目 | 値 |
---|---|
開発環境 |
vscode devcontainer (ubuntu 22.04) |
githubリポジトリ |
新規作成する →したもの
|
実行基盤 | github actions |
使う言語 (予定) | bashスクリプト |
実行頻度、日時(予定) |
毎日 、AM5:00
|
機能要件
- 筆者のscrapboxプロジェクトのページ数を毎日5:00に集計する
- そのページ数をリポジトリ内の
README.md
に書き込む - 処理が完了したらslackにページ数と、成功の旨を通知する
- 処理が失敗したらslackに失敗の旨を通知する
scrapboxプロジェクトのページ数を知る
APIが提供されているため、それを使用する。
以下はscrapboxサポートページのページ数をcurlで出力する様子
$ curl -s https://scrapbox.io/api/pages/help-jp/search/titles | jq '.[].title' | wc -l
108
108ページあることがわかる
処理の定期実行
github actionsのschedule
をトリガーにワークフローを実行させることが可能
書き方はcronと同じである様子
毎日5時に実行の場合以下のようになりそう
on:
schedule:
- cron: '0 5 * * *'
README.mdの編集
- チェックアウトでリポジトリを持ってくる
- READMEを編集する
- pushする
これでいけそう
リポジトリへpushするやり方を調べればいいですね
ワークフローからリポジトリへpushする方法
自身が使用しているものと同じユーザとメールアドレスを使用する。
botだったり、いろいろと選択肢があるみたい
ということでこんな感じにした
- name: git setting and push
run: |
git config user.name ${{ secrets.GIT_USER }}
git config user.email ${{ secrets.GIT_EMAIL }}
git add .
git commit -m "update README.md"
git push origin main
ヨシ
日付を出せるようにして、コードはこんな感じになった
- name: generate README.md and get scrapbox pages
env:
TZ: 'Asia/Tokyo'
run: |
echo "# scrapboxのページ数" > README.md
curl -s ${{ secrets.SCRAPBOX_URL }} | jq '.[].title' | wc -l >> README.md
echo -n -e "\n" >> README.md
echo "# 出力時間" >> README.md
echo $(date +'%Y/%m/%d %H:%M:%S') >> README.md
- name: git setting and push
run: |
git config user.name ${{ secrets.GIT_USER }}
git config user.email ${{ secrets.GIT_EMAIL }}
git add .
git commit -m "update README.md"
git push origin main
slackに送信する
これのSLACK_MESSAGE
でページ数を通知できそう
workflowの成功・終了判定で使用している実績もあるため、インプットも楽
以下記事を参考に自由にメッセージ考えようともしたが、そこまでしなくてもいいかな...
複雑なメッセージになったら試してみる
コードをこんな感じにする
- name: generate README.md and get scrapbox pages
env:
TZ: 'Asia/Tokyo'
run: |
echo "# scrapboxのページ数" > README.md
echo "scrapbox_pages=$(curl -s ${{ secrets.SCRAPBOX_URL }} | jq '.[].title' | wc -l)" >> $GITHUB_ENV
echo "${{ env.scrapbox_pages }}" >> README.md
... 略 ...
- name: Slack Notification on Success
if: ${{ success() }}
uses: rtCamp/action-slack-notify@v2
env:
SLACK_TITLE: Deploy Success
SLACK_COLOR: good
SLACK_MESSAGE: "Scrapboxのページ数は${{ env.scrapbox_pages }} です:white_check_mark:"
- name: Slack Notification on Failure
if: ${{ failure() }}
uses: rtCamp/action-slack-notify@v2
env:
SLACK_TITLE: Deploy Failure
SLACK_COLOR: danger
- slackメッセージで利用するため、
$GITHUB_ENV
に格納して繰り返し使えるようにする -
rtCamp/action-slack-notify
を使用し、成功時にscrapboxのページ数を通知、失敗したらDeploy Failure
を通知します
手動実行テスト
次は自動的に実行されるかテスト
cronの実行はUTCです
自動テストOK!!
...14時に通知来たけど...
on:
schedule:
- cron: '0 20 * * *'
5時に投げたい場合、9をひいて20時に投げるように設定して再挑戦
環境変数を設定したstepでは、その環境変数にアクセスできない
ということがあったので、zennの記事で公開した
誤っていたのは以下
run: |
echo "# scrapboxのページ数" > README.md
echo "scrapbox_pages=$(curl -s ${{ secrets.SCRAPBOX_URL }} | jq '.[].title' | wc -l)" >> $GITHUB_ENV
echo "${{ env.scrapbox_pages }}" >> README.md <== ここで環境変数にアクセス不可
別のstepだったらアクセス可能なので、stepを分ければよい
- name: generate README.md and get scrapbox pages
run: |
echo "# scrapboxのページ数" > README.md
echo "scrapbox_pages=$(curl -s ${{ secrets.SCRAPBOX_URL }} | jq '.[].title' | wc -l)" >> $GITHUB_ENV
- name: edit README.md
env:
TZ: 'Asia/Tokyo'
run: |
echo "${{ env.scrapbox_pages }}" >> README.md
「The requested URL returned error: 403」エラー
以下のように出力され、リポジトリへのpushができなかった
The requested URL returned error: 403
以下参考にさせていただき解決
権限が足りていなかった...?要調査
permissions
の調査
以下にまとめた
今回は
jobs:
test:
permissions:
contents: write
で設定すればOK!
小ネタ
workflowの実行は日本時間でも、githubの草が生えるのは次の日でした。
現時点のコミット履歴は
草を見ると
と1つ分少なくなっています。
scheduleで実行された場合、次の日に反映されるのでしょうか
一段落のためクローズ
リポジトリは以下