はじめに
こんにちは、kenです。
みなさんGitHubの草生やしてますか?草がたくさん生えている人のプロフィールってなんだか圧倒されるものがありますよね!
かくいう私はというと....全然生えてないです!!!!(ズコー)
「俺も草がびっしり生えた人になりたい...!!」
「でもいつも忘れて草が途切れてしまう...。」
「それなら一日の終わりに草が生えてなかったら通知を送るようにすればいいんじゃね?」
こう考えたのが今回の記事のきっかけです。
LINEのAPIとGitHub Actionsを使って毎晩22時に草が生えてなかったらLINEの通知を送るようにしてみます。
手順
以下の3ステップからなります。
- LINE Notifyでトークンの取得
- GitHubのリポジトリに取得したトークンを追加
- GitHub Actionsのワークフローを作成
1. LINE Notifyでトークンの取得
LINE Notifyにログインし、マイページの「トークンを発行する」を押下します。
適当にトークン名を入力し、「1:1でLINE Notifyから通知を受け取る」を選択してトークンを発行します。
2.GitHubのリポジトリに取得したトークンを追加
リポジトリを新規作成します。
「Settings」→「Secrets and variables」→「Actions」の「New repository secret」から先程取得したトークンを設定します。
トークンの名前は何でもいいですが、ステップ3で紹介するコード内ではLINE_TOKEN
という名前でこのトークンを参照する実装になっているので、特にこだわりがない方はLINE_TOKEN
で設定するといいと思います。
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とても簡単に設定できました。
さいごに
こういった記事すでにあるかなと思ったんですが、意外になかったので書いてみました。GitHub Actionsはたまにしか触らないんですが、特に難しいこともなく設定できました。ちょっとしたことでも日常をハックできると嬉しいですね。
間違いなどあればコメントにてご指摘ください、最後まで読んでいただきありがとうございました。
今回作ったリポジトリへのリンクも置いておきます。
P.S.
この記事の執筆とbotの作成は2ヶ月前に行ったことなんですが、あれから草を生やす習慣がついてきました。通知が来たら無理にでもなにか1つコミットするようにしています...w
-
既定ブランチがmainやmaster以外の名前の可能性もありますが、あまりそういうケースはないだろうということで無視しています。 ↩ ↩2
-
GitHubのデフォルトの設定では、プライベートリポジトリへのコミットはコントリビューションとしてカウントされません。しかし、上記のyamlの設定ではプライベートリポジトリのコミットもコントリビューションとして含めています。プライベートリポジトリのコミットをコントリビューションとして含めるようにするには、GitHubの設定を変更する必要があります。具体的には、「Settings」→「Include private contributions on my profile」のオプションにチェックを入れることで設定できます。 ↩
-
ただし22時ピッタリに来ることは少なく、少し後ろにずれるみたいです。 ↩