64 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env bash
 | |
| 
 | |
| set -eo pipefail
 | |
| source "$(dirname "$0")/utils.sh"
 | |
| 
 | |
| [[ ! $# -eq 1 ]] && _log "ERROR" "Usage: $0 BACKUP_NUMBER" && exit 1
 | |
| [[ -z "${BACKUP_DIR}" ]] && _log "ERROR" "Required 'BACKUP_DIR' env not set" && exit 1
 | |
| [[ -z "${JENKINS_HOME}" ]] && _log "ERROR" "Required 'JENKINS_HOME' env not set" && exit 1
 | |
| BACKUP_RETRY_COUNT=${BACKUP_RETRY_COUNT:-3}
 | |
| BACKUP_RETRY_INTERVAL=${BACKUP_RETRY_INTERVAL:-60}
 | |
| BACKUP_NUMBER=$1
 | |
| TRAP_FILE="/tmp/_backup_${BACKUP_NUMBER}_is_running"
 | |
| 
 | |
| # --> Check if another backup process is running (operator restart/crash)
 | |
| for ((i=0; i<BACKUP_RETRY_COUNT; i++)); do
 | |
|     [[ ! -f "${TRAP_FILE}" ]] && _log "INFO" "[backup] no other backup process are running" && break
 | |
|     _log "INFO" "[backup] backup is already running. Waiting for ${BACKUP_RETRY_INTERVAL} seconds..."
 | |
|     sleep "${BACKUP_RETRY_INTERVAL}"
 | |
| done
 | |
| [[ -f "${TRAP_FILE}" ]] && { _log "ERROR" "[backup] backup is still running after waiting ${BACKUP_RETRY_COUNT} time ${BACKUP_RETRY_INTERVAL}s. Exiting."; exit 1; }
 | |
| # --< Done
 | |
| 
 | |
| _log "INFO" "[backup] running backup ${BACKUP_NUMBER}"
 | |
| touch "${TRAP_FILE}"
 | |
| # create temp dir on the same filesystem with a BACKUP_DIR to be able use atomic mv enstead of copy
 | |
| BACKUP_TMP_DIR=$(mktemp -d --tmpdir="${BACKUP_DIR}")
 | |
| 
 | |
| _clean(){
 | |
|     test -d "${BACKUP_TMP_DIR}" && rm -fr "${BACKUP_TMP_DIR}"
 | |
|     test -f "${TRAP_FILE}" && rm -f "${TRAP_FILE}"
 | |
| }
 | |
| 
 | |
| _trap(){
 | |
|     _clean
 | |
|     _log "ERROR" "[backup] something wrong happened, check the logs"
 | |
| }
 | |
| 
 | |
| trap '_trap' SIGQUIT SIGINT SIGTERM
 | |
| 
 | |
| # config.xml in a job directory is a config file that shouldn't be backed up
 | |
| # config.xml in child directories is state that should. For example-
 | |
| # branches/myorg/branches/myrepo/branches/master/config.xml should be retained while
 | |
| # branches/myorg/config.xml should not
 | |
| tar --zstd -C "${JENKINS_HOME}" -cf "${BACKUP_TMP_DIR}/${BACKUP_NUMBER}.tar.zstd" \
 | |
|     --exclude jobs/*/workspace* \
 | |
|     --no-wildcards-match-slash --anchored \
 | |
|     --ignore-failed-read \
 | |
|     --exclude jobs/*/config.xml -c jobs || ret=$?
 | |
| 
 | |
| if [[ "$ret" -eq 0 ]]; then
 | |
|   _log "INFO" "[backup] backup ${BACKUP_NUMBER} was completed without warnings"
 | |
| elif [[ "$ret" -eq 1 ]]; then
 | |
|   _log "INFO" "[backup] backup ${BACKUP_NUMBER} was completed with some warnings"
 | |
| fi
 | |
| 
 | |
| mv "${BACKUP_TMP_DIR}/${BACKUP_NUMBER}.tar.zstd" "${BACKUP_DIR}/${BACKUP_NUMBER}.tar.zstd"
 | |
| 
 | |
| _log "INFO" "[backup] cleaning ${BACKUP_TMP_DIR} and trap file ${TRAP_FILE}"
 | |
| _clean
 | |
| [[ ! -s ${BACKUP_DIR}/${BACKUP_NUMBER}.tar.zstd ]] && _log "ERROR" "[backup] file '${BACKUP_DIR}/${BACKUP_NUMBER}.tar.zstd' is empty" && exit 1
 | |
| 
 | |
| _log "INFO" "[backup] ${BACKUP_NUMBER} done"
 | |
| exit 0
 |