setup-forgejo/forgejo-test-helper.sh

171 lines
3.5 KiB
Bash
Raw Normal View History

#!/bin/bash
2023-04-01 05:08:06 -04:00
# SPDX-License-Identifier: MIT
set -ex
: ${LOOPS:=40}
: ${LOOP_DELAY:=10}
DIR=$(mktemp -d)
trap "rm -fr $DIR" EXIT
2023-04-05 08:49:04 -04:00
function dependency_go() {
go_version="1.21.0.linux-amd64" # Set the desired Go version here
2023-04-05 08:49:04 -04:00
if ! which go > /dev/null ; then
apt-get update
2023-04-05 08:49:04 -04:00
apt-get install -y -qq wget tar
wget --quiet "https://go.dev/dl/go$go_version.tar.gz"
tar zxf "go$go_version.tar.gz"
export PATH="$PATH:$(pwd)/go/bin"
2023-04-05 08:49:04 -04:00
fi
}
function checkout() {
local git="$1"
rm -fr forgejo-runner
git clone $git forgejo-runner
2023-04-05 08:49:04 -04:00
}
function build_runner() {
2023-04-05 08:49:04 -04:00
local git="$1"
local version="${2:-main}"
2023-04-05 08:49:04 -04:00
(
checkout "$git"
dependency_go
2023-04-05 08:49:04 -04:00
cd forgejo-runner
git checkout "$version"
make build
)
export PATH=$PATH:$(pwd)/forgejo-runner
forgejo-runner --version
2023-04-05 08:49:04 -04:00
}
2023-04-02 10:02:16 -04:00
function api() {
method=$1
shift
url=$1
shift
path=$1
shift
token=$1
2023-06-14 16:00:42 -04:00
shift
2023-04-02 10:02:16 -04:00
curl --fail -X $method -sS -H "Content-Type: application/json" -H "Authorization: token $token" "$@" $url/api/v1/$path
}
function check_status() {
local url="$1"
local repo="$2"
local sha="$3"
2023-04-02 10:02:16 -04:00
local state=$(api GET $url repos/$repo/commits/$sha/status | jq --raw-output .state)
echo $state
test "$state" != "" -a "$state" != "pending" -a "$state" != "running" -a "$state" != "null"
}
function wait_success() {
local url="$1"
local repo="$2"
local sha="$3"
for i in $(seq $LOOPS); do
if check_status "$url" "$repo" "$sha"; then
break
fi
test "$FORGEJO_RUNNER_LOGS" && tail $FORGEJO_RUNNER_LOGS
sleep $LOOP_DELAY
done
if ! test "$(check_status "$url" "$repo" "$sha")" = "success" ; then
test "$FORGEJO_RUNNER_LOGS" && cat $FORGEJO_RUNNER_LOGS
api GET $url repos/$repo/commits/$sha/status | jq .
return 1
fi
}
function push() {
local directory="$1"
local url="$2"
local owner="$3"
local project="$4"
local self_action="$5"
2023-03-30 10:11:04 -04:00
local token="$6"
local dir="$DIR/$project"
rsync -a --exclude .git $directory/ $dir/
local workflows=$dir/.forgejo/workflows/*.yml
if test "$(echo $workflows)" != "$workflows"; then
sed -i \
2023-03-30 10:11:04 -04:00
-e "s|SELF|$url/$owner/$self_action|g" \
-e "s|FORGEJO_TOKEN|$token|g" \
$dir/.forgejo/workflows/*.yml
fi
(
cd $dir
git init
git checkout -b main
git config user.email root@example.com
git config user.name username
git add .
git commit -m 'initial commit'
git remote add origin $url/$owner/$project
git push --force -u origin main
2023-03-29 17:33:49 -04:00
sha=$(git rev-parse HEAD)
echo $sha > SHA
echo sha=$sha
)
}
function run_workflow() {
local directory="$1"
local url="$2"
local owner="$3"
local project="$4"
local self_action="$5"
2023-03-30 10:11:04 -04:00
local token="$6"
if test -z "$token"; then
echo missing token argument
return 1
fi
2023-03-30 10:11:04 -04:00
push "$directory" "$url" "$owner" "$project" "$self_action" "$token"
wait_success "$url" "$owner/$project" $(cat $DIR/$project/SHA)
}
function push_self_action() {
local url="$1"
local owner="$2"
local self_action="$3"
local tag="$4"
local dir="$DIR/self"
2023-05-21 16:58:27 -04:00
git clone . $dir
(
cd $dir
2023-05-21 16:58:27 -04:00
rm -fr .forgejo .git
git init
git checkout -b main
git remote add origin "$url/$owner/$self_action"
git config user.email root@example.com
git config user.name username
git add .
git commit -m 'initial commit'
git push --force origin main
git tag --force $tag HEAD
git push --force origin $tag
)
}
function dependencies() {
if ! which jq curl > /dev/null ; then
apt-get -qq install -y jq curl
fi
}
dependencies
"$@"