GitHub Actions has become the most popular CI/CD platform, powering over 50 million workflows per day. But its flexibility comes with complexity — and debugging a failing workflow can feel like searching for a needle in a haystack of nested YAML and multiline log output.
This guide covers everything you need to know about debugging GitHub Actions workflows, from basic log reading to advanced techniques that will save you hours.
Understanding GitHub Actions Log Output
When a workflow fails, GitHub provides logs for each job and step. The key is knowing where to look.
Step-level logs: Each step in your workflow has its own expandable log section. Failed steps are marked with a red X. Start there.
Annotations: GitHub surfaces error annotations at the top of the workflow run page. These are extracted from common output patterns like compiler errors, test failures, and linting issues.
Raw logs: You can download the full log as a zip file via the UI or the API. This is useful for programmatic analysis.
Enabling Debug Logging
GitHub Actions supports two levels of debug logging that expose significantly more information:
# Add these as repository secrets or workflow variables
ACTIONS_RUNNER_DEBUG: true # Runner diagnostic logs
ACTIONS_STEP_DEBUG: true # Step-level debug output
You can also re-run a failed workflow with debug logging enabled by clicking "Re-run jobs" → "Enable debug logging" in the GitHub UI.
Warning: Debug logs may expose sensitive information. Use them temporarily and check for leaked secrets before sharing logs.
Common GitHub Actions Errors and Fixes
Error: "Resource not accessible by integration"
This typically means your workflow doesn't have the required permissions. Fix it by adding explicit permissions to your workflow:
permissions:
contents: read
pull-requests: write
issues: write
Error: "The job was not started because recent account payments have failed"
Your GitHub organization has billing issues. Check your billing settings at Settings → Billing → Actions.
Error: "No space left on device"
GitHub-hosted runners provide limited disk space. Free up space before your build step:
- name: Free disk space
run: |
sudo rm -rf /usr/share/dotnet
sudo rm -rf /opt/ghc
sudo rm -rf /usr/local/share/boost
df -h
Error: "Process completed with exit code 137"
Exit code 137 means your process was killed by the OOM killer. Your job is using too much memory. Solutions:
- Use a
larger-runner(GitHub-managed or self-hosted) - Reduce parallelism in test runners
- Split the job into smaller, sequential steps
Debugging Matrix Strategy Failures
Matrix builds run multiple configurations in parallel. When one matrix combination fails, examine the specific combination's logs:
strategy:
fail-fast: false # Don't cancel other jobs when one fails
matrix:
node: [18, 20, 22]
os: [ubuntu-latest, macos-latest]
Setting fail-fast: false lets all combinations complete, giving you the full picture of what's failing and where.
Using act for Local Debugging
act lets you run GitHub Actions workflows locally using Docker. This is invaluable for rapid iteration:
# Install act
brew install act
# Run the default push event
act push
# Run a specific job
act -j build
# Run with secrets
act --secret-file .env.secrets
Limitations: act doesn't perfectly replicate GitHub's runner environment. Some actions (especially ones that call GitHub APIs) may not work locally. But for debugging build commands, test failures, and scripting issues, it's excellent.
Caching Pitfalls
Caching is essential for fast CI, but stale or corrupted caches cause subtle failures:
- uses: actions/cache@v4
with:
path: |
~/.npm
node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
If you suspect a cache issue, purge caches via the GitHub API or UI (Actions → Caches), then re-run.
Automating Failure Analysis
Manually debugging workflow failures doesn't scale. As your team grows, you need automated analysis.
Daxtack integrates directly with GitHub Actions to provide:
- Instant root cause analysis — When a workflow fails, Daxtack automatically analyzes the logs and identifies the root cause
- PR comments with fix suggestions — The analysis appears directly in your pull request as a comment
- Pattern detection — Spot recurring errors across your workflows
- Proactive monitoring — Get notified of failures before your team notices
Instead of spending 20 minutes reading logs, you get a structured analysis in under 30 seconds.
Get started with Daxtack — free for up to 10 analyses per month.