11#! /bin/bash
2+ set -euo pipefail
23
34# Free disk space on Linux GitHub action runners
45# Script inspired by https://github.com/jlumbroso/free-disk-space
56
7+ # When updating to a new ubuntu version:
8+ # - Check that there are no docker images preinstalled with `docker image ls`
9+ # - Check that there are no big packages preinstalled that we aren't using
10+
611# print a line of the specified character
712printSeparationLine () {
813 for (( i = 0 ; i < 80 ; i++ )) ; do
@@ -14,11 +19,15 @@ printSeparationLine() {
1419# compute available space
1520# REF: https://unix.stackexchange.com/a/42049/60849
1621# REF: https://stackoverflow.com/a/450821/408734
17- getAvailableSpace () { echo $( df -a | awk ' NR > 1 {avail+=$4} END {print avail}' ) ; }
22+ getAvailableSpace () {
23+ df -a | awk ' NR > 1 {avail+=$4} END {print avail}'
24+ }
1825
1926# make Kb human readable (assume the input is Kb)
2027# REF: https://unix.stackexchange.com/a/44087/60849
21- formatByteCount () { echo $( numfmt --to=iec-i --suffix=B --padding=7 $1 ' 000' ) ; }
28+ formatByteCount () {
29+ numfmt --to=iec-i --suffix=B --padding=7 " $1 " ' 000'
30+ }
2231
2332# macro to output saved space
2433printSavedSpace () {
@@ -58,11 +67,35 @@ removeDir() {
5867 dir=${1}
5968
6069 local before
61- before=$( getAvailableSpace)
70+ if [ ! -d " $dir " ]; then
71+ echo " ::warning::Directory $dir does not exist, skipping."
72+ else
73+ before=$( getAvailableSpace)
74+ sudo rm -rf " $dir "
75+ printSavedSpace " $before " " Removed $dir "
76+ fi
77+ }
78+
79+ removeUnusedDirectories () {
80+ local dirs_to_remove=(
81+ " /usr/local/lib/android"
82+ " /etc/mysql"
83+ " /usr/share/php"
84+
85+ # Haskell runtime
86+ " /usr/local/.ghcup"
6287
63- sudo rm -rf " $dir " || true
88+ # Azure
89+ " /opt/az"
90+ " /usr/share/az_" *
6491
65- printSavedSpace " $before " " $dir "
92+ # Environemnt variable set by GitHub Actions
93+ " $AGENT_TOOLSDIRECTORY "
94+ )
95+
96+ for dir in " ${dirs_to_remove[@]} " ; do
97+ removeDir " $dir "
98+ done
6699}
67100
68101execAndMeasureSpaceChange () {
@@ -79,34 +112,46 @@ execAndMeasureSpaceChange() {
79112# Remove large packages
80113# REF: https://github.com/apache/flink/blob/master/tools/azure-pipelines/free_disk_space.sh
81114cleanPackages () {
82- sudo apt-get -qq remove -y --fix-missing \
83- ' ^aspnetcore-.*' \
84- ' ^dotnet-.*' \
85- ' ^llvm-.*' \
86- ' php.*' \
87- ' ^mongodb-.*' \
88- ' ^mysql-.*' \
89- ' azure-cli' \
90- ' google-chrome-stable' \
91- ' firefox' \
92- ' powershell' \
93- ' mono-devel' \
94- ' libgl1-mesa-dri' \
95- ' google-cloud-sdk' \
96- ' google-cloud-cli'
97-
115+ sudo apt-get purge -y --autoremove --fix-missing \
116+ ' .*-icon-theme$' \
117+ ' ^aspnetcore-.*' \
118+ ' ^dotnet-.*' \
119+ ' ^java-*' \
120+ ' ^libllvm.*' \
121+ ' ^llvm-.*' \
122+ ' ^mercurial.*' \
123+ ' ^mysql-.*' \
124+ ' ^vim.*' \
125+ ' ^fonts-.*' \
126+ ' azure-cli' \
127+ ' buildah' \
128+ ' cpp-13' \
129+ ' firefox' \
130+ ' gcc-12' \
131+ ' gcc-13' \
132+ ' gcc-14' \
133+ ' gcc' \
134+ ' g++-14' \
135+ ' gfortran-14' \
136+ ' google-chrome-stable' \
137+ ' google-cloud-cli' \
138+ ' groff-base' \
139+ ' kubectl' \
140+ ' libgl1-mesa-dri' \
141+ ' microsoft-edge-stable' \
142+ ' php.*' \
143+ ' podman' \
144+ ' powershell' \
145+ ' skopeo' \
146+ ' snapd' \
147+ ' tmux'
148+
149+ echo " => apt-get autoremove"
98150 sudo apt-get autoremove -y || echo " ::warning::The command [sudo apt-get autoremove -y] failed"
151+ echo " => apt-get clean"
99152 sudo apt-get clean || echo " ::warning::The command [sudo apt-get clean] failed failed"
100153}
101154
102- # Remove Docker images
103- cleanDocker () {
104- echo " Removing the following docker images:"
105- sudo docker image ls
106- echo " Removing docker images..."
107- sudo docker image prune --all --force || true
108- }
109-
110155# Remove Swap storage
111156cleanSwap () {
112157 sudo swapoff -a || true
@@ -121,17 +166,11 @@ AVAILABLE_INITIAL=$(getAvailableSpace)
121166printDF " BEFORE CLEAN-UP:"
122167echo " "
123168
124- removeDir /usr/local/lib/android
125- removeDir /usr/share/dotnet
126-
127- # Haskell runtime
128- removeDir /opt/ghc
129- removeDir /usr/local/.ghcup
130-
131- execAndMeasureSpaceChange cleanPackages " Large misc. packages"
132- execAndMeasureSpaceChange cleanDocker " Docker images"
169+ execAndMeasureSpaceChange cleanPackages " Unused packages"
133170execAndMeasureSpaceChange cleanSwap " Swap storage"
134171
172+ removeUnusedDirectories
173+
135174# Output saved space statistic
136175echo " "
137176printDF " AFTER CLEAN-UP:"
0 commit comments