#!/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