Files
gitea-updater-ubuntu/giteaupdate
2026-02-14 12:40:12 +01:00

199 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# Author : Allan Christensen
# First Created : 14-02-2026 (DD-MM-YYYY)
# Description : Updates Gitea Single And Multi Instances On Ubuntu 24.04
# License : MIT License
#
# Are we root
#
if [[ $(id -u) -ne 0 ]]; then echo "" && echo "Must be root or use sudo" && echo "" ; exit ; fi
#
# Variables
#
giteabin="/usr/local/bin/gitea"
logdir="/var/log/gitea"
logfile="$logdir/giteaupdate.log"
backupdir="/var/log/gitea"
log_date_format="+%Y-%m-%d-%H%M%S"
#
# Prepare logging
#
mkdir -p "$logdir"
touch "$logfile"
chmod 640 "$logfile"
#
# Detect interactive mode
#
if [[ -t 1 ]]; then
interactive=true
else
interactive=false
fi
#
# Redirect all output to logfile
#
exec >>"$logfile" 2>&1
echo ""
echo "============================================================"
echo "Gitea update run : $(date)"
echo "============================================================"
#
# Logging helper
#
log() {
echo "$1"
if [[ "$interactive" == true ]]; then
echo "$1" > /dev/tty
fi
}
#
# Check Gitea binary exists
#
if [[ ! -x "$giteabin" ]]; then
log ""
log "Gitea binary not found at $giteabin — aborting."
log ""
exit 1
fi
#
# Get installed version
#
installed_version=$("$giteabin" -v 2>/dev/null | awk '{print $3}')
if [[ -z "$installed_version" ]]; then
log ""
log "Could not determine installed Gitea version — aborting."
log ""
exit 1
fi
#
# Get latest version
#
latest_version=$(curl -fsSL https://dl.gitea.com/gitea/version.json | grep -oP '"version"\s*:\s*"\K[^"]+')
if [[ -z "$latest_version" ]]; then
log ""
log "Could not determine latest Gitea version — aborting."
log ""
exit 1
fi
#
# Compare versions
#
log ""
log "Installed version : $installed_version"
log "Latest version : $latest_version"
if [[ "$installed_version" == "$latest_version" ]]; then
log ""
log "Already up to date. Nothing to do."
log ""
exit 0
fi
log ""
log "Updating Gitea to version $latest_version"
#
# Detect running Gitea services
#
mapfile -t running_services < <(
systemctl list-units --type=service --state=running --no-legend |
awk '{print $1}' | grep '^gitea'
)
#
# Download new binary
#
tmpbin="${giteabin}.new"
log ""
log "Downloading new Gitea binary..."
curl -fL "https://dl.gitea.com/gitea/${latest_version}/gitea-${latest_version}-linux-amd64" -o "$tmpbin" \
|| { log "Download failed — aborting." ; exit 1 ; }
chmod 755 "$tmpbin"
#
# Validate downloaded binary
#
log "Validating downloaded binary..."
if ! "$tmpbin" -v >/dev/null 2>&1; then
log "Downloaded binary failed validation — aborting."
rm -f "$tmpbin"
exit 1
fi
log "Binary validation successful."
#
# Stop running services
#
if [[ ${#running_services[@]} -gt 0 ]]; then
log ""
log "Stopping running Gitea services..."
for svc in "${running_services[@]}"; do
log "Stopping $svc"
systemctl stop "$svc"
done
else
log ""
log "No running Gitea services detected."
fi
#
# Backup current binary
#
mkdir -p "$backupdir"
backupfile="$backupdir/giteaupdate-binary.log.$(date "$log_date_format")"
cp -p "$giteabin" "$backupfile"
log ""
log "Backup saved to: $backupfile"
#
# Replace binary
#
mv "$tmpbin" "$giteabin"
chmod 755 "$giteabin"
#
# Start services that were previously running
#
if [[ ${#running_services[@]} -gt 0 ]]; then
log ""
log "Starting Gitea services..."
for svc in "${running_services[@]}"; do
log "Starting $svc"
systemctl start "$svc"
done
log ""
log "Restarted services: ${running_services[*]}"
fi
log ""
log "Update complete."
log ""
#
# All done
#
printf "\nAll Done...\n"
#
# End of script
#