|
| 1 | +/usr/bin/env bash |
| 2 | +set -Eeuo pipefail |
| 3 | + |
| 4 | +# GitHub Actions runners have two disks, /dev/root and /dev/sda1. |
| 5 | +# We would like to be able to combine available disk space on both and use it for podman container builds. |
| 6 | +# |
| 7 | +# This script creates file-backed volumes on /dev/root and /dev/sda1, then creates ext4 over both, and mounts it for our use |
| 8 | +# https://github.com/easimon/maximize-build-space/blob/master/action.yml |
| 9 | + |
| 10 | +root_reserve_mb=2048 |
| 11 | +temp_reserve_mb=100 |
| 12 | +swap_size_mb=4096 |
| 13 | + |
| 14 | +build_mount_path="${HOME}/.local/share/containers" |
| 15 | +build_mount_path_ownership="runner:runner" |
| 16 | + |
| 17 | +pv_loop_path=/pv.img |
| 18 | +tmp_pv_loop_path=/mnt/tmp-pv.img |
| 19 | +overprovision_lvm=false |
| 20 | + |
| 21 | +VG_NAME=buildvg |
| 22 | + |
| 23 | +# github runners have an active swap file in /mnt/swapfile |
| 24 | +# we want to reuse the temp disk, so first unmount swap and clean the temp disk |
| 25 | +echo "Unmounting and removing swap file." |
| 26 | +sudo swapoff -a |
| 27 | +sudo rm -f /mnt/swapfile |
| 28 | + |
| 29 | +echo "Creating LVM Volume." |
| 30 | +echo " Creating LVM PV on root fs." |
| 31 | +# create loop pv image on root fs |
| 32 | +ROOT_RESERVE_KB=$(expr ${root_reserve_mb} \* 1024) |
| 33 | +ROOT_FREE_KB=$(df --block-size=1024 --output=avail / | tail -1) |
| 34 | +ROOT_LVM_SIZE_KB=$(expr $ROOT_FREE_KB - $ROOT_RESERVE_KB) |
| 35 | +ROOT_LVM_SIZE_BYTES=$(expr $ROOT_LVM_SIZE_KB \* 1024) |
| 36 | +sudo touch "${pv_loop_path}" && sudo fallocate -z -l "${ROOT_LVM_SIZE_BYTES}" "${pv_loop_path}" |
| 37 | +export ROOT_LOOP_DEV=$(sudo losetup --find --show "${pv_loop_path}") |
| 38 | +sudo pvcreate -f "${ROOT_LOOP_DEV}" |
| 39 | + |
| 40 | +# create pv on temp disk |
| 41 | +echo " Creating LVM PV on temp fs." |
| 42 | +TMP_RESERVE_KB=$(expr ${temp_reserve_mb} \* 1024) |
| 43 | +TMP_FREE_KB=$(df --block-size=1024 --output=avail /mnt | tail -1) |
| 44 | +TMP_LVM_SIZE_KB=$(expr $TMP_FREE_KB - $TMP_RESERVE_KB) |
| 45 | +TMP_LVM_SIZE_BYTES=$(expr $TMP_LVM_SIZE_KB \* 1024) |
| 46 | +sudo touch "${tmp_pv_loop_path}" && sudo fallocate -z -l "${TMP_LVM_SIZE_BYTES}" "${tmp_pv_loop_path}" |
| 47 | +export TMP_LOOP_DEV=$(sudo losetup --find --show "${tmp_pv_loop_path}") |
| 48 | +sudo pvcreate -f "${TMP_LOOP_DEV}" |
| 49 | + |
| 50 | +# create volume group from these pvs |
| 51 | +sudo vgcreate "${VG_NAME}" "${TMP_LOOP_DEV}" "${ROOT_LOOP_DEV}" |
| 52 | + |
| 53 | +echo "Recreating swap" |
| 54 | +# create and activate swap |
| 55 | +sudo lvcreate -L "${swap_size_mb}M" -n swap "${VG_NAME}" |
| 56 | +sudo mkswap "/dev/mapper/${VG_NAME}-swap" |
| 57 | +sudo swapon "/dev/mapper/${VG_NAME}-swap" |
| 58 | + |
| 59 | +echo "Creating build volume" |
| 60 | +# create and mount build volume |
| 61 | +sudo lvcreate --type raid0 --stripes 2 --stripesize 4 --alloc anywhere --extents 100%FREE --name buildlv "${VG_NAME}" |
| 62 | +if [[ ${overprovision_lvm} == 'true' ]]; then |
| 63 | + sudo mkfs.ext4 -m0 "/dev/mapper/${VG_NAME}-buildlv" |
| 64 | +else |
| 65 | + sudo mkfs.ext4 -Enodiscard -m0 "/dev/mapper/${VG_NAME}-buildlv" |
| 66 | +fi |
| 67 | +sudo mount "/dev/mapper/${VG_NAME}-buildlv" "${build_mount_path}" |
| 68 | +sudo chown -R "${build_mount_path_ownership}" "${build_mount_path}" |
| 69 | + |
| 70 | +# if build mount path is a parent of $GITHUB_WORKSPACE, and has been deleted, recreate it |
| 71 | +if [[ ! -d "${GITHUB_WORKSPACE}" ]]; then |
| 72 | + sudo mkdir -p "${GITHUB_WORKSPACE}" |
| 73 | + sudo chown -R "${WORKSPACE_OWNER}" "${GITHUB_WORKSPACE}" |
| 74 | +fi |
0 commit comments