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+ isX86 () {
8+     local  arch
9+     arch=$( uname -m) 
10+     if  [ " $arch "   =  " x86_64"   ];  then 
11+         return  0
12+     else 
13+         return  1
14+     fi 
15+ }
16+ 
617#  print a line of the specified character
718printSeparationLine () {
819    for  (( i =  0 ; i <  80 ; i++ )) ;  do 
@@ -14,11 +25,15 @@ printSeparationLine() {
1425#  compute available space
1526#  REF: https://unix.stackexchange.com/a/42049/60849
1627#  REF: https://stackoverflow.com/a/450821/408734
17- getAvailableSpace () { echo  $( df -a |  awk ' NR > 1 {avail+=$4} END {print avail}' ) ;  }
28+ getAvailableSpace () {
29+     df -a |  awk ' NR > 1 {avail+=$4} END {print avail}' 
30+ }
1831
1932#  make Kb human readable (assume the input is Kb)
2033#  REF: https://unix.stackexchange.com/a/44087/60849
21- formatByteCount () { echo  $( numfmt --to=iec-i --suffix=B --padding=7 $1 ' 000' ) ;  }
34+ formatByteCount () {
35+     numfmt --to=iec-i --suffix=B --padding=7 " $1 " ' 000' 
36+ }
2237
2338#  macro to output saved space
2439printSavedSpace () {
@@ -58,11 +73,27 @@ removeDir() {
5873    dir=${1} 
5974
6075    local  before
61-     before=$( getAvailableSpace) 
76+     if  [ !  -d  " $dir "   ];  then 
77+         echo  " ::warning::Directory $dir  does not exist, skipping." 
78+     else 
79+         before=$( getAvailableSpace) 
80+         sudo rm -rf " $dir " 
81+         printSavedSpace " $before "   " Removed $dir " 
82+     fi 
83+ }
84+ 
85+ removeUnusedDirectories () {
86+     local  dirs_to_remove=(
87+         " /usr/local/lib/android" 
88+         " /usr/share/dotnet" 
6289
63-     sudo rm -rf " $dir "   ||  true 
90+         #  Haskell runtime
91+         " /usr/local/.ghcup" 
92+     )
6493
65-     printSavedSpace " $before "   " $dir " 
94+     for  dir  in  " ${dirs_to_remove[@]} " ;  do 
95+         removeDir " $dir " 
96+     done 
6697}
6798
6899execAndMeasureSpaceChange () {
@@ -79,31 +110,39 @@ execAndMeasureSpaceChange() {
79110#  Remove large packages
80111#  REF: https://github.com/apache/flink/blob/master/tools/azure-pipelines/free_disk_space.sh
81112cleanPackages () {
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' 
113+     local  packages=(
114+         ' ^aspnetcore-.*' 
115+         ' ^dotnet-.*' 
116+         ' ^llvm-.*' 
117+         ' ^mongodb-.*' 
118+         ' ^mysql-.*' 
119+         ' azure-cli' 
120+         ' firefox' 
121+         ' libgl1-mesa-dri' 
122+         ' mono-devel' 
123+         ' php.*' 
124+     )
125+ 
126+     if  isX86;  then 
127+         packages+=(
128+             ' google-chrome-stable' 
129+             ' google-cloud-cli' 
130+             ' google-cloud-sdk' 
131+             ' powershell' 
132+         )
133+     fi 
134+ 
135+     sudo apt-get -qq remove -y --fix-missing " ${packages[@]} " 
97136
98137    sudo apt-get autoremove -y ||  echo  " ::warning::The command [sudo apt-get autoremove -y] failed" 
99138    sudo apt-get clean ||  echo  " ::warning::The command [sudo apt-get clean] failed failed" 
100139}
101140
102141#  Remove Docker images
103142cleanDocker () {
104-     echo  " Removing the following docker images:" 
143+     echo  " =>  Removing the following docker images:" 
105144    sudo docker image ls
106-     echo  " Removing docker images..." 
145+     echo  " =>  Removing docker images..." 
107146    sudo docker image prune --all --force ||  true 
108147}
109148
@@ -121,17 +160,12 @@ AVAILABLE_INITIAL=$(getAvailableSpace)
121160printDF " BEFORE CLEAN-UP:" 
122161echo  " " 
123162
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" 
163+ execAndMeasureSpaceChange cleanPackages " Unused packages" 
132164execAndMeasureSpaceChange cleanDocker " Docker images" 
133165execAndMeasureSpaceChange cleanSwap " Swap storage" 
134166
167+ removeUnusedDirectories
168+ 
135169#  Output saved space statistic
136170echo  " " 
137171printDF " AFTER CLEAN-UP:" 
0 commit comments