mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-10-23 18:42:26 +00:00
Reviewed at: https://codeberg.org/forgejo/forgejo/pulls/605 (cherry picked from commitab986185d0) (cherry picked from commit6068aed2a7) (cherry picked from commit0cbd599c0c) (cherry picked from commitc3ef135882) (cherry picked from commit0ba7194fa1) (cherry picked from commit572a2a5125) (cherry picked from commitdd0a7265e1) (cherry picked from commit06bd195f4e) (cherry picked from commit7f6100ab6b) (cherry picked from commit58af04560a) (cherry picked from commit67a951f726) (cherry picked from commit46e68309ad) (cherry picked from commit9002654915) (cherry picked from commit3f1a3a1311) (cherry picked from commitdf1716deb4) (cherry picked from commit8ace62b413) (cherry picked from commit30ab21f264) (cherry picked from commit7ec99bfc0d) (cherry picked from commit47a554c9b4) (cherry picked from commitc5aaf49d88) (cherry picked from commit7fb42a78a4) (cherry picked from commit336fd64a1f) (cherry picked from commita7d590f7d7) (cherry picked from commitb6aa4a40e4) (cherry picked from commitfc195b0349) (cherry picked from commit3c6799ad04) (cherry picked from commit86830ae32b) (cherry picked from commite70eb6a277) (cherry picked from commitb18596eb91) (cherry picked from commit4a54f7f860) (cherry picked from commita3a9885249) (cherry picked from commitec8bbabf34) (cherry picked from commit5b239033b6) (cherry picked from commitb1fa48e260) (cherry picked from commit148f366431) (cherry picked from commit79e10923c1) (cherry picked from commit7aa72a9b4f) (cherry picked from commit5be4a1da1b) (cherry picked from commit2297cfcca9) (cherry picked from commit111f5c1044) (cherry picked from commitbaa9877bfe) (cherry picked from commit085050da1f)
135 lines
4.7 KiB
Bash
Executable file
135 lines
4.7 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# This is an update script for forgejo installed via the binary distribution
|
|
# from codeberg.org/forgejo/forgejo on linux as systemd service. It
|
|
# performs a backup and updates Forgejo in place.
|
|
# NOTE: This adds the GPG Signing Key of the Forgejo maintainers to the keyring.
|
|
# Depends on: bash, curl, xz, sha256sum. optionally jq, gpg
|
|
# See section below for available environment vars.
|
|
# When no version is specified, updates to the latest release.
|
|
# Examples:
|
|
# upgrade.sh 1.15.10
|
|
# forgejohome=/opt/forgejo forgejoconf=$forgejohome/app.ini upgrade.sh
|
|
|
|
# Check if forgejo service is running
|
|
if ! pidof forgejo &> /dev/null; then
|
|
echo "Error: forgejo is not running."
|
|
exit 1
|
|
fi
|
|
|
|
# Continue with rest of the script if forgejo is running
|
|
echo "Forgejo is running. Continuing with rest of script..."
|
|
|
|
# apply variables from environment
|
|
: "${forgejobin:="/usr/local/bin/forgejo"}"
|
|
: "${forgejohome:="/var/lib/forgejo"}"
|
|
: "${forgejoconf:="/etc/forgejo/app.ini"}"
|
|
: "${forgejouser:="git"}"
|
|
: "${sudocmd:="sudo"}"
|
|
: "${arch:="linux-amd64"}"
|
|
: "${service_start:="$sudocmd systemctl start forgejo"}"
|
|
: "${service_stop:="$sudocmd systemctl stop forgejo"}"
|
|
: "${service_status:="$sudocmd systemctl status forgejo"}"
|
|
: "${backupopts:=""}" # see `forgejo dump --help` for available options
|
|
|
|
function forgejocmd {
|
|
if [[ $sudocmd = "su" ]]; then
|
|
# `-c` only accept one string as argument.
|
|
"$sudocmd" - "$forgejouser" -c "$(printf "%q " "$forgejobin" "--config" "$forgejoconf" "--work-path" "$forgejohome" "$@")"
|
|
else
|
|
"$sudocmd" --user "$forgejouser" "$forgejobin" --config "$forgejoconf" --work-path "$forgejohome" "$@"
|
|
fi
|
|
}
|
|
|
|
function require {
|
|
for exe in "$@"; do
|
|
command -v "$exe" &>/dev/null || (echo "missing dependency '$exe'"; exit 1)
|
|
done
|
|
}
|
|
|
|
# parse command line arguments
|
|
while true; do
|
|
case "$1" in
|
|
-v | --version ) forgejoversion="$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
|
|
|
|
# exit once any command fails. this means that each step should be idempotent!
|
|
set -euo pipefail
|
|
|
|
if [[ -f /etc/os-release ]]; then
|
|
os_release=$(cat /etc/os-release)
|
|
|
|
if [[ "$os_release" =~ "OpenWrt" ]]; then
|
|
sudocmd="su"
|
|
service_start="/etc/init.d/forgejo start"
|
|
service_stop="/etc/init.d/forgejo stop"
|
|
service_status="/etc/init.d/forgejo status"
|
|
else
|
|
require systemctl
|
|
fi
|
|
fi
|
|
|
|
require curl xz sha256sum "$sudocmd"
|
|
|
|
# select version to install
|
|
if [[ -z "${forgejoversion:-}" ]]; then
|
|
require jq
|
|
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 $forgejoversion"
|
|
fi
|
|
|
|
# confirm update
|
|
echo "Checking currently installed version..."
|
|
current=$(forgejocmd --version | cut -d ' ' -f 3)
|
|
[[ "$current" == "$forgejoversion" ]] && echo "$current is already installed, stopping." && exit 1
|
|
if [[ -z "${no_confirm:-}" ]]; then
|
|
echo "Make sure to read the changelog first: https://codeberg.org/forgejo/forgejo/src/branch/forgejo/CHANGELOG.md"
|
|
echo "Are you ready to update forgejo from ${current} to ${forgejoversion}? (y/N)"
|
|
read -r confirm
|
|
[[ "$confirm" == "y" ]] || [[ "$confirm" == "Y" ]] || exit 1
|
|
fi
|
|
|
|
echo "Upgrading forgejo from $current to $forgejoversion ..."
|
|
|
|
pushd "$(pwd)" &>/dev/null
|
|
cd "$forgejohome" # needed for forgejo dump later
|
|
|
|
# download new binary
|
|
binname="forgejo-${forgejoversion}-${arch}"
|
|
binurl="https://codeberg.org/forgejo/forgejo/releases/download/v${forgejoversion}/${binname}.xz"
|
|
echo "Downloading $binurl..."
|
|
curl --connect-timeout 10 --silent --show-error --fail --location -O "$binurl{,.sha256,.asc}"
|
|
|
|
# validate checksum & gpg signature
|
|
sha256sum -c "${binname}.xz.sha256"
|
|
if [[ -z "${ignore_gpg:-}" ]]; then
|
|
require gpg
|
|
gpg --keyserver keys.openpgp.org --recv EB114F5E6C0DC2BCDD183550A4B61A2DC5923710
|
|
gpg --verify "${binname}.xz.asc" "${binname}.xz" || { echo 'Signature does not match'; exit 1; }
|
|
fi
|
|
rm "${binname}".xz.{sha256,asc}
|
|
|
|
# unpack binary + make executable
|
|
xz --decompress --force "${binname}.xz"
|
|
chown "$forgejouser" "$binname"
|
|
chmod +x "$binname"
|
|
|
|
# stop forgejo, create backup, replace binary, restart forgejo
|
|
echo "Flushing forgejo queues at $(date)"
|
|
forgejocmd manager flush-queues
|
|
echo "Stopping forgejo at $(date)"
|
|
$service_stop
|
|
echo "Creating backup in $forgejohome"
|
|
forgejocmd dump $backupopts
|
|
echo "Updating binary at $forgejobin"
|
|
cp -f "$forgejobin" "$forgejobin.bak" && mv -f "$binname" "$forgejobin"
|
|
$service_start
|
|
$service_status
|
|
|
|
echo "Upgrade to $forgejoversion successful!"
|
|
|
|
popd
|