#!/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) FAIL=1 ;; failed) FAIL=1 ;; esac done (( MORE == 0 )) && { (( FAIL )) && >&2 echo "See ${JOBS[*]} in logs for failures" (( ! QUIET )) && echo "No more jobs. Exiting ${FAIL}" exit ${FAIL} } (( ! QUIET )) && echo "Sleeping 5 seconds for ${MORE} jobs." sleep 5 done