#!/bin/bash # Copyright 2024 The Forgejo Authors # SPDX-License-Identifier: MIT LIB_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source $LIB_DIR/api.sh if ${VERBOSE:-false}; then set -ex PS4='${BASH_SOURCE[0]}:$LINENO: ${FUNCNAME[0]}: ' else set -e fi set -o pipefail export DEBIAN_FRONTEND=noninteractive if test $(id -u) != 0; then SUDO=sudo fi IP=$(hostname -I | cut -f1 -d' ') # # Forgejo releases for which a branch exists (7.0/forgejo etc.) # RELEASE_NUMBERS="7.0 8.0 9.0" PREFIX=============== export DIR=/tmp/forgejo-end-to-end DIR_BINARIES=/srv/forgejo-binaries export DOT_FORGEJO_CURL=$DIR/forgejo-curl export DOT=$DOT_FORGEJO_CURL # for backward compatibility with forgejo-curl.sh 1.0.0 : ${FORGEJO_USER:=root} : ${FORGEJO_PASSWORD:=admin1234} ORGANIZATIONS=$(cat $LIB_DIR/ORGANIZATIONS) function log_info() { echo "$PREFIX $@" } function dependencies() { if ! test -f /usr/local/bin/forgejo-curl.sh; then $SUDO curl --fail -sS https://code.forgejo.org/forgejo/forgejo-curl/raw/branch/main/forgejo-curl.sh -o /usr/local/bin/forgejo-curl.sh $SUDO chmod +x /usr/local/bin/forgejo-curl.sh fi if ! which make curl daemon git-lfs jq sqlite3 skopeo >/dev/null; then $SUDO apt-get update -qq $SUDO apt-get install -y -qq make curl daemon git-lfs jq sqlite3 skopeo fi if ! test -f /usr/local/bin/mc || ! test -f /usr/local/bin/minio; then $SUDO curl --fail -sS https://dl.min.io/client/mc/release/linux-amd64/mc -o /usr/local/bin/mc $SUDO curl --fail -sS https://dl.min.io/server/minio/release/linux-amd64/minio -o /usr/local/bin/minio fi if ! test -x /usr/local/bin/mc || ! test -x /usr/local/bin/minio; then $SUDO chmod +x /usr/local/bin/mc $SUDO chmod +x /usr/local/bin/minio fi if ! test -f /usr/local/bin/garage >/dev/null; then $SUDO curl --fail -sS https://garagehq.deuxfleurs.fr/_releases/v0.8.2/x86_64-unknown-linux-musl/garage -o /usr/local/bin/garage fi if ! test -x /usr/local/bin/garage >/dev/null; then $SUDO chmod +x /usr/local/bin/garage fi } function retry() { rm -f $DIR/wait-for.out success=false for delay in 1 1 5 5 15; do if "$@" >>$DIR/wait-for.out 2>&1; then success=true break fi cat $DIR/wait-for.out echo waiting $delay sleep $delay done if test $success = false; then cat $DIR/wait-for.out return 1 fi } function full_version() { local version=$1 local owner=$2 if [[ $version =~ ^[0-9]+\.[0-9]+$ ]]; then full_version=$(curl -sS "https://codeberg.org/api/v1/repos/$owner/forgejo/releases?limit=50" | jq -r '.[] | .tag_name | select(startswith("v'$version'"))' | sort --reverse --version-sort | head -1) echo ${full_version#v} else echo $version fi } function download_forgejo() { local version=$1 if ! test -f $DIR_BINARIES/forgejo-$version; then mkdir -p $DIR_BINARIES for owner in $ORGANIZATIONS; do full_version=$(full_version $version $owner) if test "$full_version" = ""; then continue fi if wget -O $DIR_BINARIES/forgejo-$version --quiet https://codeberg.org/$owner/forgejo/releases/download/v$full_version/forgejo-$full_version-linux-amd64; then break fi done if test -s $DIR_BINARIES/forgejo-$version; then if test "$version" != "$full_version"; then log_info "downloaded Forgejo $full_version for $version" fi else echo unable to download Forgejo $version return 1 fi chmod +x $DIR_BINARIES/forgejo-$version fi } function download_gitea() { local version=$1 if ! test -f $DIR_BINARIES/gitea-$version; then mkdir -p $DIR_BINARIES if [[ $version =~ ^[0-9]+\.[0-9]+$ ]]; then full_version=$(curl -sS "https://api.github.com/repos/go-gitea/gitea/releases?per_page=100" | jq -r '.[] | .tag_name | select(startswith("v'$version'"))' | grep -v -e '-rc' | sort --reverse --version-sort | head -1) full_version=${full_version#v} else full_version=$version fi wget -O $DIR_BINARIES/gitea-$version --quiet https://dl.gitea.com/gitea/$full_version/gitea-$full_version-linux-amd64 if test -s $DIR_BINARIES/gitea-$version; then if test "$version" != "$full_version"; then log_info "downloaded Gitea $full_version for $version" fi else echo unable to download Gitea $version return 1 fi chmod +x $DIR_BINARIES/gitea-$version fi } function cleanup_logs() { local config=$1 local base=$(work_path_base $config) local work_path=$DIR/$base rm -f $DIR/$base*.log rm -f $work_path/log/*.log } function clobber() { rm -fr /tmp/forgejo-end-to-end } : ${GITLAB_USER:=root} : ${GITLAB_PASSWORD:=Wrobyak4} : ${GITLAB_PORT:=8181} function start_gitlab_cache_load() { local image=$1 local d=$DIR_BINARIES/gitlab if test -d $d; then log_info "loading $image from $d" skopeo copy dir:$d docker-daemon:$image fi } function start_gitlab_cache_save() { local image=$1 local d=$DIR_BINARIES/gitlab if ! test -d $d; then log_info "saving $image to $d" skopeo copy docker-daemon:$image dir:$d fi } function start_gitlab() { local image=$1 local config=$2 start_gitlab_cache_load $image local GITLAB_OMNIBUS_CONFIG="nginx['listen_https'] = false ; nginx['listen_port'] = 8181 ; external_url 'http://$IP:$GITLAB_PORT'; gitlab_rails['gitlab_shell_ssh_port'] = 2221; $config" docker run --name="test-gitlab" --shm-size=128M -d \ -e GITLAB_OMNIBUS_CONFIG="$GITLAB_OMNIBUS_CONFIG" \ -p 2221:22 -p $GITLAB_PORT:8181 \ $image >&/dev/null /dev/null return 1 fi echo "$binary --config $work_path/app.ini --work-path $work_path" '"$@"' >$work_path/forgejocli chmod +x $work_path/forgejocli cp -a $work_path/forgejocli $DIR/forgejocli # because setup-forgejo/forgejo-runner.sh expects it here create_user_and_login $version $config } function start_minio() { mkdir -p $DIR/minio daemon --chdir=$DIR --unsafe \ --env="PATH=$PATH" \ --env=MINIO_ROOT_USER=123456 \ --env=MINIO_ROOT_PASSWORD=12345678 \ --env=MINIO_VOLUMES=$DIR/minio \ --pidfile=$DIR/minio-pid --errlog=$DIR/minio-err.log --output=$DIR/minio-out.log -- /usr/local/bin/minio server retry mc alias set testS3 http://127.0.0.1:9000 123456 12345678 >&/dev/null mc alias set testS3 http://127.0.0.1:9000 123456 12345678 } function start_garage() { mkdir -p $DIR/garage/{data,meta} cat >$DIR/garage/garage.toml <$work_path/app.ini } function reset_minio() { rm -fr $DIR/minio } function reset_garage() { rm -fr $DIR/garage } function create_user_and_login() { local version=$1 local config=$2 local work_path=$DIR/$(work_path_base $config) local email="$FORGEJO_USER@example.com" if ! $work_path/forgejocli admin user list | grep --quiet "$email"; then $work_path/forgejocli admin user create --admin --username "$FORGEJO_USER" --password "$FORGEJO_PASSWORD" --email $email fi forgejo-curl.sh logout local scopes='--scopes ["all"]' if echo $version | grep --quiet 1.18; then scopes="" fi forgejo-curl.sh --user "$FORGEJO_USER" --password "$FORGEJO_PASSWORD" $scopes login http://$(get_host_port $config) local forgejo_curl=$work_path/forgejo-curl.sh cat >$forgejo_curl <$DIR/$fun.out tail --follow $DIR/$fun.out |& sed --unbuffered -n -e "/^$PREFIX/s/^$PREFIX //p" & local pid=$! if ! VERBOSE=true $SELF $fun "$@" >&$DIR/$fun.out; then kill $pid cat $DIR/$fun.out echo Failure running $fun return 1 fi kill $pid echo Success running $fun }