[BRANDING] adapt forgejo/contrib/upgrade.sh

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

(cherry picked from commit ab986185d0)
(cherry picked from commit 6068aed2a7)
(cherry picked from commit 0cbd599c0c)
(cherry picked from commit c3ef135882)
(cherry picked from commit 0ba7194fa1)
(cherry picked from commit 572a2a5125)
(cherry picked from commit dd0a7265e1)
(cherry picked from commit 06bd195f4e)
(cherry picked from commit 7f6100ab6b)
(cherry picked from commit 58af04560a)
(cherry picked from commit 6f73637aab)
This commit is contained in:
lauralani 2023-03-29 10:21:43 +02:00 committed by Earl Warren
parent 8d4c08fbb2
commit d35390e97e
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00

View file

@ -1,42 +1,42 @@
#!/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.com 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
# Check if gitea service is running # Check if forgejo service is running
if ! pidof gitea &> /dev/null; then if ! pidof forgejo &> /dev/null; then
echo "Error: gitea is not running." echo "Error: forgejo is not running."
exit 1 exit 1
fi fi
# Continue with rest of the script if gitea is running # Continue with rest of the script if forgejo is running
echo "Gitea is running. Continuing with rest of script..." echo "Forgejo is running. Continuing with rest of script..."
# 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
} }
@ -49,7 +49,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 ;;
@ -65,9 +65,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
@ -76,31 +76,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.com/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.com/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}"
@ -108,28 +108,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