Skip to content

Instantly share code, notes, and snippets.

@vossim
Forked from mavimo/Readme.md
Last active August 29, 2015 14:17
Show Gist options
  • Save vossim/d5ece60f3e1b909a671d to your computer and use it in GitHub Desktop.
Save vossim/d5ece60f3e1b909a671d to your computer and use it in GitHub Desktop.

Description

Dashing widget to display a Jenkins build status and build progress

The widget is based on the meter-widget which is a default widget in the Dashing installation

The widget can also shows the progress of a "pre-build", i.e if you have a job triggering the actual build you want to define, you can configure this job in the jenkins_build.rb as a prebuild.

Installation

Put the files jenkins_build.coffee, jenkins_build.html and jenkins_build.scss goes in the /widget/jenkins_build directory and the jenkins_build.rb in the /jobs directory

Otherwise you can install this plugin typing:

dashing install d5ece60f3e1b909a671d

Job configuration

Option 1: jenkins_build.yaml

Create a jenkins_build.yaml file in the /conf directory, an example file is available here.

Option 2: jenkins_build.rb

Change the JENKINS_URI to your correct uri for Jenkins, eg.:

JENKINS_URI = "http://ci.yourserver.com/somepath"

Add jenkins credential (if required) in JENKINS_AUTH, eg.:

JENKINS_AUTH = {
  'name' => 'username',
  'password' => 'password'
}

Put all the jobnames and pre job names in the job_mapping, eg.:

job_mapping = {
  'job1' => { :job => 'Job Name 1'},
  'job2' => { :job => 'Job Name 2', :pre_job => 'Job Name 3'},
}

Dashboard configuration

Put the following in your dashingboard.erb file to show the status:

<li data-row="1" data-col="1" data-sizex="1" data-sizey="1">
  <div data-id="job1" data-view="JenkinsBuild" data-title="Build title" data-description="A little description of build"></div>
</li>

Multiple jobs can add in dashboard repeating the snippet and changing data-id in accord with job name specified in job_mapping. Widget support title and description via data attributes, this attributest can be omitted if you do not like to display this information. If the title is omitted, the jenkins project name will be used instead.

class Dashing.JenkinsBuild extends Dashing.Widget
@accessor 'computedtitle', ->
if @get('title')?
@get('title')
else
@get('jenkinsProject')
@accessor 'value', Dashing.AnimatedValue
@accessor 'bgColor', ->
if @get('currentResult') == "SUCCESS"
"#96bf48"
else if @get('currentResult') == "FAILURE"
"#D26771"
else if @get('currentResult') == "PREBUILD"
"#ff9618"
else
"#999"
constructor: ->
super
@observe 'value', (value) ->
$(@node).find(".jenkins-build").val(value).trigger('change')
ready: ->
meter = $(@node).find(".jenkins-build")
$(@node).fadeOut().css('background-color', @get('bgColor')).fadeIn()
meter.attr("data-bgcolor", meter.css("background-color"))
meter.attr("data-fgcolor", meter.css("color"))
meter.knob()
onData: (data) ->
if data.currentResult isnt data.lastResult
$(@node).fadeOut().css('background-color', @get('bgColor')).fadeIn()
<h2 class="title" data-bind="computedtitle"></h2>
<input class="jenkins-build" data-angleOffset=-125 data-angleArc=250 data-width=150 data-height=150 data-readOnly=true data-bind-value="value | shortenedNumber" data-min="0" data-max="100">
<p class="more-info" data-bind="description"></p>
<p class="last-built" data-bind="lastBuilt"></p>
<p class="updated-at" data-bind="updatedAtMessage"></p>
require 'net/http'
require 'json'
require 'time'
require 'open-uri'
JENKINS_CONFIG = YAML.load(File.new("./conf/jenkins_build.yaml", "r").read)
JENKINS_URI = JENKINS_CONFIG['jenkins_uri'] ? JENKINS_CONFIG['jenkins_uri'] : "http://localhost:8080"
JENKINS_AUTH = JENKINS_CONFIG['jenkins_auth'] ? JENKINS_CONFIG['jenkins_auth'] : {
'name' => nil,
'password' => nil
}
# 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 = JENKINS_CONFIG['job_mapping'] ? JENKINS_CONFIG['job_mapping'] : {
'JOB' => { :job => 'BUILD', :pre_job => 'PRE_BUILD'}
}
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)
return 0 if not build_info["building"]
estimated_duration = (build_info["estimatedDuration"] / 1000).round(2)
current_duration = (Time.now.to_f - build_info["timestamp"] / 1000).round(2)
return 99 if current_duration >= estimated_duration
((current_duration * 100) / estimated_duration).round(0)
end
def get_json_for_job(job_name, build = 'lastBuild')
job_name = URI.encode(job_name)
uri = URI.parse("#{JENKINS_URI}/job/#{job_name}/#{build}/api/json")
if JENKINS_AUTH['name']
data = uri.read(http_basic_authentication: [JENKINS_AUTH['name'], JENKINS_AUTH['password']])
else
data = uri.read
end
JSON.parse(data)
end
job_mapping.each do |title, jenkins_project|
current_status = nil
SCHEDULER.every '10s', :first_in => 0 do |job|
last_status = current_status
build_info = get_json_for_job(jenkins_project[:job])
current_status = build_info["result"]
if build_info["building"]
current_status = "BUILDING"
percent = get_completion_percentage(jenkins_project[:job])
elsif jenkins_project[:pre_job]
pre_build_info = get_json_for_job(jenkins_project[:pre_job])
current_status = "PREBUILD" if pre_build_info["building"]
percent = get_completion_percentage(jenkins_project[:pre_job])
end
projectName = jenkins_project[:job]
send_event(title, {
currentResult: current_status,
lastResult: last_status,
timestamp: build_info["timestamp"],
jenkinsProject: projectName,
value: percent
})
end
end
// ----------------------------------------------------------------------------
// Sass declarations
// ----------------------------------------------------------------------------
$background-color: #4b5f24;
$title-color: rgba(255, 255, 255, 1);
$moreinfo-color: rgba(255, 255, 255, 0.7);
$meter-background: rgba(20, 20, 20, 1);
// ----------------------------------------------------------------------------
// Widget-jenkins-build styles
// ----------------------------------------------------------------------------
.widget-jenkins-build {
background-color: $background-color;
input.jenkins-build {
background-color: $meter-background;
color: #fff;
}
.title {
color: $title-color;
font-size: 28px;
}
.more-info {
color: $moreinfo-color;
}
.updated-at {
color: rgba(0, 0, 0, 1);
}
}
---
jenkins_uri: http://my.jenkins.server/jenkins
jenkins_auth:
name: username
password: password
job_mapping:
job1:
:job: First Job
job2:
:job: Second Job
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment