blob: ea5e37b380558cb53ce284c4fb496631966b56a4 [file] [log] [blame]
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# This script checks build status of given pullrequest identified by author and commit hash.
#
# usage)
# python travis_check.py [author] [commit hash] [check interval (optional)]
#
# example)
# # full hash
# python travis_check.py Leemoonsoo 1f2549a38f440ebfbfe2d32a041684e3e39b496c
#
# # with short hash
# python travis_check.py Leemoonsoo 1f2549a
#
# # with custom check interval
# python travis_check.py Leemoonsoo 1f2549a 5,60,60
import os, sys, getopt, traceback, json, requests, time
author = sys.argv[1]
commit = sys.argv[2]
# check interval in sec
check = [5, 60, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 600, 600, 600, 600, 600, 600]
if len(sys.argv) > 3:
check = map(lambda x: int(x), sys.argv[3].split(","))
def info(msg):
print("[" + time.strftime("%Y-%m-%d %H:%M:%S") + "] " + msg)
sys.stdout.flush()
info("Author: " + author + ", commit: " + commit)
def getBuildStatus(author, commit):
travisApi = "https://api.travis-ci.org/"
# get latest 25 builds
resp = requests.get(url=travisApi + "/repos/" + author + "/zeppelin/builds")
data = json.loads(resp.text)
build = None
if len(data) == 0:
return build
for b in data:
if b["commit"][:len(commit)] == commit:
resp = requests.get(url=travisApi + "/repos/" + author + "/zeppelin/builds/" + str(b["id"]))
build = json.loads(resp.text)
break
return build
def status(index, msg, jobId):
return '{:20}'.format("[" + str(index+1) + "] " + msg) + "https://travis-ci.org/" + author + "/zeppelin/jobs/" + str(jobId)
def printBuildStatus(build):
failure = 0
running = 0
for index, job in enumerate(build["matrix"]):
result = job["result"]
jobId = job["id"]
if job["started_at"] == None and result == None:
print(status(index, "Not started", jobId))
running = running + 1
elif job["started_at"] != None and job["finished_at"] == None:
print(status(index, "Running ...", jobId))
running = running + 1
elif job["started_at"] != None and job["finished_at"] != None:
if result == None:
print(status(index, "Not completed", jobId))
failure = failure + 1
elif result == 0:
print(status(index, "OK", jobId))
else:
print(status(index, "Error " + str(result), jobId))
failure = failure + 1
else:
print(status(index, "Unknown state", jobId))
failure = failure + 1
return failure, running
for sleep in check:
info("--------------------------------")
time.sleep(sleep)
info("Get build status ...")
build = getBuildStatus(author, commit)
if build == None:
info("Can't find build for commit " + commit + " from " + author)
sys.exit(2)
print("Build https://travis-ci.org/" + author + "/zeppelin/builds/" + str(build["id"]))
failure, running = printBuildStatus(build)
print(str(failure) + " job(s) failed, " + str(running) + " job(s) running/pending")
if failure != 0:
sys.exit(1)
if failure == 0 and running == 0:
info("CI Green!")
sys.exit(0)
info("Timeout")
sys.exit(1)