forked from NYANDEV/forgejo
84 lines
2.9 KiB
Bash
84 lines
2.9 KiB
Bash
|
#!/usr/bin/env bash
|
||
|
set -euo pipefail
|
||
|
|
||
|
# This is an update script for gitea installed via the binary distribution
|
||
|
# from dl.gitea.io on linux as systemd service. It performs a backup and updates
|
||
|
# Gitea in place.
|
||
|
# NOTE: This adds the GPG Signing Key of the Gitea maintainers to the keyring.
|
||
|
# Depends on: bash, curl, xz, sha256sum, gpg. optionally jq.
|
||
|
# Usage: [environment vars] upgrade.sh [version]
|
||
|
# See section below for available environment vars.
|
||
|
# When no version is specified, updates to the latest release.
|
||
|
# Examples:
|
||
|
# upgrade.sh 1.15.10
|
||
|
# giteahome=/opt/gitea giteaconf=$giteahome/app.ini upgrade.sh
|
||
|
|
||
|
# 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"}"
|
||
|
: "${backupopts:=""}" # see `gitea dump --help` for available options
|
||
|
|
||
|
function giteacmd {
|
||
|
"$sudocmd" --user "$giteauser" "$giteabin" --config "$giteaconf" --work-path "$giteahome" "$@"
|
||
|
}
|
||
|
|
||
|
function require {
|
||
|
for exe in "$@"; do
|
||
|
command -v "$exe" &>/dev/null || (echo "missing dependency '$exe'"; exit 1)
|
||
|
done
|
||
|
}
|
||
|
require systemctl curl xz sha256sum gpg "$sudocmd"
|
||
|
|
||
|
# select version to install
|
||
|
if [[ -z "${1:-}" ]]; then
|
||
|
require jq
|
||
|
giteaversion=$(curl --connect-timeout 10 -sL https://dl.gitea.io/gitea/version.json | jq -r .latest.version)
|
||
|
else
|
||
|
giteaversion="$1"
|
||
|
fi
|
||
|
|
||
|
# confirm update
|
||
|
current=$(giteacmd --version | cut --delimiter=' ' --fields=3)
|
||
|
[[ "$current" == "$giteaversion" ]] && echo "$current is already installed, stopping." && exit 1
|
||
|
echo "Make sure to read the changelog first: https://github.com/go-gitea/gitea/blob/main/CHANGELOG.md"
|
||
|
echo "Are you ready to update Gitea from ${current} to ${giteaversion}? (y/N)"
|
||
|
read -r confirm
|
||
|
[[ "$confirm" == "y" ]] || [[ "$confirm" == "Y" ]] || exit 1
|
||
|
|
||
|
pushd "$(pwd)" &>/dev/null
|
||
|
cd "$giteahome" # needed for gitea dump later
|
||
|
|
||
|
# download new binary
|
||
|
binname="gitea-${giteaversion}-${arch}"
|
||
|
binurl="https://dl.gitea.io/gitea/${giteaversion}/${binname}.xz"
|
||
|
echo "Downloading $binurl..."
|
||
|
curl --connect-timeout 10 --silent --show-error --fail --location -O "$binurl{,.sha256,.asc}"
|
||
|
|
||
|
# validate checksum & gpg signature (exit script if error)
|
||
|
sha256sum --check "${binname}.xz.sha256"
|
||
|
gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2
|
||
|
gpg --verify "${binname}.xz.asc" "${binname}.xz" || { echo 'Signature does not match'; exit 1; }
|
||
|
rm "${binname}".xz.{sha256,asc}
|
||
|
|
||
|
# unpack binary + make executable
|
||
|
xz --decompress "${binname}.xz"
|
||
|
chown "$giteauser" "$binname"
|
||
|
chmod +x "$binname"
|
||
|
|
||
|
# stop gitea, create backup, replace binary, restart gitea
|
||
|
echo "Stopping gitea at $(date)"
|
||
|
giteacmd manager flush-queues
|
||
|
$sudocmd systemctl stop gitea
|
||
|
echo "Creating backup in $giteahome"
|
||
|
giteacmd dump $backupopts
|
||
|
echo "Updating binary at $giteabin"
|
||
|
mv --force --backup "$binname" "$giteabin"
|
||
|
$sudocmd systemctl start gitea
|
||
|
$sudocmd systemctl status gitea
|
||
|
|
||
|
popd
|