Skip to content

Instantly share code, notes, and snippets.

@ichizok
Last active March 11, 2020 16:48
Show Gist options
  • Save ichizok/d4bb4c3c5791d56819ff5536a00996ed to your computer and use it in GitHub Desktop.
Save ichizok/d4bb4c3c5791d56819ff5536a00996ed to your computer and use it in GitHub Desktop.
view travis-ci log
#!/bin/bash -e
usage_exit() {
cat >&2 <<EOT
Usage: ${0##*/} [-n] [-v viewer_cmd] travis-build-url
or: ${0##*/} [-n] [-v viewer_cmd] travis-job-url
or: ${0##*/} [-n] [-v viewer_cmd] [-d (com|org)] -b travis-build-id
or: ${0##*/} [-n] [-v viewer_cmd] [-d (com|org)] -j travis-job-id
EOT
exit ${1:-0}
}
while getopts b:d:hj:nv: OPT; do
case "${OPT}" in
b)
travis_build_id=${OPTARG}
;;
d)
if ! [[ ${OPTARG} =~ ^(com|org)$ ]]; then
echo >&2 'TLD must be "com" or "org".'
exit 1
fi
travis_domain=travis-ci.${OPTARG}
;;
j)
travis_job_id=${OPTARG}
;;
n)
filter_cmd=\cat
;;
v)
viewer_cmd=${OPTARG}
;;
h)
usage_exit
;;
*)
usage_exit 1
;;
esac
done
shift $((OPTIND - 1))
: ${travis_url:=$1}
: ${filter_cmd:=remove_escape}
: ${viewer_cmd:=\less -R}
if [[ -n ${travis_url} ]]; then
if ! [[ ${travis_url} =~ travis-ci\.(com|org)/ ]]; then
echo >&2 "${travis_url} is not a location of Travis-CI."
echo >&2 'You should specify the domain "travis-ci.com" or "travis-ci.org".'
exit 1
fi
travis_domain=${BASH_REMATCH[0]%/}
# https://travis-ci.(com|org)/github/username/project/builds/xxxxxxxxx
if [[ ${travis_url} =~ ^https://${travis_domain}/github/[^/]+/[^/]+/builds/([0-9]*) ]]; then
travis_build_id=${BASH_REMATCH[1]}
# https://travis-ci.(com|org)/github/username/project/jobs/xxxxxxxxx
elif [[ ${travis_url} =~ ^https://${travis_domain}/github/[^/]+/[^/]+/jobs/([0-9]*) ]]; then
travis_job_id=${BASH_REMATCH[1]}
# https://api.travis-ci.(com|org)/v3/job/xxxxxxxxx/log.txt
elif [[ ${travis_url} =~ ^https://api\.${travis_domain}/v3/job/\d+/log\.txt ]]; then
travis_log_url=${travis_url}
fi
fi
: ${travis_domain:=travis-ci.org}
readonly travis_api_build=https://api.${travis_domain}/v3/build
readonly travis_api_job=https://api.${travis_domain}/v3/job
readonly travis_log_name=log.txt
# build id
if [[ -n ${travis_build_id} ]]; then
if ! [[ ${travis_build_id} =~ ^[[:digit:]]{9}$ ]]; then
echo >&2 "Invalid build ID: ${travis_build_id}"
exit 1
fi
if ! type jq &>/dev/null; then
echo >&2 "You need 'jq' command."
exit 127
fi
travis_build_url=${travis_api_build}/${travis_build_id}
travis_job_ids=($(curl -sL "${travis_build_url}" | jq -r '.jobs[].id'))
if [[ ${#travis_job_ids[@]} -eq 0 ]]; then
echo >&2 "No job found."
exit 1
elif [[ ${#travis_job_ids[@]} -eq 1 ]]; then
travis_job_id=${travis_job_ids[0]}
elif type peco &>/dev/null; then
travis_job_id=$(tr ' ' '\n' <<<${travis_job_ids[@]} | peco 2>/dev/null)
else
echo 'Build Jobs:'
tr ' ' '\n' <<<${travis_job_ids[@]} | cat -n
read -p 'Choose? ' n
travis_job_id=${travis_job_ids[$((n - 1))]}
fi
fi
# job id
if [[ -n ${travis_job_id} ]]; then
if ! [[ ${travis_job_id} =~ ^[[:digit:]]{9}$ ]]; then
echo >&2 "Invalid job ID: ${travis_job_id}"
exit 1
fi
travis_log_url=${travis_api_job}/${travis_job_id}/${travis_log_name}
fi
if [[ -z ${travis_log_url} ]]; then
usage_exit 1
fi
# echo ${travis_log_url}
fetch_log() {
\curl -sL "$1" \
# | tee "${TMPDIR}/log.txt"
# cat "${TMPDIR}/log.txt"
# ;;
}
remove_escape() {
local CR=$'\\\x0d' LF=$'\\\x0a' ESC=$'\\\x1b'
\sed \
-e 's/'"$CR"'\{1,\}$//g' \
-e 's/'"$CR"'\{1,\}/'"$LF"'/g' \
# -e 's/'"$ESC"'\[[^[:alpha:]]*[[:alpha:]]//g' \
# ;;
}
fetch_log "${travis_log_url}" \
| ${filter_cmd} \
| ${viewer_cmd} \
# ;;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment