1
0
James Ketrenos c1f21dd967 Updated to latest xe-solutions
Signed-off-by: James Ketrenos <james.p.ketrenos@intel.com>
2020-02-06 14:30:04 -08:00

192 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
PIPELINE=
YES=
QUIET=
while getopts ydqp: opt; do
case "${opt}" in
q)
QUIET=1
;;
p)
PROJECT=${OPTARG}
;;
y)
YES=1
;;
[?])
usage
exit 0
;;
esac
done
shift $(( OPTIND-1 ))
PIPELINE=$1
function usage {
cat << EOF
usage: watch [OPTIONS] PIPELINE
Options:
-y Answer Yes to any prompts
-p PROJECT Project to watch. Default: SOLUTION defined or directory-name.
EOF
}
(( PIPELINE )) || {
usage >&2
exit -1
}
# Bring in the variables from SOLUTION file, supporting
# nested substitution
[[ -e SOLUTION ]] && . SOLUTION
[[ -e SOLUTION ]] && VARS=($(sed -nE "s,(^[^#][^=]*).*$,\1,pg" SOLUTION))
for var in ${VARS[@]}; do
export ${var}
done
PROJECT=${PROJECT:-${CONTAINER}}
PROJECT=${PROJECT:-$(basename $(pwd))}
PROJECT="vtt/sws/osgc/solutions/${PROJECT}"
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"
(( ! QUIET )) && echo "Looking for pipeline ${PIPELINE} jobs for ${PROJECT}"
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%% *}
}
(( ! QUIET )) && 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))
(( ! QUIET )) && 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|canceled)
FAIL=1
;;
failed)
FAIL=1
;;
*)
echo "${JOB}"
;;
esac
done
(( MORE == 0 )) && {
(( FAIL )) && >&2 echo "See ${JOBS[@]} in logs for failures"
(( ! QUIET )) && echo "No more jobs. Exiting ${FAIL}"
[[ ! -d "logs" ]] && mkdir "logs"
echo -e "${JOBS[@]}\n${FAIL}" > logs/${PIPELINE}
exit ${FAIL}
}
(( ! QUIET )) && echo "Sleeping 5 seconds for ${MORE} jobs."
sleep 5
done