sensu-plugins-jenkins 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7918b4078d558782344da984a537da2f240fa2ba
4
- data.tar.gz: 52709e0d5ea8e79130064b9a9379eba7a88c2fae
3
+ metadata.gz: deb1fb9a4cca84c812d40c614d17fc9cd5f701f9
4
+ data.tar.gz: aed0d9935e51586b5da4d5c935009b6b804a5bb3
5
5
  SHA512:
6
- metadata.gz: bd9e06d9fc9f86ea1e33fa4e660545dd4d997bc4085389f5b9be38e8ecc41e2d00a626340ddb33b0be14125b21cd155c0fe77f5ba609369e56f0305e9979bae4
7
- data.tar.gz: 5422e5254ba9d83bb7091a74cc95894576a20f11daef65642929658b24f83f1bca3127968092541d6ed476e01f309a4eda306e05626807adee32798e43c29346
6
+ metadata.gz: 892ae6fc25459aa1ff0be4b815d86c38a9337223a4b24a7186733ff4c10d012da97b489b7b986d7b957e1104c24003814d63095f8d63880fff3d1205fac48343
7
+ data.tar.gz: c702b9eafc459fd07f8413a62ca31375325e17b3bdf3e1dba877bc562aac36d248297f85e61482b5063c83c0e50367c3c7f87f4145ec9b3d435c2ef0a15a87fb
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -3,9 +3,18 @@ This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
4
  This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
5
5
 
6
- ## Unreleased][unreleased]
6
+ ## [Unreleased][unreleased]
7
7
 
8
- ## [0.0.2] - 2015-06-04
8
+ ## [0.0.4] - 2015-07-14
9
+ ### Changed
10
+ - updated sensu-plugin gem to 1.2.0
11
+
12
+ ## [0.0.3] - 2015-06-4
13
+ ### Added
14
+ - New check `bin/check-jenkins-build-time.rb` which alerts when Jenkins builds
15
+ fail to succeed within a certain duration or configurable time window.
16
+
17
+ ## [0.0.2] - 2015-06-03
9
18
 
10
19
  ### Added
11
20
  - PR #1
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## Sensu-Plugins-jenkins
2
2
 
