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