Updated jenkins plugin, added say.py

This commit is contained in:
James Booth
2014-06-08 18:38:57 +01:00
parent d7c9f99071
commit ea7cb09ffc
2 changed files with 206 additions and 99 deletions

View File

@@ -30,18 +30,23 @@ import jenkinsapi
from jenkinsapi.jenkins import Jenkins from jenkinsapi.jenkins import Jenkins
win_tag = "Jenkins" win_tag = "Jenkins"
poll_interval = 5 poll_interval = 10
remind_interval = 60 * 15 remind_interval = 60 * 15
enable_remind = True
jenkins_url = "http://localhost:8080" jenkins_url = "http://localhost:8080"
username = None username = None
password = None password = None
failing = [] last_state = {}
passing = [] STATE_SUCCESS = "SUCCESS"
STATE_UNSTABLE = "UNSTABLE"
STATE_FAILURE = "FAILURE"
STATE_QUEUED = "QUEUED"
STATE_RUNNING = "RUNNING"
STATE_NOBUILDS = "NOBUILDS"
STATE_UNKNOWN = "UNKNOWN"
def _show_help(): def _show_help():
global win_tag
prof.win_show(win_tag, "Commands:") prof.win_show(win_tag, "Commands:")
prof.win_show(win_tag, " /jenkins help - Show this help") prof.win_show(win_tag, " /jenkins help - Show this help")
prof.win_show(win_tag, " /jenkins list - List all jobs") prof.win_show(win_tag, " /jenkins list - List all jobs")
@@ -62,37 +67,70 @@ def _open_job_url(url):
os.dup2(savout, 1) os.dup2(savout, 1)
os.dup2(saverr, 2) os.dup2(saverr, 2)
def _list_jobs(j): def _safe_remove(jobname, state):
global win_tag if jobname in last_state[state]:
last_state[state].remove(jobname)
if len(j.keys()) == 0: def _set_state(jobname, state):
prof.win_show(win_tag, "No jobs available") if not jobname in last_state[state]:
_safe_remove(jobname, STATE_SUCCESS)
_safe_remove(jobname, STATE_UNSTABLE)
_safe_remove(jobname, STATE_FAILURE)
_safe_remove(jobname, STATE_QUEUED)
_safe_remove(jobname, STATE_RUNNING)
_safe_remove(jobname, STATE_NOBUILDS)
_safe_remove(jobname, STATE_UNKNOWN)
last_state[state].append(jobname)
return True
else:
return False
def _list_jobs():
try:
j = Jenkins(jenkins_url, username, password)
except Exception, e:
prof.log_warning("Could not connect to jenkins: " + str(e))
prof.win_show(win_tag, "Could not connect to Jenkins.")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else: else:
prof.win_show(win_tag, "Jobs:") if len(j.keys()) == 0:
for name, job in j.get_jobs(): prof.win_show(win_tag, "No jobs available")
if job.is_queued(): prof.win_show(win_tag, "")
prof.win_show_cyan(win_tag, " " + name + ", QUEUED") else:
elif job.is_running(): prof.win_show(win_tag, "Jobs:")
prof.win_show_cyan(win_tag, " " + name + ", RUNNING") for name, job in j.get_jobs():
else: if job.is_queued():
build = job.get_last_build_or_none() _set_state(name, STATE_QUEUED)
if build: prof.win_show_cyan(win_tag, " " + name + ", QUEUED")
if build.get_status() == "FAILURE": elif job.is_running():
prof.win_show_red(win_tag, " " + name + " #" + str(build.get_number()) + ", " + build.get_status()) _set_state(name, STATE_RUNNING)
elif build.get_status() == "SUCCESS": prof.win_show_cyan(win_tag, " " + name + ", RUNNING")
prof.win_show_green(win_tag, " " + name + " #" + str(build.get_number()) + ", " + build.get_status())
else:
prof.win_show_cyan(win_tag, " " + name + " #" + str(build.get_number()) + ", " + build.get_status())
else: else:
prof.win_show(win_tag, " " + name + ", no builds") build = job.get_last_build_or_none()
prof.win_show(win_tag, "") if build:
if build.get_status() == "FAILURE":
_set_state(name, STATE_FAILURE)
prof.win_show_red(win_tag, " " + name + " #" + str(build.get_number()) + ", " + build.get_status())
elif build.get_status() == "SUCCESS":
_set_state(name, STATE_SUCCESS)
prof.win_show_green(win_tag, " " + name + " #" + str(build.get_number()) + ", " + build.get_status())
elif build.get_status() == "UNSTABLE":
_set_state(name, STATE_UNSTABLE)
prof.win_show_yellow(win_tag, " " + name + " #" + str(build.get_number()) + ", " + build.get_status())
else:
_set_state(name, STATE_UNKNOWN)
prof.win_show_cyan(win_tag, " " + name + " #" + str(build.get_number()) + ", " + build.get_status())
else:
_set_state(name, STATE_NOBUILDS)
prof.win_show(win_tag, " " + name + ", no builds")
prof.win_show(win_tag, "")
def _show_job(j, jobname=None): def _show_job(jobname):
global win_tag try:
j = Jenkins(jenkins_url, username, password)
if not jobname: except Exception, e:
prof.win_show(win_tag, "Usage: show [job]") prof.log_warning("Could not connect to jenkins: " + str(e))
prof.win_show(win_tag, "Could not connect to Jenkins.")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else: else:
if j.has_job(jobname): if j.has_job(jobname):
@@ -104,20 +142,29 @@ def _show_job(j, jobname=None):
prof.win_show(win_tag, " Description : " + desc) prof.win_show(win_tag, " Description : " + desc)
if job.is_queued(): if job.is_queued():
_set_state(jobname, STATE_QUEUED)
prof.win_show_cyan(win_tag, " Status : Queued") prof.win_show_cyan(win_tag, " Status : Queued")
elif job.is_running(): elif job.is_running():
_set_state(jobname, STATE_RUNNING)
prof.win_show_cyan(win_tag, " Status : Running") prof.win_show_cyan(win_tag, " Status : Running")
else: else:
build = job.get_last_build_or_none() build = job.get_last_build_or_none()
if build: if build:
prof.win_show(win_tag, " Last build : #" + str(build.get_number())) prof.win_show(win_tag, " Last build : #" + str(build.get_number()))
if build.get_status() == "FAILURE": if build.get_status() == "FAILURE":
_set_state(jobname, STATE_FAILURE)
prof.win_show_red(win_tag, " Status : " + build.get_status()) prof.win_show_red(win_tag, " Status : " + build.get_status())
elif build.get_status() == "SUCCESS": elif build.get_status() == "SUCCESS":
_set_state(jobname, STATE_SUCCESS)
prof.win_show_green(win_tag, " Status : " + build.get_status()) prof.win_show_green(win_tag, " Status : " + build.get_status())
elif build.get_status() == "UNSTABLE":
_set_state(jobname, STATE_UNSTABLE)
prof.win_show_yellow(win_tag, " Status : " + build.get_status())
else: else:
_set_state(jobname, STATE_UNKNOWN)
prof.win_show_cyan(win_tag, " Status : " + build.get_status()) prof.win_show_cyan(win_tag, " Status : " + build.get_status())
else: else:
_set_state(jobname, STATE_NOBUILDS)
prof.win_show(win_tag, " Last build : No builds") prof.win_show(win_tag, " Last build : No builds")
prof.win_show(win_tag, " Trigger : " + job.get_build_triggerurl()) prof.win_show(win_tag, " Trigger : " + job.get_build_triggerurl())
@@ -126,11 +173,12 @@ def _show_job(j, jobname=None):
prof.win_show(win_tag, "No such job " + jobname) prof.win_show(win_tag, "No such job " + jobname)
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
def _build_job(j, jobname): def _build_job(jobname):
global win_tag try:
j = Jenkins(jenkins_url, username, password)
if not jobname: except Exception, e:
prof.win_show(win_tag, "Usage: build [job]") prof.log_warning("Could not connect to jenkins: " + str(e))
prof.win_show(win_tag, "Could not connect to Jenkins.")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else: else:
if j.has_job(jobname): if j.has_job(jobname):
@@ -138,78 +186,100 @@ def _build_job(j, jobname):
try: try:
job.invoke(invoke_pre_check_delay=1) job.invoke(invoke_pre_check_delay=1)
except Exception, e: except Exception, e:
prof.win_show(win_tag, "Failed to trigger build: " + str(e)) prof.log_warning("Failed to trigger build: " + str(e))
prof.win_show(win_tag, "Failed to trigger build.")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else: else:
prof.win_show(win_tag, "No such job " + jobname) prof.win_show(win_tag, "No such job " + jobname)
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
def _open_job(j, jobname): def _open_job(jobname):
global win_tag try:
j = Jenkins(jenkins_url, username, password)
if not jobname: except Exception, e:
prof.win_show(win_tag, "Usage: open [job]") prof.log_warning("Could not connect to jenkins: " + str(e))
prof.win_show(win_tag, "Could not connect to Jenkins.")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else: else:
if j.has_job(jobname): if not jobname:
_open_job_url(jenkins_url + "/job/" + jobname) prof.win_show(win_tag, "Usage: open [job]")
else:
prof.win_show(win_tag, "No such job " + jobname)
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else:
if j.has_job(jobname):
_open_job_url(jenkins_url + "/job/" + jobname)
else:
prof.win_show(win_tag, "No such job " + jobname)
prof.win_show(win_tag, "")
def _process_job(name, job): def _process_job(name, job):
global failing
global passing
global win_tag
if not job.is_queued_or_running(): if not job.is_queued_or_running():
build = job.get_last_build_or_none() build = job.get_last_build_or_none()
if build: if build:
if build.get_status() == "FAILURE": if build.get_status() == "FAILURE":
if not name in failing: changed = _set_state(name, STATE_FAILURE)
prof.win_show_red(win_tag, name + " #" + str(build.get_number()) + " BROKEN") if changed:
prof.win_show_red(win_tag, name + " #" + str(build.get_number()) + " FAILURE")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
prof.notify(name + " BROKEN", 5000, "Jenkins") prof.notify(name + " FAILURE", 5000, "Jenkins")
failing.append(name) elif build.get_status() == "SUCCESS":
if name in passing: changed = _set_state(name, STATE_SUCCESS)
passing.remove(name) if changed:
else: prof.win_show_green(win_tag, name + " #" + str(build.get_number()) + " SUCCESS")
if name in failing:
prof.win_show_green(win_tag, name + " #" + str(build.get_number()) + " FIXED")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
prof.notify(name + " FIXED", 5000, "Jenkins") prof.notify(name + " SUCCESS", 5000, "Jenkins")
failing.remove(name) elif build.get_status() == "UNSTABLE":
if not name in passing: changed = _set_state(name, STATE_UNSTABLE)
passing.append(name) if changed:
prof.win_show_yellow(win_tag, name + " #" + str(build.get_number()) + " UNSTABLE")
prof.win_show(win_tag, "")
prof.notify(name + " UNSTABLE", 5000, "Jenkins")
else:
if job.is_queued():
changed = _set_state(name, STATE_QUEUED)
if changed:
prof.win_show_cyan(win_tag, name + " QUEUED")
prof.win_show(win_tag, "")
elif job.is_running():
changed = _set_state(name, STATE_RUNNING)
if changed:
prof.win_show_cyan(win_tag, name + " RUNNING")
prof.win_show(win_tag, "")
def _remind(): def _remind():
global failing if enable_remind:
notify_string = ""
failing = len(last_state[STATE_FAILURE])
unstable = len(last_state[STATE_UNSTABLE])
if len(failing) == 1: if failing == 1:
prof.notify("1 broken build", 5000, "Jenkins") notify_string = notify_string + "1 failing build"
if len(failing) > 1: if failing > 1:
prof.notify(str(len(failing)) + " broken builds", 5000, "Jenkins") notify_string = notify_string + str(failing) + " failing builds"
if failing > 0 and unstable > 0:
notify_string = notify_string + "\n"
if unstable == 1:
notify_string = notify_string + "1 unstable build"
if unstable > 1:
notify_string = notify_string + str(unstable) + " unstable builds"
if not notify_string == "":
prof.notify(notify_string, 5000, "Jenkins")
def _poll_jobs(): def _poll_jobs():
global jenkins_url
global username
global password
global win_tag
try: try:
j = Jenkins(jenkins_url, username, password) j = Jenkins(jenkins_url, username, password)
except Exception: except Exception, e:
prof.win_show(win_tag, "Jenkins down") prof.log_warning("Could not connect to jenkins: " + str(e))
prof.win_show(win_tag, "Could not connect to Jenkins.")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else: else:
for name, job in j.get_jobs(): for name, job in j.get_jobs():
_process_job(name, job) _process_job(name, job)
def _cmd_jenkins(cmd=None, jobname=None): def _cmd_jenkins(cmd=None, arg=None):
global jenkins_url global enable_remind
global username
global password
global win_tag
if not prof.win_exists(win_tag): if not prof.win_exists(win_tag):
prof.win_create(win_tag, _handle_input) prof.win_create(win_tag, _handle_input)
@@ -221,47 +291,70 @@ def _cmd_jenkins(cmd=None, jobname=None):
else: else:
try: try:
j = Jenkins(jenkins_url, username, password) j = Jenkins(jenkins_url, username, password)
except Exception: except Exception, e:
prof.win_show(win_tag, "Jenkins down") prof.log_warning("Could not connect to jenkins: " + str(e))
prof.win_show(win_tag, "Could not connect to Jenkins.")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
else: else:
if cmd == "help": if cmd == "help":
_show_help() _show_help()
elif cmd == "list": elif cmd == "list":
_list_jobs(j) _list_jobs()
elif cmd == "show": elif cmd == "show":
_show_job(j, jobname) if not arg:
prof.win_show(win_tag, "Usage: show [job]")
prof.win_show(win_tag, "")
else:
_show_job(arg)
elif cmd == "build": elif cmd == "build":
_build_job(j, jobname) if not arg:
prof.win_show(win_tag, "Usage: build [job]")
prof.win_show(win_tag, "")
else:
_build_job(arg)
elif cmd == "open": elif cmd == "open":
_open_job(j, jobname) if not arg:
prof.win_show(win_tag, "Usage: open [job]")
prof.win_show(win_tag, "")
else:
_open_job(arg)
elif cmd == "remind":
if not arg:
prof.win_show(win_tag, "Usage: remind on|off")
else:
if arg == "on":
enable_remind = True
prof.win_show(win_tag, "Reminders enabled.")
elif arg == "off":
enable_remind = False
prof.win_show(win_tag, "Reminders disabled.")
else:
prof.win_show(win_tag, "Usage: remind on|off")
prof.win_show(win_tag, "")
else: else:
prof.win_show(win_tag, "Usage: list|show|build|open [job].") prof.win_show(win_tag, "Usage: list|show|build|open|remind")
prof.win_show(win_tag, "") prof.win_show(win_tag, "")
def prof_init(version, status): def prof_init(version, status):
global poll_interval last_state[STATE_SUCCESS] = []
global win_tag last_state[STATE_UNSTABLE] = []
last_state[STATE_FAILURE] = []
last_state[STATE_QUEUED] = []
last_state[STATE_RUNNING] = []
last_state[STATE_NOBUILDS] = []
last_state[STATE_UNKNOWN] = []
if poll_interval > 0: if poll_interval > 0:
prof.register_timed(_poll_jobs, poll_interval) prof.register_timed(_poll_jobs, poll_interval)
if remind_interval > 0: if remind_interval > 0:
prof.register_timed(_remind, remind_interval) prof.register_timed(_remind, remind_interval)
prof.register_command("/jenkins", 0, 2, "/jenkins list|show|build|open [job]", "Do jenkins stuff.", "Do jenkins stuff.", prof.register_command("/jenkins", 0, 2, "/jenkins list|show|build|open|remind", "Do jenkins stuff.", "Do jenkins stuff.",
_cmd_jenkins) _cmd_jenkins)
def _handle_input(win, line): def _handle_input(win, line):
_show_help() _show_help()
def prof_on_start(): def prof_on_start():
global win_tag
prof.win_create(win_tag, _handle_input) prof.win_create(win_tag, _handle_input)
_show_help() _show_help()
_list_jobs()
try:
j = Jenkins(jenkins_url, username, password)
except Exception:
prof.win_show(win_tag, "Jenkins down")
else:
_list_jobs(j)

14
say.py Normal file
View File

@@ -0,0 +1,14 @@
import prof
import os
def prof_on_message_received(jid, message):
os.system("say \"" + jid + " says " + message + "\" 2>/dev/null")
return message
def prof_on_room_message_received(room, nick, message):
os.system("say \"" + nick + " says " + message + " in " + room + "\" 2>/dev/null")
return message
def prof_on_private_message_received(room, nick, message):
os.system("say \"" + nick + " says " + message + "\" 2>/dev/null")
return message