3
- [![Build Status](https://travis-ci.org/sensu-plugins/sensu-plugins-jenkins.svg?branch=master)](https://travis-ci.org/sensu-plugins/sensu-plugins-jenkins)
3
+ [ ![Build Status](https://travis-ci.org/sensu-plugins/sensu-plugins-jenkins.svg?branch=master)](https://travis-ci.org/sensu-plugins/sensu-plugins-jenkins)
4
4
  [![Gem Version](https://badge.fury.io/rb/sensu-plugins-jenkins.svg)](http://badge.fury.io/rb/sensu-plugins-jenkins)
5
5
  [![Code Climate](https://codeclimate.com/github/sensu-plugins/sensu-plugins-jenkins/badges/gpa.svg)](https://codeclimate.com/github/sensu-plugins/sensu-plugins-jenkins)
6
6
  [![Test Coverage](https://codeclimate.com/github/sensu-plugins/sensu-plugins-jenkins/badges/coverage.svg)](https://codeclimate.com/github/sensu-plugins/sensu-plugins-jenkins)
@@ -10,6 +10,7 @@
10
10
  ## Functionality
11
11
 
12
12
  ## Files
13
+ * bin/check-jenkins-build-time.rb
13
14
  * bin/check-jenkins-health.rb
14
15
  * bin/check-jenkins-job-status.rb
15
16
  * bin/check-jenkins.rb
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # check-jenkins-build-time
4
+ #
5
+ # DESCRIPTION:
6
+ # Alert if the last successful build timestamp of a jenkins job is older than
7
+ # a specified time duration OR not within a specific daily time window.
8
+ #
9
+ # OUTPUT:
10
+ # plain text
11
+ #
12
+ # PLATFORMS:
13
+ # Linux
14
+ #
15
+ # USAGE:
16
+ # check-jenkins-build-time -u JENKINS_URL -j job_1_name=30min,job_2_name=1:30am-2:30am
17
+ #
18
+ # -j parameter should be a comma-separated list of JOB_NAME=TIME_EXPRESSION
19
+ # where TIME_EXPRESSION is either a relative time duration from now (30m, 1h) or
20
+ # a daily time window (1am-2am, 1:01am-2:01am), without spaces.
21
+ #
22
+ # DEPENDENCIES:
23
+ # gem: sensu-plugin
24
+ # jenkins_api_client
25
+ # chronic_duration
26
+ #
27
+ #
28
+ # LICENSE:
29
+ # Copyright Matt Greensmith mgreensmith@cozy.co matt@mattgreensmith.net
30
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
31
+ # for details.
32
+ #
33
+
34
+ require 'sensu-plugin/check/cli'
35
+ require 'jenkins_api_client'
36
+ require 'chronic_duration'
37
+
38
+ class JenkinsBuildTime < Sensu::Plugin::Check::CLI
39
+ ONE_DAY = 86_400
40
+
41
+ option :url,
42
+ description: 'URL to Jenkins API',
43
+ short: '-u JENKINS_URL',
44
+ long: '--url JENKINS_URL',
45
+ required: true
46
+
47
+ option :jobs,
48
+ description: 'Jobs to check. Comma-separated list of JOB_NAME=TIME_EXPRESSION',
49
+ short: '-j JOB_NAME=TIME_EXPRESSION,[JOB_NAME=TIME_EXPRESSION]',
50
+ long: '--jobs JOB_NAME=TIME_EXPRESSION,[JOB_NAME=TIME_EXPRESSION]',
51
+ required: true
52
+
53
+ def run
54
+ @now = Time.now
55
+ critical_jobs = []
56
+
57
+ jobs = parse_jobs_param
58
+
59
+ jobs.each do |job_name, time_expression|
60
+ last_build_time = build_time(job_name, last_successful_build_number(job_name))
61
+ if time_expression_is_window?(time_expression)
62
+ unless time_within_window?(last_build_time,
63
+ parse_window_start(time_expression),
64
+ parse_window_end(time_expression))
65
+ critical_jobs << critical_message(job_name, last_build_time, time_expression)
66
+ end
67
+ else
68
+ unless time_within_allowed_duration?(last_build_time,
69
+ parse_duration_seconds(time_expression))
70
+ critical_jobs << critical_message(job_name, last_build_time, time_expression)
71
+ end
72
+ end
73
+ end
74
+
75
+ critical "#{critical_jobs.length} failure(s): #{critical_jobs.join(', ')}" unless critical_jobs.empty?
76
+ ok "#{jobs.keys.length} job(s) had successful builds within allowed times"
77
+ end
78
+
79
+ private
80
+
81
+ def jenkins
82
+ @jenkins ||= JenkinsApi::Client.new(server_ip: config[:url], log_level: 3)
83
+ end
84
+
85
+ def last_successful_build_number(job_name)
86
+ jenkins.job.list_details(job_name)['lastSuccessfulBuild']['number']
87
+ end
88
+
89
+ def build_time(job_name, build_number)
90
+ # Jenkins expresses timestamps in epoch millis
91
+ Time.at(jenkins.job.get_build_details(job_name, build_number)['timestamp'] / 1000)
92
+ end
93
+
94
+ def time_expression_is_window?(time_expression)
95
+ time_expression.index('-') ? true : false
96
+ end
97
+
98
+ def parse_window_start(time_expression)
99
+ Time.parse(time_expression.split('-')[0])
100
+ end
101
+
102
+ def parse_window_end(time_expression)
103
+ Time.parse(time_expression.split('-')[1])
104
+ end
105
+
106
+ def time_within_window?(time, window_start, window_end)
107
+ time_after_window_start_today = window_start < time
108
+ time_in_window_today = time_after_window_start_today && window_end > time
109
+
110
+ time_after_window_start_yesterday = (window_start - ONE_DAY) < time
111
+ time_in_window_yesterday = time_after_window_start_yesterday && (window_end - ONE_DAY) > time
112
+
113
+ if @now < window_end && @now > window_start # we are in the window, so we will accept today or yesterday
114
+ time_ok = (time_in_window_today || time_in_window_yesterday)
115
+ elsif @now < window_end
116
+ # we are before the window, so we only accept yesterday
117
+ time_ok = time_in_window_yesterday
118
+ else
119
+ # we are after the window, so we only accept today
120
+ time_ok = time_in_window_today
121
+ end
122
+ time_ok
123
+ end
124
+
125
+ def parse_duration_seconds(time_expression)
126
+ ChronicDuration.parse(time_expression)
127
+ end
128
+
129
+ def time_within_allowed_duration?(time, duration_seconds)
130
+ time > (@now - duration_seconds)
131
+ end
132
+
133
+ def critical_message(job_name, last_build_time, time_expression)
134
+ "#{job_name}: last built at #{last_build_time}, not within allowed time: #{time_expression}"
135
+ end
136
+
137
+ def parse_jobs_param
138
+ jobs = {}
139
+ job_param = config[:jobs].split(',')
140
+ job_param.each do |j|
141
+ name, time_expression = j.split('=')
142
+ fail "Jobs mut be expressed as JOB_NAME=TIME_EXPRESSION. Invalid parameter: '#{j}'" if time_expression.nil?
143
+ jobs[name] = time_expression
144
+ end
145
+ jobs
146
+ end
147
+ end
@@ -2,7 +2,7 @@ module SensuPluginsJenkins
2
2
  module Version
3
3
  MAJOR = 0
4
4
  MINOR = 0
5
- PATCH = 3
5
+ PATCH = 4
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-jenkins
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sensu-Plugins and contributors
@@ -30,7 +30,7 @@ cert_chain:
30
30
  8sHuVruarogxxKPBzlL2is4EUb6oN/RdpGx2l4254+nyR+abg//Ed27Ym0PkB4lk
31
31
  HP0m8WSjZmFr109pE/sVsM5jtOCvogyujQOjNVGN4gz1wwPr
32
32
  -----END CERTIFICATE-----
33
- date: 2015-06-04 00:00:00.000000000 Z
33
+ date: 2015-07-14 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: sensu-plugin
@@ -38,14 +38,14 @@ dependencies:
38
38
  requirements:
39
39
  - - '='
40
40
  - !ruby/object:Gem::Version
41
- version: 1.1.0
41
+ version: 1.2.0
42
42
  type: :runtime
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - '='
47
47
  - !ruby/object:Gem::Version
48
- version: 1.1.0
48
+ version: 1.2.0
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rest-client
51
51
  requirement: !ruby/object:Gem::Requirement
@@ -74,6 +74,20 @@ dependencies:
74
74
  - - '='
75
75
  - !ruby/object:Gem::Version
76
76
  version: 1.3.0
77
+ - !ruby/object:Gem::Dependency
78
+ name: chronic_duration
79
+ requirement: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '='
82
+ - !ruby/object:Gem::Version
83
+ version: 0.10.6
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '='
89
+ - !ruby/object:Gem::Version
90
+ version: 0.10.6
77
91
  - !ruby/object:Gem::Dependency
78
92
  name: codeclimate-test-reporter
79
93
  requirement: !ruby/object:Gem::Requirement
@@ -92,14 +106,14 @@ dependencies:
92
106
  name: rubocop
93
107
  requirement: !ruby/object:Gem::Requirement
94
108
  requirements:
95
- - - "~>"
109
+ - - '='
96
110
  - !ruby/object:Gem::Version
97
111
  version: '0.30'
98
112
  type: :development
99
113
  prerelease: false
100
114
  version_requirements: !ruby/object:Gem::Requirement
101
115
  requirements:
102
- - - "~>"
116
+ - - '='
103
117
  - !ruby/object:Gem::Version
104
118
  version: '0.30'
105
119
  - !ruby/object:Gem::Dependency
@@ -208,12 +222,14 @@ executables:
208
222
  - check-jenkins.rb
209
223
  - check-jenkins-job-status.rb
210
224
  - check-jenkins-health.rb
225
+ - check-jenkins-build-time.rb
211
226
  extensions: []
212
227
  extra_rdoc_files: []
213
228
  files:
214
229
  - CHANGELOG.md
215
230
  - LICENSE
216
231
  - README.md
232
+ - bin/check-jenkins-build-time.rb
217
233
  - bin/check-jenkins-health.rb
218
234
  - bin/check-jenkins-job-status.rb
219
235
  - bin/check-jenkins.rb
metadata.gz.sig CHANGED
Binary file