テストが落ちた時に、わざわざGitHub Actionsのログを深掘りしに行かなくても、Discord上で「何が原因で落ちたのか」がサクッとわかると開発効率が爆上がりしますよね。
単に「テスト失敗」と送るのではなく、ログファイルの直近10〜20行(エラーの核心部分)を抜き出して送信する実践的なワークフローを紹介します。
実装の戦略
- PHPUnitを実行する(結果を気にせず一旦通す設定か、標準のままでOK)。
- 失敗時のみ起動するステップを作る(
if: failure()を使用)。 - シェルコマンドでログファイルを加工する(
tailやsedでエラー箇所を抽出)。 - 抽出した内容を環境変数に入れてDiscordへ送る。
1. GitHub Actionsの設定 (.yml)
リポジトリの logs/app.log(Monologの出力先)を読み取る想定のコードです。
name: Test and Notify
on: [push]
jobs:
phpunit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# --- PHP環境構築 (省略) ---
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: \'8.4\'
- name: Install dependencies
run: composer install
# --- テスト実行 ---
- name: Run PHPUnit
run: vendor/bin/phpunit --display-errors # ログがファイルに出るように設定されている前提
# --- 【ここが肝】テスト失敗時のみログを抜粋して送信 ---
- name: Extract error logs and Notify
if: failure() # 前のステップ(テスト)が落ちた時だけ動く
env:
WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK }}
run: |
# 1. ログの末尾20行を取得し、Markdownのコードブロック形式にする
# ※ファイルパスは自身の環境(logs/app.logなど)に合わせてください
LOG_FILE=\"logs/app.log\"
if [ -f \"$LOG_FILE\" ]; then
ERROR_SNIPPET=$(tail -n 20 \"$LOG_FILE\")
else
ERROR_SNIPPET=\"Log file not found at $LOG_FILE\"
fi
# 2. Discord送信用のJSONを作成
# エラー内容を ``` で囲って見やすくする
PAYLOAD=$(cat <<EOF
{
\"embeds\": [{
\"title\": \"❌ PHPUnit Test Failed!\",
\"color\": 15548997,
\"description\": \"最新のログ抜粋:\n\`\`\`text\n${ERROR_SNIPPET}\n\`\`\`\",
\"fields\": [
{ \"name\": \"Repository\", \"value\": \"${{ github.repository }}\", \"inline\": true },
{ \"name\": \"Branch\", \"value\": \"${{ github.ref_name }}\", \"inline\": true }
]
}]
}
EOF
)
# 3. DiscordにPOST
curl -H \"Content-Type: application/json\" -X POST -d \"$PAYLOAD\" \"$WEBHOOK_URL\"
2. ログをより「凝った」ものにする工夫
上記のスクリプトをさらに改善するためのTipsです。
ログの肥大化対策
テストが大量にある場合、ログファイルが巨大になり、Discordのメッセージ制限(2000文字)に引っかかることがあります。
tail -n 20のように行数を絞る。grep -A 5 "ERROR"のように、”ERROR”という文字列が出てきた周辺だけを抜き出すようにgrepを挟むとより正確です。
リンクを付けて直接ジャンプ
"description" 内に GitHub Actionsの実行ページへのリンクを添えると、詳細確認への動線がスムーズになります。
\"description\": \"[こちらからログ全文を確認できます](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})\"

MEO(Map Engine Optimization)
2階立地という物理的ハンデを克服し、MEO(マップ検索最適化)で集客を最大化する具体策を解説。Googleビジネスプロフィールの整備から、視覚的訴求、レビュー管理、インバウンド対策まで、実践的な5ステップを紹介します。
3. モニタリングのポイント
この仕組みを導入すると、「誰がどのコミットで、どんなエラーを出したか」がスマホに通知されるため、修正までの初動が劇的に早くなります。
特に、先ほどREADMEで校正した「ツール集約プロジェクト」のように、多くの独立したツールが共存している場合、どのツールでエラーが出たのかをログから判別できるように、Monologの Channel 名にツール名を入れておくと、Discord通知がさらに神がかります。

[Nginx]PythonサービスをSSL化
Nginxで動作するPythonサービスを、Let's EncryptとCertbotを用いて無料でSSL化する手順を解説。事前準備からポート開放、証明書の自動取得、期限切れを防ぐ自動更新の設定まで、実務で役立つ知見を凝縮しています。

コメント