GitHub Actions: "Unable to process file command 'output' successfully"
Everything in the step ran. When it ended, the runner read the file at $GITHUB_OUTPUT (or $GITHUB_ENV), met a line it could not parse, and marked the step failed. The second error line quotes that line, which usually tells you what wrote it.
What it looks like
Error: Unable to process file command 'output' successfully. Error: Invalid format ' "name": "web",'
'env'in place of'output'means$GITHUB_ENV. In moq.analyzers it came right after "No regressions detected", so the benchmarks had passed and the job still failed (#1451).- The runner reads the file a line at a time and applies each name as it goes, so names above the bad line are already set.
What the runner accepts
In the runner's FileCommandManager.cs, every non-empty line must be one of two things:
NAME=VALUE, split at the first=. The value ends at the end of the line.NAME<<DELIMITER, then the value on as many lines as you like, then the delimiter alone on its own line.
Any other line gives "Invalid format". A stray line that happens to contain = does not fail: it quietly sets an output named after whatever is in front of the =.
1. A value with more than one line
The second line of the value has no =. Typical sources are jq printing pretty JSON (hypershift #9879, dotfiles #32) and a commit message with a body, which broke nhost-actions/deploy only on commits that had one (#2).
- For JSON, print it on one line:
echo "matrix=$(jq -c . services.json)" >> "$GITHUB_OUTPUT". - For text, use a delimiter that cannot occur in it:
- 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's documentation says to make sure the delimiter "won't occur on a line of its own within the value", and its PowerShell example builds one with New-Guid. A fixed EOF breaks the day the text contains a line EOF.
2. Log lines went into the file
script.sh | tee -a "$GITHUB_OUTPUT" or tool >> "$GITHUB_OUTPUT" sends everything the tool prints. graphty-monorepo failed on "Invalid format 'Installing dependencies...'" from a dependency install inside its script (#5636), and jmzTab-m-webapp on the Maven wrapper's output (#76). Send progress to stderr (>&2), or capture the value first and write one line:
version=$(./mvnw -q help:evaluate -Dexpression=project.version -DforceStdout) echo "version=$version" >> "$GITHUB_OUTPUT"
3. Two values where you expected one
A fallback can add a second line. Under set -o pipefail, ... | jq -sc . || printf '[]' printed [] twice when the list was empty, and the second one was "Invalid format '[]'" (ai-dev-framework-template #1881). Test the empty case of anything that builds a value.
4. "Matching delimiter not found"
Error: Unable to process file command 'output' successfully. Error: Invalid value. Matching delimiter not found 'EOF'
The runner reached the end of the file without seeing the delimiter alone on a line. Usually the value did not end with a newline, so echo EOF was glued to its last line. octane-actions failed or passed on the same commit depending only on whether a generated file ended with a newline (#72). printf '%s\n' for the value, as above, prevents it. "Invalid value. EOF marker missing new line." is the same problem at the very end of the file.
Telling it apart
- "Can't store NODE_OPTIONS output parameter using '$GITHUB_ENV' command.": the runner refuses that one name and goes on with the rest.
- A warning that the
set-outputcommand is deprecated: the step uses::set-outputin its log instead of the file. Move it to$GITHUB_OUTPUT. - The step passed and a later step reads an empty
steps.<id>.outputs.<name>: check that the step has anidand that the name matches.
See failed jobs from IntelliJ IDEA
Pipeline Inbox for GitHub Actions Workflows, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, lists the runs of all your repositories in an IDE tool window, with their jobs and steps, and your current branch's runs are in the status bar. Reading is free; re-running failed jobs, cancelling, running workflows and reviewing deployments are Pro (US$1.50 a month, with a 30-day trial).
GitHub and GitHub Actions are trademarks of GitHub, Inc.; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with, sponsored or endorsed by GitHub, Inc. or JetBrains.
More: "Invalid workflow file" · "Input required and not supplied" · "detected dubious ownership" · GitHub Actions plugins for IntelliJ IDEA compared · 日本語