GitHub Actions: "No space left on device" on a hosted runner
The runner's root disk filled up. GitHub's hosted Ubuntu runners come with many toolchains already installed, so a large build or a large Docker image can use up what is left. The usual fix is to delete preinstalled software the job does not need, at the start of the job.
What it looks like
- A step fails with its own message, for example while
actions/cachebuilds its archive in$RUNNER_TEMP, which is on the same disk (nixfiles #157):zstd: ... No space left on device
- The runner adds a warning annotation when free space drops under a threshold set by GitHub. It checks every 10 seconds, and the runner's code notes a default of 100 MB. From a public run in October (cratestack #1239):
You are running out of disk space. The runner will stop working when the machine runs out of disk space. Free space left: 74 MB
- The runner itself crashes when it cannot write its own log, and the job fails (pmacs #450). Sometimes the job then has no log at all (coding-adventures #17652):
System.IO.IOException: No space left on device : '/home/runner/actions-runner/cached/2.338.2/_diag/Worker_20261102-200058-utc.log'
How much space a hosted runner has
- GitHub's documentation lists 14 GB of SSD for every standard hosted runner. That is the only amount it guarantees.
- In practice it depends on the repository. A runner-images maintainer wrote on August 5, 2026 that public repositories get a 4-core VM with a 150 GB disk and about 90 GB free, and private repositories a 2-core VM with a 75 GB disk and about 14 GB free, adding that only 14 GB is guaranteed on both (runner-images #14492).
- The larger disk is not certain even in public repositories. On October 31, one public project saw some
ubuntu-latestjobs start with about 19 GB free and others with about 89.5 GB, in the same merge queue (ravel #3564).
Print it at the start of the job, so a failed run shows which kind it got:
- run: df -h /
Freeing space
What deleting each preinstalled toolchain freed on an ubuntu-24.04 runner of a public repository on September 17, 2026, from the CI log of jlumbroso/free-disk-space. The disk went from 87 GB to 119 GB available. The Ubuntu 26.04 image that ubuntu-latest is moving to has the same toolchains (its image README of October 26):
- Android SDK,
/usr/local/lib/android: 11 GiB - .NET,
/usr/share/dotnet: 5.4 GiB - Haskell,
/opt/ghcand/usr/local/.ghcup: 3.6 GiB - The tool cache that
setup-python,setup-nodeand others use first,/opt/hostedtoolcache: 5.3 GiB - Large apt packages (LLVM, PHP, MySQL, MongoDB, browsers, Azure CLI, Google Cloud CLI and others): 4.5 GiB
- Cached Docker images: 1.9 GiB
- name: Free disk space
run: |
df -h /
sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc /usr/local/.ghcup
docker image prune --all --force
df -h /
- Delete only what later steps do not use: an Android build needs the SDK. Without the tool cache, the setup actions download the version instead, which is slower but works.
- Deleting takes time: the Android directory alone took about a minute in that log.
- A job that runs in a
container:deletes inside the container and frees nothing on the host. One project's jobs started with about 12 GB free from October 19 until the cleanup ran on the host instead (uno.chefs #1778). - Some runners have a separate disk at
/mnt, but not all: one project found it on its 24.04 runners and not on 26.04 (continuum #5650). Check withdf -hbefore building there.
Using less
- Remove build output a later step does not need, such as test executables or intermediate images, between phases of the job.
- Split a job that builds and tests several large parts into jobs of their own; each job gets a fresh runner.
- Leave room for the cache:
actions/cachewrites its whole archive to the root disk before uploading it. - If none of this is enough, larger runners (paid, with a fixed disk size) or a self-hosted runner give a known amount of space.
Telling it apart
- The job ends with "The runner has received a shutdown signal" or "lost communication with the server": a full disk can cause those too, but so can other overloads (shutdown signal, lost communication).
- The upload fails with "Artifact storage quota has been hit": that is your account's artifact storage on GitHub, not the runner's disk (artifact storage quota).
- On a self-hosted runner, the space is your machine's: clean its work directory and old checkouts there.
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: ubuntu-latest moving to Ubuntu 26.04 · A runner that lost communication · "Artifact storage quota has been hit" · GitHub Actions plugins for IntelliJ IDEA compared · 日本語