LoginSignup
56
30
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【GitHub Actions】GitHubの草を生やしてない日はLINEに通知を送ろう

Last updated at Posted at 2024-06-13

はじめに

こんにちは、kenです。
みなさんGitHubの草生やしてますか?草がたくさん生えている人のプロフィールってなんだか圧倒されるものがありますよね!

かくいう私はというと....全然生えてないです!!!!(ズコー)

スクリーンショット 2024-04-14 20.29.07.png

「俺も草がびっしり生えた人になりたい...!!」

「でもいつも忘れて草が途切れてしまう...。」

「それなら一日の終わりに草が生えてなかったら通知を送るようにすればいいんじゃね?」

こう考えたのが今回の記事のきっかけです。
LINEのAPIとGitHub Actionsを使って毎晩22時に草が生えてなかったらLINEの通知を送るようにしてみます。

手順

以下の3ステップからなります。

  1. LINE Notifyでトークンの取得
  2. GitHubのリポジトリに取得したトークンを追加
  3. GitHub Actionsのワークフローを作成

1. LINE Notifyでトークンの取得

LINE Notifyにログインし、マイページの「トークンを発行する」を押下します。

スクリーンショット_2024-04-13_9_28_33.png

適当にトークン名を入力し、「1:1でLINE Notifyから通知を受け取る」を選択してトークンを発行します。

スクリーンショット_2024-04-13_9_31_35.png

発行されたトークンをコピーしてこの画面は閉じます。
スクリーンショット_2024-04-13_9_33_51.png

2.GitHubのリポジトリに取得したトークンを追加

リポジトリを新規作成します。
「Settings」→「Secrets and variables」→「Actions」の「New repository secret」から先程取得したトークンを設定します。
トークンの名前は何でもいいですが、ステップ3で紹介するコード内ではLINE_TOKENという名前でこのトークンを参照する実装になっているので、特にこだわりがない方はLINE_TOKENで設定するといいと思います。
スクリーンショット_2024-04-13_9_42_56.png

3.GitHub Actionsのワークフロー作成

ローカルで適当なディレクトリを作成し、git initして先ほど作ったリモートリポジトリとローカルのリポジトリを連携します。
そして以下のyamlを.github/workflows配下に保存します。

草が生えていない場合に送るメッセージの文章は各自好きなものに変えてください。

name: Check GitHub Contributions and Notify

on:
  schedule:
    - cron: "0 13 * * *" # UTC時間で毎日13時(日本時間で22時)に実行

jobs:
  check-and-notify:
    runs-on: ubuntu-latest
    steps:
      - name: Check for Contributions on Main and Master Branches
        id: check_contributions
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          DATE=$(date -u +"%Y-%m-%dT00:00:00Z")
          USERNAME="${{ github.repository_owner }}"
          QUERY="{\"query\": \"query { user(login: \\\"$USERNAME\\\") { contributionsCollection(from: \\\"$DATE\\\", to: \\\"$DATE\\\") { commitContributionsByRepository { repository { name, defaultBranchRef { name } } contributions(first: 100) { totalCount } } } } }\"}"

          RESPONSE=$(curl -H "Authorization: bearer $GITHUB_TOKEN" -H "Content-Type: application/json" -d "$QUERY" https://api.github.com/graphql)
          echo "Response: $RESPONSE"
          MAIN_COUNT=$(echo $RESPONSE | jq '[.data.user.contributionsCollection.commitContributionsByRepository[] | select(.repository.defaultBranchRef.name == "main") | .contributions.totalCount] | add // 0')
          MASTER_COUNT=$(echo $RESPONSE | jq '[.data.user.contributionsCollection.commitContributionsByRepository[] | select(.repository.defaultBranchRef.name == "master") | .contributions.totalCount] | add // 0')
          TOTAL_COUNT=$(($MAIN_COUNT + $MASTER_COUNT))

          echo "Total contributions to main and master: $TOTAL_COUNT"
          echo "CONTRIBUTIONS_COUNT=$TOTAL_COUNT" >> $GITHUB_ENV

      - name: Send LINE Notification if No Contributions
        if: env.CONTRIBUTIONS_COUNT == '0'
        env:
          LINE_TOKEN: ${{ secrets.LINE_TOKEN }}
          MESSAGE: "まもなく今日が終わりますがまだGitHubの草が生えてません!今すぐ草を生やしましょう!"
        run: |
          curl -X POST -H "Authorization: Bearer $LINE_TOKEN" -F "message=$MESSAGE" https://notify-api.line.me/api/notify

ここではGitHubのAPIを叩いて本日中のコミットの中にmainまたはmasterブランチへのコミットがあるかを確認し1、なかったらLINE NotifyのAPIを叩いています。

GitHubの草が生える条件はGitHub Docsによると

プロフィールページでは、特定のアクションがコントリビューションとしてカウントされます:

  • リポジトリの既定のブランチまたは gh-pages ブランチへのコミット
  • ブランチの作成
  • イシューのオープン
  • ディスカッションをオープンすること
  • ディスカッションに回答すること
  • プルリクエストを提案すること
  • pull request レビューの送信

とのことですが、ワークフロー内でこれらすべてを確認するのは大変なので、ここでは最も代表的と思われる「リポジトリの既定のブランチへのコミットが本日中に行われたか」をチェックしています。12

あとはこのyamlをgit pushしたら準備完了。毎日22時にこのワークフローが動くのでもし草を生やしてなかったら通知が来るはずです。3とても簡単に設定できました。

スクリーンショット 2024-06-11 22.49.44.png

image.png

さいごに

こういった記事すでにあるかなと思ったんですが、意外になかったので書いてみました。GitHub Actionsはたまにしか触らないんですが、特に難しいこともなく設定できました。ちょっとしたことでも日常をハックできると嬉しいですね。
間違いなどあればコメントにてご指摘ください、最後まで読んでいただきありがとうございました。

今回作ったリポジトリへのリンクも置いておきます。

P.S.

この記事の執筆とbotの作成は2ヶ月前に行ったことなんですが、あれから草を生やす習慣がついてきました。通知が来たら無理にでもなにか1つコミットするようにしています...w

スクリーンショット 2024-06-06 22.01.13.png

  1. 既定ブランチがmainやmaster以外の名前の可能性もありますが、あまりそういうケースはないだろうということで無視しています。 2

  2. GitHubのデフォルトの設定では、プライベートリポジトリへのコミットはコントリビューションとしてカウントされません。しかし、上記のyamlの設定ではプライベートリポジトリのコミットもコントリビューションとして含めています。プライベートリポジトリのコミットをコントリビューションとして含めるようにするには、GitHubの設定を変更する必要があります。具体的には、「Settings」→「Include private contributions on my profile」のオプションにチェックを入れることで設定できます。

  3. ただし22時ピッタリに来ることは少なく、少し後ろにずれるみたいです。

56
30
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
30