GitHub Actions step debug logs truncated
GitHub truncates very large step logs in the web UI. With ACTIONS_STEP_DEBUG enabled, a chatty step can blow past the display limit, so the relevant line is cut off even though it was produced.
What this error means
The log view shows a truncation notice and the detail you need is missing from the rendered output.
##[warning]The logs for this step have been truncated because they exceeded the maximum size.Diagnose it: print the context before you change anything
Most workflow-expression bugs are not syntax errors, they are an expression reading something that is empty. GitHub resolves a missing property to an empty string instead of failing the run, so a wrong reference looks like a logic bug rather than a mistake. Dump the contexts first and you will usually see the answer immediately.
- name: Dump contexts
run: |
echo '--- github ---' ; echo '${{ toJSON(github) }}'
echo '--- needs ---' ; echo '${{ toJSON(needs) }}'
echo '--- steps ---' ; echo '${{ toJSON(steps) }}'
echo '--- matrix ---' ; echo '${{ toJSON(matrix) }}'
echo '--- inputs ---' ; echo '${{ toJSON(inputs) }}'Check the context is allowed where you used it
Contexts are not available everywhere. The same expression can be valid in a step if and invalid in a job if, which is why an expression that works in one workflow fails when moved.
| Where you wrote it | Contexts available there |
|---|---|
run-name | github, inputs, vars |
concurrency | github, inputs, vars |
Top-level env | github, secrets, inputs, vars |
jobs.<id>.if | github, needs, vars, inputs |
jobs.<id>.steps.if | github, needs, strategy, matrix, job, runner, env, vars, steps, inputs |
jobs.<id>.outputs | Full access, including secrets |
Reusable workflow outputs | github, jobs, vars, inputs |
Common causes
Debug logging produced more than the display limit
ACTIONS_STEP_DEBUG plus verbose tooling generated more log than the UI renders, truncating the tail.
How to fix it
Capture full logs to an artifact
- Redirect the noisy command output to a file and upload it as an artifact for the complete log.
- Scope debug logging to the step under investigation rather than the whole run.
- Download the artifact to read the untruncated output.
- run: npm run build --verbose > build.log 2>&1 || (cat build.log; exit 1)
- if: always()
uses: actions/upload-artifact@v4
with:
name: build-log
path: build.logCatch it before it reaches CI
Every failure in this cluster is statically detectable. actionlint parses workflow expressions, checks context availability against the same rules above, and validates needs references, so these bugs never need to cost you a run.
# one-off
docker run --rm -v "$(pwd):/repo" --workdir /repo rhysd/actionlint:latest -color
# as a job, before anything expensive runs
- uses: actions/checkout@v4
- run: |
bash <(curl -s https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash)
./actionlint -colorHow to prevent it
- Persist verbose logs to artifacts instead of relying on the UI view.
- Enable step debug narrowly to keep logs under the display limit.