setup-forgejo/forgejo-test-helper.sh
Earl Warren 87d8b85700
cleanup the runner cache when uploading self action
if the cache is not cleared, the action that was just uploaded
with the latest changes won't be used, the cached version will.
2023-10-12 15:47:32 +02:00

217 lines
4.7 KiB
Bash
Executable file

#!/bin/bash
# SPDX-License-Identifier: MIT
set -ex
export DEBIAN_FRONTEND=noninteractive
: ${LOOPS:=80}
: ${LOOP_DELAY:=5}
DIR=$(mktemp -d)
trap "rm -fr $DIR" EXIT
function dependency_go() {
go_version="1.21.1.linux-amd64" # Set the desired Go version here
if ! which go > /dev/null ; then
apt-get update
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="$(pwd)/go/bin:$PATH"
fi
}
function checkout() {
local git="$1"
rm -fr forgejo-runner
git clone $git forgejo-runner
}
function build_runner() {
local git="$1"
local version="${2:-main}"
(
checkout "$git"
dependency_go
cd forgejo-runner
git checkout "$version"
make build
)
export PATH=$PATH:$(pwd)/forgejo-runner
forgejo-runner --version
}
function branch_tip() {
local url="$1"
local repo="$2"
local branch="$3"
forgejo.sh retry forgejo-curl.sh api_json $url/api/v1/repos/$repo/branches/$branch >& /dev/null
forgejo-curl.sh api_json $url/api/v1/repos/$repo/branches/$branch | jq --raw-output .commit.id
}
function get_status() {
local url="$1"
local repo="$2"
local sha="$3"
forgejo-curl.sh api_json $url/api/v1/repos/$repo/commits/$sha/status
}
function check_status() {
local url="$1"
local repo="$2"
local sha="$3"
local expected_status="$4"
local expected_description="$5"
get_status $url $repo $sha > /tmp/status.json
local status="$(jq --raw-output .state < /tmp/status.json)"
local description="$(jq --raw-output .statuses[0].description < /tmp/status.json)"
if test "$status" = "$expected_status" && test -z "$expected_description" -o "$description" = "$expected_description"; then
echo OK
elif test "$status" = "failure" -o "$status" = "success"; then
echo NOK
else
echo RETRY
fi
}
function wait_success() {
wait_status success "$@"
}
function wait_failure() {
wait_status failure "$@"
}
function wait_running() {
wait_status pending "$@" "Has started running"
}
function wait_status() {
local status="$1"
local url="$2"
local repo="$3"
local sha="$4"
local description="$5"
for i in $(seq $LOOPS); do
if test $(check_status "$url" "$repo" "$sha" "$status" "$description") != RETRY ; then
break
fi
test "$FORGEJO_RUNNER_LOGS" && tail $FORGEJO_RUNNER_LOGS
sleep $LOOP_DELAY
done
if test $(check_status "$url" "$repo" "$sha" "$status" "$description") != "OK" ; then
get_status $url $repo $sha | jq .statuses
test "$FORGEJO_RUNNER_LOGS" && cat $FORGEJO_RUNNER_LOGS
return 1
fi
}
function push() {
local directory="$1"
local url="$2"
local owner="$3"
local project="$4"
local self_action="$5"
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 \
-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
sha=$(git rev-parse HEAD)
echo $sha > SHA
)
}
function push_workflow() {
local directory="$1"
local url="$2"
local owner="$3"
local project="$4"
local self_action="$5"
local token="$6"
if test -z "$token"; then
echo missing token argument
return 1
fi
push "$directory" "$url" "$owner" "$project" "$self_action" "$token"
}
function run_workflow() {
local directory="$1"
local url="$2"
local owner="$3"
local project="$4"
local self_action="$5"
local token="$6"
push_workflow "$directory" "$url" "$owner" "$project" "$self_action" "$token"
wait_success "$url" "$owner/$project" $(cat $DIR/$project/SHA)
}
function clear_runner_cache() {
if test -f forgejo-runner-home ; then
rm -fr $(cat forgejo-runner-home)/.cache/act
fi
}
function push_self_action() {
local url="$1"
local owner="$2"
local self_action="$3"
local tag="$4"
clear_runner_cache
local dir="$DIR/self"
git clone . $dir
(
cd $dir
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
"$@"