5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Webhook を駆使して GitHub Actions で Discord に通知を送る

Last updated at Posted at 2025-12-24

はじめに

本記事は小規模コミュニティや学生サークルなど「人手はないが GitHub は使っている」組織に向けた記事です。

GitHub Actions は主に CI/CD 用途で使われることが多いです。一方でコミュニティ運営の自動化にも転用可能だと考え、実際に使用した事例を紹介します。

なお今回紹介する手法は GitHub Actions × Webhook なので、Discord に限らず Slack など他のツールでも実践可能です。

背景

私はインディーゲーム開発などを行うクリエイティブサークルを主催していて、Discord コミュニティ上で定期的なミーティングを行っています。今まではそのミーティングの前日にリマインド通知を手動で行っていたのですが、基本的に決まった曜日に実施しているため、自動化を考えました。

Discord の Webhook を用いた通知としては IFTTTZapier などが代表的ですが、いくつか欠点があるように感じます。

まずはそもそも使うサービスを増やしたくありません。管理自体が面倒であるため、用いるサービスは少ない方が運用コストが低いです。

また資金豊富な組織ではなかったため、安く抑えたいというのも重要なポイントでした。サークルメンバー全員で管理できて、期間の制限なく無料で利用できることが望ましいです。

それらの条件を満たす手段として GitHub Actions を選択しました。

実装例

確実に GitHub Actions の無料枠 (実行時間・実行回数) に収めたいという方針で実装しました。GitHub Actions 自体は今後の活動でも利用する可能性が高いため、なるべく使用量は削減しておきたいと考えたからです。

実行時間の短縮を優先した結果、bash を採用しています。通知用途であれば bash + curl でも十分実用に耐えますが、好みやチーム事情で Node.js や Python などを採用しても問題ありません。

リポジトリ構成は下記の通りです。

meeting-bot リポジトリ
.
├── 📁 .github
│   └── 📁 workflows
│       └── 📄 meeting_notification.yml
└── 📄 notify.sh
meeting-bot/.github/workflows/meeting_notification.yml
name: Meeting Notification

on:
  schedule:
    # 毎週金曜日の18:00 (UTC+9) に実行
    - cron: "0 9 * * 5" # UTC時間で9時 = 日本標準時だと18時
  workflow_dispatch:

jobs:
  send-notification:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Make script executable
        run: chmod +x ./notify.sh

      - name: Send Discord notification
        env:
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
        run: ./notify.sh
meeting-bot/notify.sh
#!/bin/bash

# 環境変数が設定されているか確認
if [ -z "$DISCORD_WEBHOOK_URL" ]; then
  echo "Error: DISCORD_WEBHOOK_URL is not set"
  exit 1
fi

WEBHOOK_URL="${DISCORD_WEBHOOK_URL}"

# OS判定とそれに応じた日付取得方法の分岐
if [[ "$(uname)" == "Darwin" ]]; then
  # macOS (ローカルテスト用)
  TOMORROW=$(TZ=Asia/Tokyo date -v+1d "+%m/%d")
  DOW=$(TZ=Asia/Tokyo date -v+1d "+%w")
else
  # Linux (GitHub Actions)
  TOMORROW=$(TZ=Asia/Tokyo date -d "tomorrow" "+%m/%d")
  DOW=$(TZ=Asia/Tokyo date -d "tomorrow" "+%w")
fi

# 曜日の配列を定義
WEEKDAYS=("日" "月" "火" "水" "木" "金" "土")
# 数値から日本語の曜日に変換
JP_DOW=${WEEKDAYS[$DOW]}
# 日付文字列を組み立て
DATE_STR="${TOMORROW}(${JP_DOW})"

# 16進数カラーコード #e9546b を10進数に変換
COLOR_HEX="e9546b"
COLOR_DEC=$((16#$COLOR_HEX))

curl -X POST \
  -H "Content-Type: application/json" \
  -d @- "$WEBHOOK_URL" << EOF
{
  "content": "@everyone",
  "embeds": [
    {
      "title": "成果報告会",
      "url": "https://example.com",
      "color": $COLOR_DEC,
      "fields": [
        {
          "name": "🗓 ${DATE_STR}",
          "value": " ",
          "inline": true
        },
        {
          "name": "🕗 20時〜",
          "value": " ",
          "inline": true
        }
      ]
    }
  ]
}
EOF

このような実装で下記のようなリマインドを飛ばすことができます。

通知イメージ.png

細かなカスタマイズはシェルスクリプトに不慣れでも生成 AI を使えば十分対応可能です。ただし実行環境や無料枠の制約は AI とのやりとりから抜け落ちやすいので、意識しておくと良いと思います。

補足情報

Discord

Webhook の設定は下記のページを参照してください。

GitHub

meeting_notification.yml に含まれている secrets.DISCORD_WEBHOOK_URL は、リポジトリの Settings > Secrets and variables > Actions から登録します。

GitHub の Actions secrets and variables 画面

YAML に載せておきたくない環境変数などの情報 (今回の例だと Discord の Webhook URL) を隠しておくことができます。

注意点

GitHub Actions の schedule は遅延が発生しないことが保証されておらず、混雑状況によって前後します。体感では大体20分〜30分程度です。これを見越して時間を設定すれば、おおよそ狙った時間に通知ができます。

しかし、これは GitHub 側のリソース状況に依存するため、分単位の正確性が求められる用途には向きません。リマインドのような多少前後しても問題ない用途に活用するのがベストです。

おわりに

今回の例はリマインドでしたが、トリガーの条件を CI/CD の終了として結果を通知する使い方などもできると思います。

GitHub Actions は無料枠・利用規約が存在するため、高頻度実行や常時稼働用途には向きませんが、軽量かつ定期的なアクションであれば自動化のチャンスが隠れているかもしれません。

5
1
0

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
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?