|
require 'net/http' |
|
require 'json' |
|
require 'time' |
|
|
|
JENKINS_URI = URI.parse("http://localhost:8080") |
|
|
|
# the key of this mapping must be a unique identifier for your job, the according value must be the name that is specified in jenkins |
|
job_mapping = YAML.load(File.open(File.join(File.dirname(__FILE__), "..", "config", "jenkins_jobs.yml"))) |
|
job_mapping.each {|name, job| job_mapping[name] ||= {"job" => name}} |
|
|
|
def get_number_of_failing_tests(job_name) |
|
info = get_json_for_job(job_name, 'lastCompletedBuild') |
|
info['actions'][4]['failCount'] |
|
end |
|
|
|
def get_completion_percentage(job_name) |
|
build_info = get_json_for_job(job_name) |
|
prev_build_info = get_json_for_job(job_name, 'lastCompletedBuild') |
|
|
|
return 0 if not build_info["building"] |
|
last_duration = (prev_build_info["duration"] / 1000).round(2) |
|
current_duration = (Time.now.to_f - build_info["timestamp"] / 1000).round(2) |
|
return 99 if current_duration >= last_duration |
|
((current_duration * 100) / last_duration).round(0) |
|
end |
|
|
|
def get_json_for_job(job_name, build = 'lastBuild') |
|
uri = JENKINS_URI.dup |
|
uri.path = "/job/#{job_name}/#{build}/api/json" |
|
response = Net::HTTP.get(uri) |
|
JSON.parse(response) |
|
end |
|
|
|
def get_coverage(job_name) |
|
coverage_page = get_coverage_page(job_name) |
|
|
|
if coverage_page.match '<a href="http://github.com/relevance/rcov">' |
|
matched = /<tt class=''>([.0-9]+)%<\/tt>.*?coverage_total/m.match(coverage_page) |
|
coverage = matched ? matched[1] : 0 |
|
elsif coverage_page.match '<a href="http://github.com/colszowka/simplecov">' |
|
matched = /<span class="group_name">All Files<\/span>.*?covered_percent"><span[^>]*>([.0-9]+)%/m.match(coverage_page) |
|
coverage = matched ? matched[1] : 0 |
|
else |
|
coverage = 0 |
|
end |
|
|
|
coverage.to_i |
|
end |
|
|
|
def get_coverage_page(job_name) |
|
uri = JENKINS_URI.dup |
|
uri.path = "/job/#{job_name}/ws/coverage/index.html" |
|
response = Net::HTTP.get(uri) |
|
response |
|
end |
|
|
|
logger = Logger.new "#{Dir.pwd}/log/jenkins_build.log" |
|
logger.formatter = Logger::Formatter.new |
|
logger.formatter.datetime_format = "%Y-%m-%d %H:%M:%S.%3N" |
|
logger.level = Logger::INFO |
|
|
|
logger.debug job_mapping |
|
|
|
def do_job(title, jenkins_project, logger) |
|
|
|
logger.debug "Start #{title}" |
|
last_status = jenkins_project[:current_status] |
|
|
|
logger.debug "Get json #{title}" |
|
build_info = get_json_for_job(jenkins_project["job"]) |
|
jenkins_project[:current_status] = build_info["result"] |
|
|
|
if build_info["building"] |
|
jenkins_project[:current_status] = "BUILDING" |
|
elsif jenkins_project[:pre_job] |
|
pre_build_info = get_json_for_job(jenkins_project[:pre_job]) |
|
jenkins_project[:current_status] = "PREBUILD" if pre_build_info["building"] |
|
end |
|
|
|
logger.debug "Get coverage #{title}" |
|
coverage = get_coverage(jenkins_project["job"]) |
|
|
|
logger.debug "Send event #{title}" |
|
send_event(title, { |
|
currentResult: jenkins_project[:current_status], |
|
lastResult: last_status, |
|
timestamp: build_info["timestamp"], |
|
value: coverage |
|
}) |
|
|
|
logger.debug "Finish #{title}" |
|
end |
|
|
|
SCHEDULER.in '5s' do |job| |
|
|
|
loop do |
|
|
|
logger.info "New jenkins job" |
|
|
|
job_mapping.each do|title, jenkins_project| |
|
|
|
begin |
|
|
|
do_job(title, jenkins_project, logger) |
|
|
|
logger.debug "Sleep" |
|
sleep 1 |
|
|
|
rescue StandardError => e |
|
logger.error e |
|
end |
|
|
|
end |
|
|
|
logger.info "Finish jenkins job" |
|
|
|
end |
|
|
|
end |