192 lines
4.0 KiB
Bash
Executable File
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
|