Closed17

【github actions】毎日定時にscrapboxへ投稿した記事の数を出力する機能をつくる

not75743not75743

モチベーション

  • 毎日(おそらく)増える数字を見て、インプット/アウトプットへのやる気を出すため
  • github actionsの勉強になる
    • ワークフローをcronのように定期実行できるようになる
    • slackに投稿して毎日確認できる
  • 自動的にgithubに草を生やせる(小声)
    • 毎日githubにpushする強い人に擬態できる
not75743not75743

要件

項目
開発環境 vscode devcontainer(ubuntu 22.04)
githubリポジトリ 新規作成するしたもの
実行基盤 github actions
使う言語 (予定) bashスクリプト
実行頻度、日時(予定) 毎日AM5:00

機能要件

  • 筆者のscrapboxプロジェクトのページ数を毎日5:00に集計する
  • そのページ数をリポジトリ内のREADME.mdに書き込む
  • 処理が完了したらslackにページ数と、成功の旨を通知する
  • 処理が失敗したらslackに失敗の旨を通知する
not75743not75743

scrapboxプロジェクトのページ数を知る

APIが提供されているため、それを使用する。
以下はscrapboxサポートページのページ数をcurlで出力する様子

$ curl -s https://scrapbox.io/api/pages/help-jp/search/titles | jq '.[].title' | wc -l
108

108ページあることがわかる

not75743not75743

README.mdの編集

  1. チェックアウトでリポジトリを持ってくる
  2. READMEを編集する
  3. pushする

これでいけそう

リポジトリへpushするやり方を調べればいいですね

not75743not75743

ワークフローからリポジトリへpushする方法

自身が使用しているものと同じユーザとメールアドレスを使用する。
botだったり、いろいろと選択肢があるみたい
https://qiita.com/thaim/items/3d1a4d09ec4a7d8844ce#:~:text=emailに action%40github.com,actions-userとしてコミットできる。

ということでこんな感じにした

count-scrapbox-pages.yaml
      - 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
not75743not75743

日付を出せるようにして、コードはこんな感じになった

count-scrapbox-pages.yaml
      - 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

not75743not75743

コードをこんな感じにする

count-scrapbox-pages.yaml
      - 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
not75743not75743

cronの実行はUTCです

自動テストOK!!
...14時に通知来たけど...

count-scrapbox-pages.yaml
on:
  schedule:
    - cron:  '0 20 * * *'

5時に投げたい場合、9をひいて20時に投げるように設定して再挑戦

not75743not75743

環境変数を設定したstepでは、その環境変数にアクセスできない

ということがあったので、zennの記事で公開した
https://zenn.dev/not75743/articles/36060b6ad62abb

誤っていたのは以下

count-scrapbox-pages.yaml
        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を分ければよい

count-scrapbox-pages.yaml
      - 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
not75743not75743

小ネタ

workflowの実行は日本時間でも、githubの草が生えるのは次の日でした。
現時点のコミット履歴は

草を見ると

と1つ分少なくなっています。
scheduleで実行された場合、次の日に反映されるのでしょうか

このスクラップは2023/02/18にクローズされました