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