blob: 740af439e671396c5de920b320ad963513bcbbb6 [file] [log] [blame]
#!/usr/bin/env python
#
# 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 tool triggers a Jenkins build based on a particular gerrit URL.
# The Jenkins build will post a +1 or -1 on the gerrit.
#
# NOTE: currently this is hard-coded to an internal Cloudera server.
# We plan to move to upstream infrastructure at some later date.
import logging
import json
import re
import subprocess
import sys
import urllib
import urllib2
import urlparse
from kudu_util import check_output
GERRIT_HOST = "gerrit.cloudera.org"
JENKINS_URL = "http://sandbox.jenkins.cloudera.com/"
JENKINS_JOB = "kudu-public-gerrit"
def get_gerrit_ssh_command():
url = check_output("git config --get remote.gerrit.url".split(" "))
m = re.match(r'ssh://(.+)@(.+):(\d+)/.+', url)
if not m:
raise Exception("expected gerrit remote to be an ssh://user@host:port/ URL: %s" % url)
user, host, port = m.groups()
if host != GERRIT_HOST:
raise Exception("unexpected gerrit host %s in remote 'gerrit'. Expected %s" % (
host, GERRIT_HOST))
return ["ssh", "-p", port, "-l", user, host]
def current_ref_for_gerrit_number(change_num):
j = check_output(get_gerrit_ssh_command() + [
"gerrit", "query", "--current-patch-set", "--format", "JSON",
"change:%d" % change_num])
j = json.loads(j.split("\n")[0])
return j['currentPatchSet']['ref']
def url_to_ref(url):
u = urlparse.urlparse(url)
if not u.netloc.startswith(GERRIT_HOST):
print >>sys.stderr, "unexpected gerrit host %s, expected %s\n" % (
u.netloc, GERRIT_HOST)
usage()
sys.exit(1)
if u.path == '/':
m = re.match(r'/c/(\d+)/', u.fragment)
if m:
return current_ref_for_gerrit_number(int(m.group(1)))
print >>sys.stderr, "invalid gerrit URL: ", url
usage()
sys.exit(1)
def usage():
print >>sys.stderr, "usage: %s <url>\n" % sys.argv[0]
print >>sys.stderr, "The provided URL should look something like:"
print >>sys.stderr, "http://gerrit.cloudera.org:8080/#/c/963/\n"
def determine_ref():
if len(sys.argv) != 2:
usage()
sys.exit(1)
arg = sys.argv[1]
if arg.startswith("http"):
return url_to_ref(arg)
else:
print >>sys.stderr, "Unable to parse argument: %s\n" % arg
sys.exit(1)
def trigger_jenkins(ref):
logging.info("Will trigger Jenkins for ref %s" % ref)
url = "%s/job/%s/buildWithParameters" % (JENKINS_URL, JENKINS_JOB)
params = dict(GERRIT_BRANCH=ref)
req = urllib2.Request(url,
data=urllib.urlencode(params),
headers={"Accept": "application/json"})
urllib2.urlopen(req).read()
logging.info("Successfuly triggered jenkins job!")
def main():
gerrit_ref = determine_ref()
trigger_jenkins(gerrit_ref)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
main()