From 4ed8e2fb818bd9271a5073bf175bef61cbe0d329 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Wed, 18 Dec 2019 17:29:07 -0800 Subject: [PATCH] Added pipeline watcher script Signed-off-by: James Ketrenos --- scripts/watch.sh | 146 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100755 scripts/watch.sh diff --git a/scripts/watch.sh b/scripts/watch.sh new file mode 100755 index 0000000..4a8ce70 --- /dev/null +++ b/scripts/watch.sh @@ -0,0 +1,146 @@ +#!/bin/bash + +PIPELINE=$1 +[[ "${PIPELINE}" == "" ]] && { + >&2 echo "usage: watch PIPELINE" + exit -1 +} + +# Bring in the variables from SOLUTION file, supporting +# nested substitution +. SOLUTION + +VARS=($(sed -nE "s,(^[^#][^=]*).*$,\1,pg" SOLUTION)) +for var in ${VARS[@]}; do + export ${var} +done + +PROJECT="vtt/sws/osgc/solutions/$(basename $(pwd))" +URI_PROJECT=$(echo ${PROJECT} | sed -E 's,/,%2F,g') + +eval $(grep ^SYS_OSGC_TOKEN SECRETS) + +[[ "$SYS_OSGC_TOKEN" == "" ]] && { + >&2 echo "SECRETS needs to contain a GitLab token for SYS_OSGC_TOKEN." + exit -1 +} + +GITLAB="https://gitlab.devtools.intel.com" + +echo "Looking for pipeline jobs for ${PIPELINE}" + +function get_jobs { + ECHO=$1 + # Split the JSON results into line-by-line breakouts for + # easy sed matching + sed -E 's#([[{},]|])#\n\1\n#g' | grep '^[^,]' | { + SCOPE=0 + JOB="" + STATUS="" + while read line; do + case ${SCOPE} in + 2) + echo $line | grep -qE '^([{[])' && { + SCOPE=$((SCOPE+1)) + (( ECHO )) && echo "Scope: ${SCOPE}" + continue + } + echo $line | grep -qE '^([}]|])' && { + SCOPE=$((SCOPE-1)) + (( ECHO )) && echo "Scope: ${SCOPE}" + continue + } + + [[ "${JOB}" == "" ]] && + JOB=$(echo ${line} | + sed -nE 's,^"id"\s*:\s*([0-9]+).*$,\1,p') + [[ "${STATUS}" == "" ]] && + STATUS=$(echo ${line} | + sed -nE 's,^.*"status"\s*:\s*"([^"]+).*$,\1,p') + [[ "${JOB}" != "" ]] && [[ "${STATUS}" != "" ]] && { + echo "${JOB}:${STATUS} " + JOB="" + STATUS="" + } + ;; + *) + echo $line | grep -qE '^([{[])' && { + SCOPE=$((SCOPE+1)) + (( ECHO )) && echo "Scope: ${SCOPE}" + continue + } + echo $line | grep -qE '^([}]|])' && { + (( SCOPE == 0 )) && { + return 0 + } + SCOPE=$((SCOPE-1)) + (( ECHO )) && echo "Scope: ${SCOPE}" + continue + } + esac + done + } +} + +function update_log { + ID=$1 + [[ ! -d "logs" ]] && mkdir "logs" + + curl --noproxy '*' -s -X GET \ + --header "PRIVATE-TOKEN: ${SYS_OSGC_TOKEN}" \ + "${GITLAB}/api/v4/projects/${URI_PROJECT}/jobs/${ID}/trace" > "logs/${ID}-latest" + + LINES=1 + [[ -e "logs/${ID}" ]] && { + LINES=$(wc -l "logs/${ID}") + LINES=${LINES%% *} + } + + tail -n +${LINES} "logs/${ID}-latest" + mv "logs/${ID}-latest" "logs/${ID}" +} + +while true; do + RESULTS=$(curl --noproxy '*' -s -X GET \ + --header "PRIVATE-TOKEN: ${SYS_OSGC_TOKEN}" \ + --header "Content-Type: application/json" \ + "${GITLAB}/api/v4/projects/${URI_PROJECT}/pipelines/${PIPELINE}/jobs") + + JOBS=($(echo "${RESULTS}" | get_jobs)) + echo "JOBS: ${JOBS[@]}" + + MORE=0 + FAIL=0 + for JOB in ${JOBS[@]}; do + ID=${JOB%%:*} + STATUS=${JOB##*:} + case ${STATUS,,} in + pending) + MORE=$((MORE+1)) + ;; + created) + MORE=$((MORE+1)) + ;; + running) + update_log ${ID} + MORE=$((MORE+1)) + ;; + success) + update_log ${ID} + ;; + cancelled) + FAIL=1 + ;; + failed) + FAIL=1 + ;; + esac + done + (( MORE == 0 )) && { + echo "No more jobs. Exiting." + exit ${FAIL} + } + + echo "Sleeping 5 seconds for ${MORE} jobs." + sleep 5 +done