setup-forgejo/forgejo-binary.sh

124 lines
3.4 KiB
Bash
Executable file

#!/bin/bash
# SPDX-License-Identifier: MIT
set -e
SELF_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $SELF_DIR/forgejo-lib.sh
: ${DIR:=/tmp/forgejo-binary}
if ${VERBOSE:-false}; then set -x; fi
function maybe_sudo() {
if test $(id -u) != 0 ; then
SUDO=sudo
fi
}
function ensure_user() {
local user=$1
dependencies
adduser --quiet --gecos $user --disabled-password $user
adduser $user sudo
adduser $user docker
sed -i -e 's/^%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/' /etc/sudoers
}
function dependencies() {
maybe_sudo
if ! which sudo curl daemon jq git-lfs ip sqlite3 envsubst unzip > /dev/null ; then
$SUDO apt-get update -qq
$SUDO apt-get -q install -y -qq sudo curl daemon jq git-lfs iproute2 sqlite3 gettext-base unzip
fi
}
function cleanup_logs() {
local work_path=$DIR/forgejo-work-path
rm -f $DIR/*.log
rm -f $work_path/log/*.log
}
function download() {
local url="$1"
if ! test -f $DIR/forgejo ; then
curl -sS $url > $DIR/forgejo.tmp
if file $DIR/forgejo.tmp | grep --quiet 'Zip archive' ; then
unzip $DIR/forgejo.tmp -d $DIR
rm -f $DIR/forgejo.tmp
else
mv $DIR/forgejo.tmp $DIR/forgejo
fi
chmod +x $DIR/forgejo
fi
echo $DIR/forgejo --version
$DIR/forgejo --version
}
function create_user() {
local user="$1"
local password="$2"
local work_path=$DIR/forgejo-work-path
if test -f $work_path/forgejo-token; then
return
fi
$DIR/forgejocli admin user create --admin --username "$user" --password "$password" --email "$user@example.com"
$DIR/forgejocli admin user generate-access-token -u "$user" --raw --scopes all > $DIR/forgejo-token
local url="http://$(cat $DIR/forgejo-ip):3000"
echo "$url" > $DIR/forgejo-url
echo "http://${user}:${password}@$(cat $DIR/forgejo-ip):3000" > $DIR/forgejo-auth-url
retry forgejo-curl.sh --user "$user" --password "$password" --token @$DIR/forgejo-token login "$url"
echo forgejo-curl.sh api_json $url/api/forgejo/v1/version
forgejo-curl.sh api_json $url/api/forgejo/v1/version
}
function myip() {
hostname -I | cut -f1 -d' '
}
function start_forgejo() {
local work_path=$DIR/forgejo-work-path
daemon --chdir=$DIR --unsafe --env="TERM=$TERM" --env="HOME=$HOME" --env="PATH=$PATH" --pidfile=$DIR/forgejo-pid --errlog=$DIR/forgejo-err.log --output=$DIR/forgejo-out.log -- $DIR/forgejo --config $work_path/app.ini --work-path $work_path
if ! retry grep 'Starting server on' $work_path/log/forgejo.log ; then
cat $DIR/*.log
cat $work_path/log/*.log
return 1
fi
echo "$DIR/forgejo --config $work_path/app.ini --work-path $work_path" '"$@"' > $DIR/forgejocli
chmod +x $DIR/forgejocli
myip > $DIR/forgejo-ip
}
function reset_forgejo() {
local config=$1
local work_path=$DIR/forgejo-work-path
rm -fr $work_path
mkdir -p $work_path
IP=$(myip) WORK_PATH=$work_path envsubst < $SELF_DIR/$config-app.ini > $work_path/app.ini
}
function teardown() {
stop_daemon forgejo $DIR
cleanup_logs
}
function setup() {
local user="${1:-root}"
local password="${2:-admin1234}"
local url="${3:-https://codeberg.org/forgejo/forgejo/releases/download/v1.21.2-1/forgejo-1.21.2-1-linux-amd64}"
dependencies
download "$url"
reset_forgejo forgejo-binary
start_forgejo
create_user "$user" "$password"
}
mkdir -p $DIR
"$@"