はじめに
先日作成したワークフローでArgument list too long
エラーが発生しました。
解決までに時間を要したので備忘録として解決方法をまとめます。
問題
ワークフロー実行時にArgument list too long
エラーが発生する
原因
エラー分析を行う際のログが膨大だった。
AI分析する前に、対象のログを全て取得していたため、ログの容量が大きい場合は全て取得できずにエラーとなっていました。
解決方法
ログからエラーメッセージのみをgrepして出力する。
エラーログを取得する処理を全量取得から、errorとして出力しているものをgrepして取得することで、ログの容量を減らしました。
また、promptの書き方も簡潔にしました。
- name: Get error info
id: get-error
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# ワークフローの実行IDを取得
RUN_ID=${{ github.event.workflow_run.id }}
echo "RUN_ID: $RUN_ID"
# ワークフロー情報を環境変数に保存
echo "WORKFLOW_NAME=${{ github.event.workflow_run.name }}" >> $GITHUB_ENV
echo "BRANCH_NAME=${{ github.event.workflow_run.head_branch }}" >> $GITHUB_ENV
echo "COMMIT_SHA=${{ github.event.workflow_run.head_sha }}" >> $GITHUB_ENV
# ジョブの一覧を取得
JOBS=$(gh api repos/${{ github.repository }}/actions/runs/${RUN_ID}/jobs --jq '.jobs')
# 失敗したジョブのログを取得
echo "FAILED_LOGS<<EOF" >> $GITHUB_ENV
for job in $(echo "$JOBS" | jq -r '.[] | select(.conclusion == "failure") | .id'); do
- echo "=== Job ID: $job ===" >> $GITHUB_ENVAdd commentMore actions
- gh api repos/${{ github.repository }}/actions/jobs/${job}/logs >> $GITHUB_ENV 2>&1 || echo "ログの取得に失敗しました" >> $GITHUB_ENV
# ジョブ名を取得
+ JOB_NAME=$(echo "$JOBS" | jq -r --arg id "$job" '.[] | select(.id == ($id | tonumber)) | .name')
+ echo "失敗したジョブ: $JOB_NAME" >> $GITHUB_ENV
+ echo "" >> $GITHUB_ENV
+ # エラーの部分だけを取得(最大30行)
+ echo "エラー内容:" >> $GITHUB_ENV
+ gh api repos/${{ github.repository }}/actions/jobs/${job}/logs 2>&1 | \
+ grep -B 2 -A 5 -i "error\|fail\|Found multiple\|Expected\|Received" | \
+ head -30 >> $GITHUB_ENV || echo "ログを取得できませんでした" >> $GITHUB_ENV
echo "" >> $GITHUB_ENV
+ echo "---" >> $GITHUB_ENV
done
echo "EOF" >> $GITHUB_ENV
- name: Run AI check
id: ai-check
uses: actions/ai-inference@v1
with:
model: "openai/gpt-4o"
prompt: |
- あなたは、GitHub ActionsとJavaScript/TypeScriptのテストのプロです。
+ あなたは、GitHub ActionsとJavaScript/TypeScriptのテストのプロです。
初心者でも理解できるように
以下の形式で簡潔に(全体で10行以内)説明してください。
エラーの内容は以下です。
**失敗したワークフロー:**
- ワークフロー名: ${{ env.WORKFLOW_NAME }}
- ブランチ: ${{ env.BRANCH_NAME }}
- コミットSHA: ${{ env.COMMIT_SHA }}
- 使用技術: Vite, Supabase, Firebase
**エラーログ:**
```
${{ env.FAILED_LOGS }}
```
**回答形式フォーマット:**
【原因】1-2行で説明
【解決方法】具体的な手順を1-2個
【予防策】1つだけ
- name: Save AI response to summary
if: always()
run: |
# GitHub Actionsのサマリーに出力(Web UIで確認可能)
echo "## 分析結果" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo '${{ steps.ai-check.outputs.response }}' | base64 | base64 -d >> $GITHUB_STEP_SUMMARY
おわりに
promptの一行を変えるだけで、結果が大きく変わることに驚きました。AIの指示の出し方もスキルとして必要なのではと思うエラーでした。