init
commit
28ee6af633
|
@ -0,0 +1,10 @@
|
||||||
|
# Runtime
|
||||||
|
logs/*
|
||||||
|
wd/*
|
||||||
|
|
||||||
|
# Temporary
|
||||||
|
*~
|
||||||
|
.fuse_hidden*
|
||||||
|
.directory
|
||||||
|
.Trash-*
|
||||||
|
.nfs*
|
|
@ -0,0 +1,197 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# TODO: Check installed: git, jq
|
||||||
|
|
||||||
|
function detech() {
|
||||||
|
command=${@:2}
|
||||||
|
log=$1
|
||||||
|
|
||||||
|
"$command" &>$log & disown
|
||||||
|
}
|
||||||
|
|
||||||
|
function die() {
|
||||||
|
write_log "Oops: $@" 1>&2 ; exit 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_log_timestamps() {
|
||||||
|
$event=$1
|
||||||
|
$log_file=$2
|
||||||
|
|
||||||
|
grep -oP "^(\[[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\] $event at \K([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}))$" $log_file
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_os() {
|
||||||
|
function get_os_line() {
|
||||||
|
file=""
|
||||||
|
property=$1
|
||||||
|
|
||||||
|
if [[ -f "/etc/os-release" ]]; then
|
||||||
|
file="/etc/os-release"
|
||||||
|
elif [[ -f "/usr/etc/os-release" ]]; then
|
||||||
|
file="/usr/etc/os-release"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -z $file ]]; then
|
||||||
|
echo $(grep -oP "(?<=^$property=).+" $file | tr -d '"')
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
os_name=$(get_os_line "NAME")
|
||||||
|
os_version=$(get_os_line "VERSION")
|
||||||
|
os_pretty=$(get_os_line "PRETTY_NAME")
|
||||||
|
|
||||||
|
if [[ ! -z $os_pretty ]]; then
|
||||||
|
echo "$os_pretty"
|
||||||
|
elif [[ ! -z $os_name ]]; then
|
||||||
|
echo "$os_name $os_version"
|
||||||
|
else
|
||||||
|
echo "Unknown OS"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function now() {
|
||||||
|
echo $(date +"%Y-%m-%d %H:%M:%S")
|
||||||
|
}
|
||||||
|
|
||||||
|
function query_json() {
|
||||||
|
echo "$1" | jq $2 -r
|
||||||
|
}
|
||||||
|
|
||||||
|
function split_string() {
|
||||||
|
echo $1 | cut -d"$2" -f$3
|
||||||
|
}
|
||||||
|
|
||||||
|
function write_log() {
|
||||||
|
echo "[$(now)] $@"
|
||||||
|
}
|
||||||
|
|
||||||
|
payload=$1
|
||||||
|
service=$2
|
||||||
|
event=$3
|
||||||
|
id=$4
|
||||||
|
|
||||||
|
started_time=$(now)
|
||||||
|
|
||||||
|
base_dir="$(dirname "$(realpath -s "$0")")"
|
||||||
|
build_base_dir="$base_dir/wd"
|
||||||
|
log_base_dir="$base_dir/logs"
|
||||||
|
script_base_dir="$base_dir/repos"
|
||||||
|
|
||||||
|
mkdir -p $build_base_dir
|
||||||
|
mkdir -p $log_base_dir
|
||||||
|
|
||||||
|
if [[ -z $event ]]; then
|
||||||
|
if [[ ! -z $x_github_event ]]; then
|
||||||
|
event=$x_github_event
|
||||||
|
else
|
||||||
|
die "Missing event"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z $service ]]; then
|
||||||
|
service="github"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z $id ]]; then
|
||||||
|
if [[ ! -z $x_github_delivery ]]; then
|
||||||
|
id=$x_github_delivery
|
||||||
|
else
|
||||||
|
id=$(cat /proc/sys/kernel/random/uuid)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -z "$payload" ]]; then
|
||||||
|
payload_type=$(echo $payload | jq type -r)
|
||||||
|
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
die "Bad body format (expecting JSON)"
|
||||||
|
else
|
||||||
|
if [[ ! $payload_type = "object" ]]; then
|
||||||
|
die "Bad body format (expecting JSON object but got $payload_type)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
die "Missing payload"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# TODO: Test Gitea
|
||||||
|
if ! { [[ $service == "github" ]] || [[ $service == "gitea" ]]; }; then
|
||||||
|
die "Service '$service' not supported"
|
||||||
|
fi
|
||||||
|
|
||||||
|
repo=$(query_json "$payload" ".repository.full_name")
|
||||||
|
repo_author=$(split_string $repo "/" 1)
|
||||||
|
repo_name=$(split_string $repo "/" 2)
|
||||||
|
instance="$(date +"%y%m%d%H%M%S")_${repo_name}_$id"
|
||||||
|
|
||||||
|
script_path="$script_base_dir/$service/$repo_author/$repo_name"
|
||||||
|
build_path="$build_base_dir/$instance"
|
||||||
|
log_path="$log_base_dir/$instance.txt"
|
||||||
|
|
||||||
|
if [[ -f "$script_path/$event.sh" ]]; then
|
||||||
|
script_path="$script_path/$event.sh"
|
||||||
|
elif [[ -f "$script_path/default.sh" ]]; then
|
||||||
|
$script_path"$script_path/default.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -z $script_path ]]; then
|
||||||
|
function invoke_script() {
|
||||||
|
write_log "Started at $(now)"
|
||||||
|
|
||||||
|
export _hook_event=$event
|
||||||
|
export _hook_id=$id
|
||||||
|
export _hook_payload=$payload
|
||||||
|
export _repo_clone_url=$(query_json "$payload" ".repository.clone_url")
|
||||||
|
export _wd=$build_path
|
||||||
|
|
||||||
|
export -f query_json
|
||||||
|
export -f now
|
||||||
|
export -f split_string
|
||||||
|
export -f write_log
|
||||||
|
|
||||||
|
write_log "Creating working directory..."
|
||||||
|
mkdir -p $build_path
|
||||||
|
|
||||||
|
write_log "Setting path to '$build_path'..."
|
||||||
|
cd $build_path
|
||||||
|
|
||||||
|
chmod +x $script_path
|
||||||
|
|
||||||
|
if { [[ $event == "push" ]]; }; then
|
||||||
|
export _branch=$(split_string $(query_json "$payload" ".ref") "/" 3)
|
||||||
|
export _commit_hash=$(query_json "$payload" ".head_commit.id")
|
||||||
|
export _commit_message=$(query_json "$payload" ".head_commit.message")
|
||||||
|
export _commit_timestamp=$(query_json "$payload" ".head_commit.timestamp")
|
||||||
|
|
||||||
|
write_log "Cloning repository from '$_repo_clone_url'..."
|
||||||
|
git clone --recurse-submodules -q $_repo_clone_url $build_path
|
||||||
|
|
||||||
|
write_log "Resetting repository to '$_commit_hash'..."
|
||||||
|
git reset --hard -q $_commit_hash
|
||||||
|
fi
|
||||||
|
|
||||||
|
write_log "Executing script..."
|
||||||
|
|
||||||
|
echo "================================================================================"
|
||||||
|
$script_path
|
||||||
|
echo "================================================================================"
|
||||||
|
|
||||||
|
write_log "Removing working directory..."
|
||||||
|
rm -rf $build_path
|
||||||
|
|
||||||
|
write_log "Finished at $(now)"
|
||||||
|
}
|
||||||
|
|
||||||
|
detech "$log_path" invoke_script
|
||||||
|
|
||||||
|
echo " Repo: $service:$repo"
|
||||||
|
echo " Event: $event ($id)"
|
||||||
|
echo "Instance: $instance"
|
||||||
|
echo " Script: $script_path"
|
||||||
|
echo " Working: $build_path"
|
||||||
|
echo " Log: $log_path"
|
||||||
|
echo " Host: $(hostname) ($(get_os))"
|
||||||
|
echo " Started: $started_time"
|
||||||
|
else
|
||||||
|
die "No handler for $event on $service:$repo"
|
||||||
|
fi
|
Reference in New Issue