📝

当月のGitHub Actionsの利用量を取得するアクションを作った

2023/05/28に公開

作ったもの

タイトルの通りですが、当月の GitHub Actions の利用量を取得するアクションを作りました!
https://github.com/keita-hino/get-billing-for-github-actions

GitHub Marketplace にも公開してます。
https://github.com/marketplace/actions/get-billing-for-github-actions

Slack Notify Action と一緒に使うと、スクショのように GitHub Actions の利用量を流せます。

きっかけ

GitHub Actions を利用できる上限はプランごとに決まっています。例えば、GitHub Free プランであれば、毎月 2000 分(Linux ランナー基準)までです。この上限に達した場合、次回のリセット日まで GitHub Actions のワークフローを動かせなくなります。(追加で課金すれば動かせる)
https://docs.github.com/ja/billing/managing-billing-for-github-actions/about-billing-for-github-actions#included-storage-and-minutes

GitHub Actions の利用量が一定の閾値を超えた場合、メールでお知らせしてくれるのですが、気づかず上限に達してしまうことがありました。その時は次回のリセット日が近い & ワークフローを動かせなくても特に問題なかったので、追加の課金はしませんでした。できるだけ追加の課金は避けたかったので、利用量を定期的に確認できる仕組みが欲しいと思い、今回紹介するアクションを作りました。

使い方

Get Billing for GitHub Actions アクションで取得できるもの

取得できるものは次の通りです。

名前 説明
included-minutes 使用中のプランで利用可能な上限
total-minutes-used 当月の利用量
usable-minutes 残りの利用量
days-left-in-billing-cycle 次回のリセット日までの日数

GitHub Actions の利用量を Slack に通知できるワークフローを追加する

例として、Slack Notify Action と組み合わせて、GitHub Actions の利用量を Slack に通知するワークフローを追加していきます。本記事では個人用アカウントで利用する場合の使い方について説明していきます。(Organization アカウントで使用する場合は README の Usage セクションを参照ください)

事前準備

後ほど、Slack へ通知するために Webhook の URL と Personal Access Token(以下、PATと呼びます) が必要になるので事前に準備しておきます。

Slack の Webhook URL を取得する

下記のリンクから Webhook URL を取得して、控えておいてください。
https://misoca-inc.slack.com/apps/A0F7XDUAZ--incoming-webhook-?tab=more_info

PAT を作成する

下記の画面に遷移し、『Generate new token』をクリックします。
https://github.com/settings/tokens?type=beta

すると、下記のような画面に遷移するので、Token name などを入力していきます。ここは任意の名前でOKです。

『Permissions』 セクションまでスクロールして、Plan のアクセスレベルを Read/only に変更します。

『Overview』セクションに Plan が追加されていることを確認し、『Generate token』ボタンをクリックします。

すると、生成された PAT が表示されるので、それを控えておきます。

PAT と Slack の Webhook URL をシークレットに追加する

ワークフローを追加するリポジトリのシークレットに先ほど取得した Slack の Webhook URL と PAT を追加します。具体的な設定方法については下記のドキュメントを参考にしてください。
https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository

ここでは、ACCESS_TOKEN というシークレットに PAT を、SLACK_WEBHOOK というシークレットに Slack の Webhook URL をそれぞれ設定してます。

ワークフローファイルを追加する

Slack に通知する下記のワークフローを追加します。

.github/workflows/get-billing-for-github-actions.yml
name: get-billing-for-github-actions

on: push

jobs:
  check-github-actions-usage:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3 # リポジトリをチェックアウト
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Get billing for GitHub Actions
        id: get-billing-for-github-actions
        uses: keita-hino/get-billing-for-github-actions@v0.1.0
        with:
          account-type: user
          github-token: ${{ secrets.ACCESS_TOKEN }}
      - name: Slack Notification
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
          SLACK_TITLE: 【当月】GitHub Actionsの利用量
          SLACK_USERNAME: GitHubレポート
          # 設定したいアイコンがあれば指定してください
          # SLACK_ICON: 
          MSG_MINIMAL: true
          SLACK_MESSAGE: > 
            現在使用しているプランの GitHub Actions の利用上限は `${{steps.get-billing-for-github-actions.outputs.included-minutes}}` 分です。
            当月の利用量は `${{steps.get-billing-for-github-actions.outputs.total-minutes-used}}` 分で残り `${{steps.get-billing-for-github-actions.outputs.usable-minutes}}` 分です。 
            次回のリセット日まで `${{steps.get-billing-for-github-actions.outputs.days-left-in-billing-cycle}}` 日です。

上記のワークフローファイルを push して、指定した Slack のチャンネルに下記のような通知されれば成功です🎉

(おまけ)毎週自動で通知する

GitHub Actions の schedule トリガーを使用して、毎週月曜日の10時ごろに通知できるよう修正します。(GitHub のドキュメントにもある通り、実行するタイミングが遅延する場合もあります)
https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#schedule

.github/workflows/get-billing-for-github-actions.yml
name: get-billing-for-github-actions

- on: push
+ on:
+   schedule:
+     # 分 時 日 月 曜日
+     - cron: '0 1 * * 1'

jobs:
  check-github-actions-usage:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3 # リポジトリをチェックアウト
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Get billing for GitHub Actions
        id: get-billing-for-github-actions
        uses: keita-hino/get-billing-for-github-actions@v0.1.0
        with:
          account-type: user
          github-token: ${{ secrets.ACCESS_TOKEN }}
      - name: Slack Notification
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
          SLACK_TITLE: 【当月】GitHub Actionsの利用量
          SLACK_USERNAME: GitHubレポート
          # 設定したいアイコンがあれば指定してください
          # SLACK_ICON: 
          MSG_MINIMAL: true
          SLACK_MESSAGE: > 
            現在使用しているプランの GitHub Actions の利用上限は `${{steps.get-billing-for-github-actions.outputs.included-minutes}}` 分です。
            当月の利用量は `${{steps.get-billing-for-github-actions.outputs.total-minutes-used}}` 分で残り `${{steps.get-billing-for-github-actions.outputs.usable-minutes}}` 分です。 
            次回のリセット日まで `${{steps.get-billing-for-github-actions.outputs.days-left-in-billing-cycle}}` 日です。

Discussion