[BRANDING] adapt forgejo/contrib/upgrade.sh

Reviewed at: https://codeberg.org/forgejo/forgejo/pulls/605

(cherry picked from commit fb14bcd800)
This commit is contained in:
lauralani 2023-03-29 10:21:43 +02:00 committed by Loïc Dachary
parent 39de9bda2a
commit f9d9edb118
No known key found for this signature in database
GPG key ID: 992D23B392F9E4F2

View file

@ -1,33 +1,33 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# This is an update script for gitea installed via the binary distribution # This is an update script for forgejo installed via the binary distribution
# from dl.gitea.io on linux as systemd service. It performs a backup and updates # from codeberg.org/forgejo/forgejo on linux as systemd service. It
# Gitea in place. # performs a backup and updates Forgejo 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 Forgejo maintainers to the keyring.
# Depends on: bash, curl, xz, sha256sum. optionally jq, gpg # Depends on: bash, curl, xz, sha256sum. optionally jq, gpg
# 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 # forgejohome=/opt/forgejo forgejoconf=$forgejohome/app.ini upgrade.sh
# apply variables from environment # apply variables from environment
: "${giteabin:="/usr/local/bin/gitea"}" : "${forgejobin:="/usr/local/bin/forgejo"}"
: "${giteahome:="/var/lib/gitea"}" : "${forgejohome:="/var/lib/forgejo"}"
: "${giteaconf:="/etc/gitea/app.ini"}" : "${forgejoconf:="/etc/forgejo/app.ini"}"
: "${giteauser:="git"}" : "${forgejouser:="git"}"
: "${sudocmd:="sudo"}" : "${sudocmd:="sudo"}"
: "${arch:="linux-amd64"}" : "${arch:="linux-amd64"}"
: "${service_start:="$sudocmd systemctl start gitea"}" : "${service_start:="$sudocmd systemctl start forgejo"}"
: "${service_stop:="$sudocmd systemctl stop gitea"}" : "${service_stop:="$sudocmd systemctl stop forgejo"}"
: "${service_status:="$sudocmd systemctl status gitea"}" : "${service_status:="$sudocmd systemctl status forgejo"}"
: "${backupopts:=""}" # see `gitea dump --help` for available options : "${backupopts:=""}" # see `forgejo dump --help` for available options
function giteacmd { function forgejocmd {
if [[ $sudocmd = "su" ]]; then if [[ $sudocmd = "su" ]]; then
# `-c` only accept one string as argument. # `-c` only accept one string as argument.
"$sudocmd" - "$giteauser" -c "$(printf "%q " "$giteabin" "--config" "$giteaconf" "--work-path" "$giteahome" "$@")" "$sudocmd" - "$forgejouser" -c "$(printf "%q " "$forgejobin" "--config" "$forgejoconf" "--work-path" "$forgejohome" "$@")"
else else
"$sudocmd" --user "$giteauser" "$giteabin" --config "$giteaconf" --work-path "$giteahome" "$@" "$sudocmd" --user "$forgejouser" "$forgejobin" --config "$forgejoconf" --work-path "$forgejohome" "$@"
fi fi
} }
@ -40,7 +40,7 @@ function require {
# parse command line arguments # parse command line arguments
while true; do while true; do
case "$1" in case "$1" in
-v | --version ) giteaversion="$2"; shift 2 ;; -v | --version ) forgejoversion="$2"; shift 2 ;;
-y | --yes ) no_confirm="yes"; shift ;; -y | --yes ) no_confirm="yes"; shift ;;
--ignore-gpg) ignore_gpg="yes"; shift ;; --ignore-gpg) ignore_gpg="yes"; shift ;;
"" | -- ) shift; break ;; "" | -- ) shift; break ;;
@ -56,9 +56,9 @@ if [[ -f /etc/os-release ]]; then
if [[ "$os_release" =~ "OpenWrt" ]]; then if [[ "$os_release" =~ "OpenWrt" ]]; then
sudocmd="su" sudocmd="su"
service_start="/etc/init.d/gitea start" service_start="/etc/init.d/forgejo start"
service_stop="/etc/init.d/gitea stop" service_stop="/etc/init.d/forgejo stop"
service_status="/etc/init.d/gitea status" service_status="/etc/init.d/forgejo status"
else else
require systemctl require systemctl
fi fi
@ -67,31 +67,31 @@ fi
require curl xz sha256sum "$sudocmd" require curl xz sha256sum "$sudocmd"
# select version to install # select version to install
if [[ -z "${giteaversion:-}" ]]; then if [[ -z "${forgejoversion:-}" ]]; then
require jq require jq
giteaversion=$(curl --connect-timeout 10 -sL https://dl.gitea.io/gitea/version.json | jq -r .latest.version) forgejoversion=$(curl --connect-timeout 10 -sL 'https://codeberg.org/api/v1/repos/forgejo/forgejo/releases?draft=false&pre-release=false&limit=1' -H 'accept: application/json' | jq -r '.[0].tag_name | sub("v"; "")')
echo "Latest available version is $giteaversion" echo "Latest available version is $forgejoversion"
fi fi
# confirm update # confirm update
echo "Checking currently installed version..." echo "Checking currently installed version..."
current=$(giteacmd --version | cut -d ' ' -f 3) current=$(forgejocmd --version | cut -d ' ' -f 3)
[[ "$current" == "$giteaversion" ]] && echo "$current is already installed, stopping." && exit 1 [[ "$current" == "$forgejoversion" ]] && echo "$current is already installed, stopping." && exit 1
if [[ -z "${no_confirm:-}" ]]; then if [[ -z "${no_confirm:-}" ]]; then
echo "Make sure to read the changelog first: https://github.com/go-gitea/gitea/blob/main/CHANGELOG.md" echo "Make sure to read the changelog first: https://codeberg.org/forgejo/forgejo/src/branch/forgejo/CHANGELOG.md"
echo "Are you ready to update Gitea from ${current} to ${giteaversion}? (y/N)" echo "Are you ready to update forgejo from ${current} to ${forgejoversion}? (y/N)"
read -r confirm read -r confirm
[[ "$confirm" == "y" ]] || [[ "$confirm" == "Y" ]] || exit 1 [[ "$confirm" == "y" ]] || [[ "$confirm" == "Y" ]] || exit 1
fi fi
echo "Upgrading gitea from $current to $giteaversion ..." echo "Upgrading forgejo from $current to $forgejoversion ..."
pushd "$(pwd)" &>/dev/null pushd "$(pwd)" &>/dev/null
cd "$giteahome" # needed for gitea dump later cd "$forgejohome" # needed for forgejo dump later
# download new binary # download new binary
binname="gitea-${giteaversion}-${arch}" binname="forgejo-${forgejoversion}-${arch}"
binurl="https://dl.gitea.io/gitea/${giteaversion}/${binname}.xz" binurl="https://codeberg.org/forgejo/forgejo/releases/download/v${forgejoversion}/${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}"
@ -99,28 +99,28 @@ curl --connect-timeout 10 --silent --show-error --fail --location -O "$binurl{,.
sha256sum -c "${binname}.xz.sha256" sha256sum -c "${binname}.xz.sha256"
if [[ -z "${ignore_gpg:-}" ]]; then if [[ -z "${ignore_gpg:-}" ]]; then
require gpg require gpg
gpg --keyserver keys.openpgp.org --recv 7C9E68152594688862D62AF62D9AE806EC1592E2 gpg --keyserver keys.openpgp.org --recv EB114F5E6C0DC2BCDD183550A4B61A2DC5923710
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 --force "${binname}.xz" xz --decompress --force "${binname}.xz"
chown "$giteauser" "$binname" chown "$forgejouser" "$binname"
chmod +x "$binname" chmod +x "$binname"
# stop gitea, create backup, replace binary, restart gitea # stop forgejo, create backup, replace binary, restart forgejo
echo "Flushing gitea queues at $(date)" echo "Flushing forgejo queues at $(date)"
giteacmd manager flush-queues forgejocmd manager flush-queues
echo "Stopping gitea at $(date)" echo "Stopping forgejo at $(date)"
$service_stop $service_stop
echo "Creating backup in $giteahome" echo "Creating backup in $forgejohome"
giteacmd dump $backupopts forgejocmd dump $backupopts
echo "Updating binary at $giteabin" echo "Updating binary at $forgejobin"
cp -f "$giteabin" "$giteabin.bak" && mv -f "$binname" "$giteabin" cp -f "$forgejobin" "$forgejobin.bak" && mv -f "$binname" "$forgejobin"
$service_start $service_start
$service_status $service_status
echo "Upgrade to $giteaversion successful!" echo "Upgrade to $forgejoversion successful!"
popd popd