mirror of
				https://github.com/go-gitea/gitea
				synced 2025-10-31 11:28:24 +00: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