mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fix contrib/upgrade.sh (#19222)
				
					
				
			* fix idempotency of script (eg when aborting the downloads) * improve readability (user facing variables first, definitions next, statements last) * improve dependency checks * fix ignored $giteaversion variable * more logging * print usage string on incorrect usage
This commit is contained in:
		@@ -3,26 +3,32 @@
 | 
				
			|||||||
# from dl.gitea.io on linux as systemd service. It performs a backup and updates
 | 
					# from dl.gitea.io on linux as systemd service. It performs a backup and updates
 | 
				
			||||||
# Gitea in place.
 | 
					# Gitea in place.
 | 
				
			||||||
# NOTE: This adds the GPG Signing Key of the Gitea maintainers to the keyring.
 | 
					# NOTE: This adds the GPG Signing Key of the Gitea maintainers to the keyring.
 | 
				
			||||||
# Depends on: bash, curl, xz, sha256sum, gpg. optionally jq.
 | 
					# Depends on: bash, curl, xz, sha256sum. optionally jq, gpg
 | 
				
			||||||
# Usage:      [environment vars] upgrade.sh [version]
 | 
					 | 
				
			||||||
#   See section below for available environment vars.
 | 
					#   See section below for available environment vars.
 | 
				
			||||||
#   When no version is specified, updates to the latest release.
 | 
					#   When no version is specified, updates to the latest release.
 | 
				
			||||||
# Examples:
 | 
					# Examples:
 | 
				
			||||||
#   upgrade.sh 1.15.10
 | 
					#   upgrade.sh 1.15.10
 | 
				
			||||||
#   giteahome=/opt/gitea giteaconf=$giteahome/app.ini upgrade.sh
 | 
					#   giteahome=/opt/gitea giteaconf=$giteahome/app.ini upgrade.sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
while true; do
 | 
					# apply variables from environment
 | 
				
			||||||
  case "$1" in
 | 
					: "${giteabin:="/usr/local/bin/gitea"}"
 | 
				
			||||||
    -v | --version ) ver="$2"; shift 2 ;;
 | 
					: "${giteahome:="/var/lib/gitea"}"
 | 
				
			||||||
    -y | --yes ) no_confirm="yes"; shift ;;
 | 
					: "${giteaconf:="/etc/gitea/app.ini"}"
 | 
				
			||||||
    --ignore-gpg) ignore_gpg="yes"; shift ;;
 | 
					: "${giteauser:="git"}"
 | 
				
			||||||
    -- ) shift; break ;;
 | 
					: "${sudocmd:="sudo"}"
 | 
				
			||||||
    * ) break ;;
 | 
					: "${arch:="linux-amd64"}"
 | 
				
			||||||
  esac
 | 
					: "${service_start:="$sudocmd systemctl start gitea"}"
 | 
				
			||||||
done
 | 
					: "${service_stop:="$sudocmd systemctl stop gitea"}"
 | 
				
			||||||
 | 
					: "${service_status:="$sudocmd systemctl status gitea"}"
 | 
				
			||||||
set -euo pipefail
 | 
					: "${backupopts:=""}" # see `gitea dump --help` for available options
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function giteacmd {
 | 
				
			||||||
 | 
					  if [[ $sudocmd = "su" ]]; then
 | 
				
			||||||
 | 
					    "$sudocmd" - "$giteauser" -c "$giteabin" --config "$giteaconf" --work-path "$giteahome" "$@"
 | 
				
			||||||
 | 
					  else
 | 
				
			||||||
 | 
					    "$sudocmd" --user "$giteauser" "$giteabin" --config "$giteaconf" --work-path "$giteahome" "$@"
 | 
				
			||||||
 | 
					  fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function require {
 | 
					function require {
 | 
				
			||||||
  for exe in "$@"; do
 | 
					  for exe in "$@"; do
 | 
				
			||||||
@@ -30,8 +36,19 @@ function require {
 | 
				
			|||||||
  done
 | 
					  done
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# parse command line arguments
 | 
				
			||||||
 | 
					while true; do
 | 
				
			||||||
 | 
					  case "$1" in
 | 
				
			||||||
 | 
					    -v | --version ) giteaversion="$2"; shift 2 ;;
 | 
				
			||||||
 | 
					    -y | --yes ) no_confirm="yes"; shift ;;
 | 
				
			||||||
 | 
					    --ignore-gpg) ignore_gpg="yes"; shift ;;
 | 
				
			||||||
 | 
					    "" | -- ) shift; break ;;
 | 
				
			||||||
 | 
					    * ) echo "Usage:  [<environment vars>] upgrade.sh [-v <version>] [-y] [--ignore-gpg]"; exit 1;; 
 | 
				
			||||||
 | 
					  esac
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require curl xz sha256sum gpg
 | 
					# exit once any command fails. this means that each step should be idempotent!
 | 
				
			||||||
 | 
					set -euo pipefail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if [[ -f /etc/os-release ]]; then
 | 
					if [[ -f /etc/os-release ]]; then
 | 
				
			||||||
  os_release=$(cat /etc/os-release)
 | 
					  os_release=$(cat /etc/os-release)
 | 
				
			||||||
@@ -46,38 +63,17 @@ if [[ -f /etc/os-release ]]; then
 | 
				
			|||||||
  fi
 | 
					  fi
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					require curl xz sha256sum "$sudocmd"
 | 
				
			||||||
# apply variables from environment
 | 
					 | 
				
			||||||
: "${giteabin:="/usr/local/bin/gitea"}"
 | 
					 | 
				
			||||||
