73 lines
2.2 KiB
Bash
73 lines
2.2 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
set -eo pipefail
|
|
source "$(dirname "$0")/utils.sh"
|
|
|
|
# Use 60 as default in case BACKUP_CLEANUP_INTERVAL did not set
|
|
BACKUP_CLEANUP_INTERVAL=${BACKUP_CLEANUP_INTERVAL:=60}
|
|
|
|
# Ensure required environment variables are set
|
|
check_env_var() {
|
|
if [[ -z "${!1}" ]]; then
|
|
_log "ERROR" "Required '$1' environment variable is not set"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
is_backup_not_exist() {
|
|
local backup_dir="$1"
|
|
# Save the current value of 'set -e'
|
|
local previous_e
|
|
previous_e=$(set +e; :; echo $?)
|
|
|
|
# Temporarily turn off 'set -e'
|
|
set +e
|
|
|
|
# Run ls command to check if any files matching the pattern exist
|
|
ls "${backup_dir}"/*.tar.* 1> /dev/null 2>&1
|
|
|
|
# Store the exit status of the ls command
|
|
local ls_exit_status=$?
|
|
|
|
# Restore the previous value of 'set -e'
|
|
[ "$previous_e" = "0" ] && set -e
|
|
|
|
# Return true if ls command succeeded (no files found), otherwise return false
|
|
[ $ls_exit_status -ne 0 ]
|
|
}
|
|
|
|
# Function to find exceeding backups
|
|
find_exceeding_backups() {
|
|
local backup_dir="$1"
|
|
local backup_count="$2"
|
|
# Check if we have any backup
|
|
if is_backup_not_exist "${backup_dir}"; then
|
|
_log "ERROR" "[run] backups not found in ${backup_dir}"
|
|
return
|
|
fi
|
|
find "${backup_dir}"/*.tar.zstd -maxdepth 0 -exec basename {} \; | sort -gr | tail -n +$((backup_count +1))
|
|
}
|
|
|
|
check_env_var "BACKUP_DIR"
|
|
check_env_var "JENKINS_HOME"
|
|
|
|
if [[ -z "${BACKUP_COUNT}" ]]; then
|
|
_log "WARNING" "[run] no BACKUP_COUNT set, it means you MUST delete old backups manually or by custom script"
|
|
else
|
|
_log "INFO" "[run] retaining only the ${BACKUP_COUNT} most recent backups, cleanup occurs every ${BACKUP_CLEANUP_INTERVAL} seconds"
|
|
fi
|
|
|
|
while true;
|
|
do
|
|
sleep "$BACKUP_CLEANUP_INTERVAL"
|
|
if [[ -n "${BACKUP_COUNT}" ]]; then
|
|
exceeding_backups=$(find_exceeding_backups "${BACKUP_DIR}" "${BACKUP_COUNT}")
|
|
if [[ -n "$exceeding_backups" ]]; then
|
|
_log "INFO" "[run] removing backups: $(echo "$exceeding_backups" | tr '\n' ', ' | sed 's/,$//')"
|
|
echo "$exceeding_backups" | while read -r file; do
|
|
rm "${BACKUP_DIR}/${file}"
|
|
done
|
|
fi
|
|
fi
|
|
done
|