GitHub Actions:「Unable to process file command 'output' successfully」
ステップの中身はすべて動きました。終わったところで runner が $GITHUB_OUTPUT(または $GITHUB_ENV)のファイルを読み、解析できない行に当たって、ステップを失敗にしました。2行目のエラーがその行をそのまま見せるので、たいていはそれで何が書いたのかがわかります。
見え方
Error: Unable to process file command 'output' successfully. Error: Invalid format ' "name": "web",'
'output'の代わりに'env'なら$GITHUB_ENVです。moq.analyzers では「No regressions detected」の直後に出て、ベンチマークは通ったのにジョブは失敗しました(#1451)。- runner はファイルを1行ずつ読み、名前をその場で設定していくので、問題の行より上の名前はもう設定されています。
runner が受け付ける形
runner の FileCommandManager.cs では、空でない行はどれも次の2つのどちらかでなければなりません:
NAME=VALUE。最初の=で分け、値は行の終わりまでです。NAME<<DELIMITER、続けて何行でもよい値、最後に区切りの文字列だけの行。
それ以外の行は「Invalid format」になります。紛れ込んだ行にたまたま = があると失敗はせず、= の前にあったものを名前にした出力を黙って作ります。
1. 複数行の値
値の2行目には = がありません。よくあるのは、jq が整形した JSON(hypershift #9879・dotfiles #32)と、本文つきのコミットメッセージです。nhost-actions/deploy は、本文のあるコミットのときだけ壊れました(#2)。
- JSON は1行で出します:
echo "matrix=$(jq -c . services.json)" >> "$GITHUB_OUTPUT"。 - 文章は、その中に出てこない区切りを使います:
- id: notes
env:
COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
run: |
delim="EOF_$(openssl rand -hex 8)"
{
echo "message<<$delim"
printf '%s\n' "$COMMIT_MESSAGE"
echo "$delim"
} >> "$GITHUB_OUTPUT"
GitHub のドキュメントは、区切りが値の中で1行だけで出てこないことを確かめるよう書いていて、PowerShell の例では New-Guid で区切りを作っています。決まった EOF は、文章に EOF だけの行が入った日に壊れます。
2. ログの行がファイルに入った
script.sh | tee -a "$GITHUB_OUTPUT" や tool >> "$GITHUB_OUTPUT" は、道具が出すものを全部送ります。graphty-monorepo は、スクリプトの中の依存のインストールが出した「Invalid format 'Installing dependencies...'」で失敗し(#5636)、jmzTab-m-webapp は Maven のラッパーの出力で失敗しました(#76)。途中経過は標準エラー(>&2)に出すか、先に値を取り出してから1行だけ書きます:
version=$(./mvnw -q help:evaluate -Dexpression=project.version -DforceStdout) echo "version=$version" >> "$GITHUB_OUTPUT"
3. 1つのはずの値が2つ
代わりの値が2行目を足すことがあります。set -o pipefail の下で ... | jq -sc . || printf '[]' は、一覧が空のときに [] を2回出し、2つ目が「Invalid format '[]'」になりました(ai-dev-framework-template #1881)。値を組み立てる処理は、空のときも試します。
4. 「Matching delimiter not found」
Error: Unable to process file command 'output' successfully. Error: Invalid value. Matching delimiter not found 'EOF'
runner は、区切りだけの行を見ないままファイルの終わりに着きました。たいていは値が改行で終わっておらず、echo EOF が最後の行にくっついたのです。octane-actions は同じコミットで、作られたファイルが改行で終わるかどうかだけで失敗したり通ったりしました(#72)。上の例のように値を printf '%s\n' で書けば防げます。「Invalid value. EOF marker missing new line.」は、同じ問題がファイルのいちばん最後で起きたときの文面です。
見分け方
- 「Can't store NODE_OPTIONS output parameter using '$GITHUB_ENV' command.」:runner はその名前だけを断り、残りは設定します。
set-outputのコマンドは非推奨という警告:ステップがファイルではなくログに::set-outputを書いています。$GITHUB_OUTPUTに移します。- ステップは通ったのに、あとのステップで
steps.<id>.outputs.<name>が空:ステップにidがあるか、名前が合っているかを見ます。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「Invalid workflow file」 · 「Input required and not supplied」 · 「detected dubious ownership」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English