: "${giteahome:="/var/lib/gitea"}"
 | 
					 | 
				
			||||||
: "${giteaconf:="/etc/gitea/app.ini"}"
 | 
					 | 
				
			||||||
: "${giteauser:="git"}"
 | 
					 | 
				
			||||||
: "${sudocmd:="sudo"}"
 | 
					 | 
				
			||||||
: "${arch:="linux-amd64"}"
 | 
					 | 
				
			||||||
: "${service_start:="$sudocmd systemctl start gitea"}"
 | 
					 | 
				
			||||||
: "${service_stop:="$sudocmd systemctl stop gitea"}"
 | 
					 | 
				
			||||||
: "${service_status:="$sudocmd systemctl status gitea"}"
 | 
					 | 
				
			||||||
: "${backupopts:=""}" # see `gitea dump --help` for available options
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function giteacmd {
 | 
					 | 
				
			||||||
  if [[ $sudocmd = "su" ]]; then
 | 
					 | 
				
			||||||
    "$sudocmd" - "$giteauser" -c "$giteabin" --config "$giteaconf" --work-path "$giteahome" "$@"
 | 
					 | 
				
			||||||
  else
 | 
					 | 
				
			||||||
    "$sudocmd" --user "$giteauser" "$giteabin" --config "$giteaconf" --work-path "$giteahome" "$@"
 | 
					 | 
				
			||||||
  fi
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# select version to install
 | 
					# select version to install
 | 
				
			||||||
if [[ -z "${ver:-}" ]]; then
 | 
					if [[ -z "${giteaversion:-}" ]]; then
 | 
				
			||||||
  require jq
 | 
					  require jq
 | 
				
			||||||
  giteaversion=$(curl --connect-timeout 10 -sL https://dl.gitea.io/gitea/version.json | jq -r .latest.version)
 | 
					  giteaversion=$(curl --connect-timeout 10 -sL https://dl.gitea.io/gitea/version.json | jq -r .latest.version)
 | 
				
			||||||
else
 | 
					  echo "Latest available version is $giteaversion"
 | 
				
			||||||
  giteaversion="$ver"
 | 
					 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
# confirm update
 | 
					# confirm update
 | 
				
			||||||
 | 
					echo "Checking currently installed version..."
 | 
				
			||||||
current=$(giteacmd --version | cut -d ' ' -f 3)
 | 
					current=$(giteacmd --version | cut -d ' ' -f 3)
 | 
				
			||||||
[[ "$current" == "$giteaversion" ]] && echo "$current is already installed, stopping." && exit 1
 | 
					[[ "$current" == "$giteaversion" ]] && echo "$current is already installed, stopping." && exit 1
 | 
				
			||||||
if [[ -z "${no_confirm:-}"  ]]; then
 | 
					if [[ -z "${no_confirm:-}"  ]]; then
 | 
				
			||||||
@@ -98,22 +94,24 @@ binurl="https://dl.gitea.io/gitea/${giteaversion}/${binname}.xz"
 | 
				
			|||||||
echo "Downloading $binurl..."
 | 
					echo "Downloading $binurl..."
 | 
				
			||||||
curl --connect-timeout 10 --silent --show-error --fail --location -O "$binurl{,.sha256,.asc}"
 | 
					curl --connect-timeout 10 --silent --show-error --fail --location -O "$binurl{,.sha256,.asc}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# validate checksum & gpg signature (exit script if error)
 | 
					# validate checksum & gpg signature
 | 
				
			||||||
sha256sum -c "${binname}.xz.sha256"
 | 
					sha256sum -c "${binname}.xz.sha256"
 | 
				
			||||||
if [[ -z "${ignore_gpg:-}" ]]; then
 | 
					if [[ -z "${ignore_gpg:-}" ]]; then
 | 
				
			||||||
 | 
					  require gpg
 | 
				
			||||||
  gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2
 | 
					  gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2
 | 
				
			||||||
  gpg --verify "${binname}.xz.asc" "${binname}.xz" || { echo 'Signature does not match'; exit 1; }
 | 
					  gpg --verify "${binname}.xz.asc" "${binname}.xz" || { echo 'Signature does not match'; exit 1; }
 | 
				
			||||||
fi
 | 
					fi
 | 
				
			||||||
rm "${binname}".xz.{sha256,asc}
 | 
					rm "${binname}".xz.{sha256,asc}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# unpack binary + make executable
 | 
					# unpack binary + make executable
 | 
				
			||||||
xz --decompress "${binname}.xz"
 | 
					xz --decompress --force "${binname}.xz"
 | 
				
			||||||
chown "$giteauser" "$binname"
 | 
					chown "$giteauser" "$binname"
 | 
				
			||||||
chmod +x "$binname"
 | 
					chmod +x "$binname"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# stop gitea, create backup, replace binary, restart gitea
 | 
					# stop gitea, create backup, replace binary, restart gitea
 | 
				
			||||||
echo "Stopping gitea at $(date)"
 | 
					echo "Flushing gitea queues at $(date)"
 | 
				
			||||||
giteacmd manager flush-queues
 | 
					giteacmd manager flush-queues
 | 
				
			||||||
 | 
					echo "Stopping gitea at $(date)"
 | 
				
			||||||
$service_stop
 | 
					$service_stop
 | 
				
			||||||
echo "Creating backup in $giteahome"
 | 
					echo "Creating backup in $giteahome"
 | 
				
			||||||
giteacmd dump $backupopts
 | 
					giteacmd dump $backupopts
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user