mirror of
https://code.forgejo.org/actions/setup-forgejo.git
synced 2024-11-23 21:40:59 -05:00
87d8b85700
if the cache is not cleared, the action that was just uploaded with the latest changes won't be used, the cached version will.
217 lines
4.7 KiB
Bash
Executable file
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
|
|
|
|
"$@"
|