[Github]エラー時のみログを送信するActions

TIPS
TIPS

テストが落ちた時に、わざわざGitHub Actionsのログを深掘りしに行かなくても、Discord上で「何が原因で落ちたのか」がサクッとわかると開発効率が爆上がりしますよね。

単に「テスト失敗」と送るのではなく、ログファイルの直近10〜20行(エラーの核心部分)を抜き出して送信する実践的なワークフローを紹介します。

実装の戦略

  1. PHPUnitを実行する(結果を気にせず一旦通す設定か、標準のままでOK)。
  2. 失敗時のみ起動するステップを作る(if: failure() を使用)。
  3. シェルコマンドでログファイルを加工する(tail や sed でエラー箇所を抽出)。
  4. 抽出した内容を環境変数に入れて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化する手順を解説。事前準備からポート開放、証明書の自動取得、期限切れを防ぐ自動更新の設定まで、実務で役立つ知見を凝縮しています。
Q よくある質問 (FAQ)
Q. Discordのメッセージ制限(2000文字)に引っかからないようにする対策はありますか?
A.
`tail -n 20`で行数を絞り込む、または`grep -A 5 "ERROR"`などでエラー発生箇所の周辺のみを抽出して送信する対策が有効です。
Q. テストが失敗した時のみログ送信ステップを起動するにはどうすればよいですか?
A.
GitHub Actionsのステップに `if: failure()` を指定することで、前のテストステップが失敗した時のみ限定して実行させることができます。

コメント

タイトルとURLをコピーしました