jenkins_api_client 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. data/.gitignore +3 -0
  2. data/.jenkins.yml +9 -0
  3. data/.travis.yml +11 -15
  4. data/CHANGELOG.md +15 -0
  5. data/Gemfile +2 -2
  6. data/README.md +7 -9
  7. data/Rakefile +27 -14
  8. data/lib/jenkins_api_client.rb +36 -6
  9. data/lib/jenkins_api_client/build_queue.rb +213 -0
  10. data/lib/jenkins_api_client/cli/base.rb +10 -6
  11. data/lib/jenkins_api_client/cli/helper.rb +13 -4
  12. data/lib/jenkins_api_client/cli/job.rb +6 -9
  13. data/lib/jenkins_api_client/cli/node.rb +6 -4
  14. data/lib/jenkins_api_client/cli/system.rb +2 -1
  15. data/lib/jenkins_api_client/client.rb +31 -25
  16. data/lib/jenkins_api_client/job.rb +248 -95
  17. data/lib/jenkins_api_client/node.rb +128 -10
  18. data/lib/jenkins_api_client/system.rb +4 -2
  19. data/lib/jenkins_api_client/version.rb +2 -2
  20. data/lib/jenkins_api_client/view.rb +17 -4
  21. data/scripts/login_with_irb.rb +4 -3
  22. data/spec/func_tests/client_spec.rb +90 -0
  23. data/spec/func_tests/job_spec.rb +348 -0
  24. data/spec/func_tests/node_spec.rb +174 -0
  25. data/spec/{spec_helper.rb → func_tests/spec_helper.rb} +2 -2
  26. data/spec/func_tests/system_spec.rb +55 -0
  27. data/spec/func_tests/view_spec.rb +53 -0
  28. data/spec/unit_tests/client_spec.rb +211 -0
  29. data/spec/unit_tests/fixtures/files/computer_sample.xml +17 -0
  30. data/spec/unit_tests/fixtures/files/job_sample.xml +16 -0
  31. data/spec/unit_tests/job_spec.rb +355 -0
  32. data/spec/unit_tests/node_spec.rb +192 -0
  33. data/spec/unit_tests/spec_helper.rb +8 -0
  34. data/spec/unit_tests/system_spec.rb +54 -0
  35. data/spec/unit_tests/view_spec.rb +127 -0
  36. metadata +34 -23
  37. data/spec/client_spec.rb +0 -52
  38. data/spec/job_spec.rb +0 -158
  39. data/spec/node_spec.rb +0 -48
  40. data/spec/system_spec.rb +0 -46
data/.gitignore CHANGED
@@ -20,6 +20,9 @@ Gemfile.lock
20
20
  # MacOS:
21
21
  .DS_Store
22
22
 
23
+ # Rubymine
24
+ .idea
25
+
23
26
  # vim, emacs, textmate
24
27
  *~
25
28
  \#*
data/.jenkins.yml ADDED
@@ -0,0 +1,9 @@
1
+ name: jenkins_api_client_func_tests
2
+ git: git://github.com/arangamani/jenkins_api_client.git
3
+ ref: master
4
+ script:
5
+ - bundle install
6
+ - rake unit_tests
7
+ - rake func_tests
8
+ notification_email: kannan@rightscale.com
9
+ notification_email_for_every_unstable: true
data/.travis.yml CHANGED
@@ -1,24 +1,20 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 1.9.3
4
- before_install:
5
- - wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
6
- - sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
7
- - sudo apt-get update -qq
8
- - sudo apt-get install -qq jenkins
9
- - echo `sudo service jenkins status`
10
- - cat /var/log/jenkins/jenkins.log
11
- - echo `curl 10.0.2.15:8080`
12
- - echo `curl 10.0.2.15`
13
- - echo `curl localhost:8080`
14
- - echo `ifconfig`
15
- - echo `hostname`
16
- - echo `netstat -an`
17
- script: bundle exec rspec
4
+ - 1.9.2
5
+ - jruby-18mode
6
+ - jruby-19mode
7
+ - rbx-18mode
8
+ - rbx-19mode
9
+ - ruby-head
10
+ - jruby-head
11
+ - 1.8.7
12
+ - ree
13
+ script: bundle exec rake unit_tests
18
14
  notifications:
19
15
  email: false
20
16
  irc:
21
17
  on_success: change
22
18
  on_failure: always
23
19
  channels:
24
- - "irc.freenode.org##arangamani"
20
+ - "irc.freenode.org##jenins-api-client"
data/CHANGELOG.md CHANGED
@@ -1,6 +1,21 @@
1
1
  CHANGELOG
2
2
  =========
3
3
 
4
+ upcoming
5
+ --------
6
+
7
+ v0.7.0 [27-JAN-2012]
8
+ ---------------------
9
+ * Fixed a bug where the ignorecase was never used in view list
10
+ * Raise an error if the view doesnt exists while listing jobs
11
+ * Added capability to change the mode of a node
12
+ * Added support for giving node to restrict the job during creation
13
+ * Added support for notification_email option when setting up a job
14
+ * Added support for CVS provider in SCM
15
+ * Added `create_dump_slave` and `delete` methods in Node API
16
+ * Added BuildQueue class which is accessible by `@client.queue` method
17
+ * Improvements in all over the code for performance and error handling
18
+
4
19
  v0.6.2 [13-JAN-2013]
5
20
  ---------------------
6
21
  * Fixed a bug where running job previously aborted was not recognized by the color
data/Gemfile CHANGED
@@ -2,14 +2,14 @@ source "http://rubygems.org"
2
2
 
3
3
  gem "nokogiri"
4
4
  gem "activesupport", "~> 3.2.8"
5
- gem "thor", "~> 0.16.0"
5
+ gem "thor", ">= 0.16.0"
6
6
  gem "json", ">= 0"
7
7
  gem "terminal-table", ">= 1.4.0"
8
+ gem "builder", "~> 3.1.3"
8
9
 
9
10
  group :development do
10
11
  gem "bundler", ">= 1.0"
11
12
  gem "jeweler", ">= 1.6.4"
12
- gem "builder", "~> 3.1.3"
13
13
  gem "simplecov"
14
14
  gem "rspec"
15
15
  end
data/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  Jenkins API Client
2
2
  ==================
3
+ [![Build Status](https://travis-ci.org/arangamani/jenkins_api_client.png?branch=master)](https://travis-ci.org/arangamani/jenkins_api_client)
4
+ [![Dependency Status](https://gemnasium.com/arangamani/jenkins_api_client.png)](https://gemnasium.com/arangamani/jenkins_api_client)
5
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/arangamani/jenkins_api_client)
3
6
 
4
7
  Copyright © 2012, Kannan Manickam [![endorse](http://api.coderwall.com/arangamani/endorsecount.png)](http://coderwall.com/arangamani)
5
8
 
@@ -7,6 +10,8 @@ Client libraries for communicating with a Jenkins CI server and programatically
7
10
 
8
11
  IRC Channel: ##jenkins-api-client
9
12
 
13
+ Mailing list: jenkins.api.client@librelist.com
14
+
10
15
  OVERVIEW:
11
16
  ---------
12
17
  This project is a simple API client for interacting with Jenkins Continuous Integration server.
@@ -18,19 +23,12 @@ automatically manage jobs and other artifacts.
18
23
 
19
24
  DETAILS:
20
25
  --------
21
- This projects currently only provides functionality for the <tt>jobs, node, and system</tt> interfaces.
26
+ This projects currently only provides functionality for the <tt>jobs, node, and system</tt> interfaces.
22
27
  This is still a work-in-progress project. I mainly use the functionality of this project for my autmation
23
28
  work and the functionality mainly focussed on my usage and I believe others might find it useful
24
29
  too. I would love to add more features to it and I will continue working on improving existing
25
30
  features and add more interfaces such as nodes, views, build queue, etc,.
26
31
 
27
- CODE STATUS:
28
- ------------
29
-
30
- * Gemnasium: [![Dependency Status](https://gemnasium.com/arangamani/jenkins_api_client.png)](https://gemnasium.com/arangamani/jenkins_api_client)
31
-
32
- * Code Climate: [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/arangamani/jenkins_api_client)
33
-
34
32
  USAGE:
35
33
  ------
36
34
 
@@ -69,7 +67,7 @@ parameters to the Client or have a credentials file and just parse the yaml file
69
67
  The following call just passes the information as parameters
70
68
 
71
69
  ```ruby
72
- @client = JenkinsApi::Client.new(:server_ip => '0.0.0.0',
70
+ @client = JenkinsApi::Client.new(:server_ip => '0.0.0.0',
73
71
  :username => 'somename', :password => 'secret password')
74
72
  # The following call will return all jobs matching 'Testjob'
75
73
  puts @client.job.list("^Testjob")
data/Rakefile CHANGED
@@ -1,24 +1,37 @@
1
- require File.expand_path('../lib/jenkins_api_client', __FILE__)
2
- require File.expand_path('../lib/jenkins_api_client/version', __FILE__)
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+ require 'jenkins_api_client/version'
3
4
  require 'rake'
4
5
  require 'jeweler'
5
6
 
6
7
  Jeweler::Tasks.new do |gemspec|
7
- gemspec.name = 'jenkins_api_client'
8
- gemspec.version = JenkinsApi::Client::VERSION
9
- gemspec.platform = Gem::Platform::RUBY
10
- gemspec.date = Time.now.utc.strftime("%Y-%m-%d")
11
- gemspec.require_path = 'lib'
12
- gemspec.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
13
- gemspec.files = `git ls-files`.split("\n")
8
+ gemspec.name = 'jenkins_api_client'
9
+ gemspec.version = JenkinsApi::Client::VERSION
10
+ gemspec.platform = Gem::Platform::RUBY
11
+ gemspec.date = Time.now.utc.strftime("%Y-%m-%d")
12
+ gemspec.require_paths = ["lib"]
13
+ gemspec.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
14
+ gemspec.files = `git ls-files`.split("\n")
14
15
  gemspec.extra_rdoc_files = ['CHANGELOG.rdoc', 'LICENSE', 'README.rdoc']
15
- gemspec.authors = [ 'Kannan Manickam' ]
16
- gemspec.email = [ 'arangamani.kannan@gmail.com' ]
17
- gemspec.homepage = 'https://github.com/arangamani/jenkins_api_client'
18
- gemspec.summary = 'Jenkins JSON API Client'
19
- gemspec.description = %{
16
+ gemspec.authors = [ 'Kannan Manickam' ]
17
+ gemspec.email = [ 'arangamani.kannan@gmail.com' ]
18
+ gemspec.homepage = 'https://github.com/arangamani/jenkins_api_client'
19
+ gemspec.summary = 'Jenkins JSON API Client'
20
+ gemspec.description = %{
20
21
  This is a simple and easy-to-use Jenkins Api client with features focused on
21
22
  automating Job configuration programaticaly and so forth}
22
23
  gemspec.test_files = `git ls-files -- {spec}/*`.split("\n")
23
24
  gemspec.rubygems_version = '1.8.17'
24
25
  end
26
+
27
+ require 'rspec/core'
28
+ require 'rspec/core/rake_task'
29
+ RSpec::Core::RakeTask.new(:unit_tests) do |spec|
30
+ spec.pattern = FileList['spec/unit_tests/*_spec.rb']
31
+ spec.rspec_opts = ['--color', '--format documentation']
32
+ end
33
+
34
+ RSpec::Core::RakeTask.new(:func_tests) do |spec|
35
+ spec.pattern = FileList['spec/func_tests/*_spec.rb']
36
+ spec.rspec_opts = ['--color', '--format documentation']
37
+ end
@@ -1,6 +1,36 @@
1
- Dir[File.dirname(__FILE__) + '/jenkins_api_client/*.rb'].each do |file|
2
- require file
3
- end
4
- Dir[File.dirname(__FILE__) + '/jenkins_api_client/cli/*.rb'].each do |file|
5
- require file
6
- end
1
+ #
2
+ # Copyright (c) 2012 Kannan Manickam <arangamani.kannan@gmail.com>
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+
23
+ require 'jenkins_api_client/version'
24
+ require 'jenkins_api_client/exceptions'
25
+ require 'jenkins_api_client/client'
26
+ require 'jenkins_api_client/job'
27
+ require 'jenkins_api_client/node'
28
+ require 'jenkins_api_client/system'
29
+ require 'jenkins_api_client/view'
30
+ require 'jenkins_api_client/build_queue'
31
+
32
+ require 'jenkins_api_client/cli/helper'
33
+ require 'jenkins_api_client/cli/base'
34
+ require 'jenkins_api_client/cli/job'
35
+ require 'jenkins_api_client/cli/node'
36
+ require 'jenkins_api_client/cli/system'
@@ -0,0 +1,213 @@
1
+ #
2
+ # Copyright (c) 2013 Kannan Manickam <arangamani.kannan@gmail.com>
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+
23
+ module JenkinsApi
24
+ class Client
25
+ class BuildQueue
26
+
27
+ # Initializes a new BuildQueue object.
28
+ #
29
+ # @param [Object] client a reference to Client
30
+ #
31
+ def initialize(client)
32
+ @client = client
33
+ end
34
+
35
+ # Returns a string representation of BuildQueue class.
36
+ #
37
+ def to_s
38
+ "#<JenkinsApi::Client::BuildQueue>"
39
+ end
40
+
41
+ # Gives the number of jobs currently in the build queue
42
+ #
43
+ def size
44
+ response_json = @client.api_get_request("/queue")
45
+ response_json["items"].size
46
+ end
47
+
48
+ # Lists all tasks currently in the build queue
49
+ #
50
+ def list
51
+ response_json = @client.api_get_request("/queue")
52
+ tasks = []
53
+ response_json["items"].each do |item|
54
+ tasks << item["task"]["name"]
55
+ end
56
+ tasks
57
+ end
58
+
59
+ # Gets the time number of seconds the task is in the queue
60
+ #
61
+ # @param [String] task_name Name of the task/job
62
+ #
63
+ # @return [FixNum] age in seconds
64
+ #
65
+ def get_age(task_name)
66
+ age = nil
67
+ details = get_details(task_name)
68
+ unless details.empty?
69
+ age = Time.now - Time.at(details["inQueueSince"].to_i/1000)
70
+ end
71
+ age
72
+ end
73
+
74
+ # Obtains the detail Hash from the API response
75
+ #
76
+ # @param [String] task_name Name of the task/job
77
+ #
78
+ # @return [Hash] Queue details of the specified task/job
79
+ #
80
+ def get_details(task_name)
81
+ response_json = @client.api_get_request("/queue")
82
+ details = {}
83
+ response_json["items"].each do |item|
84
+ details = item if item["task"]["name"]
85
+ end
86
+ details
87
+ end
88
+
89
+ # Obtains the causes from the build queue for the specified task
90
+ #
91
+ # @param [String] task_name
92
+ #
93
+ # @return [Array] causes for the task to be in queue
94
+ #
95
+ def get_causes(task_name)
96
+ causes = nil
97
+ details = get_details(task_name)
98
+ unless details.empty?
99
+ causes = details["actions"]["causes"]
100
+ end
101
+ causes
102
+ end
103
+
104
+ # Obtains the reason why the task is in queue
105
+ #
106
+ # @param [String] task_name name of the task
107
+ #
108
+ # @return [String] reason for being in queue, nil if no task found
109
+ #
110
+ def get_reason(task_name)
111
+ reason = nil
112
+ details = get_details(task_name)
113
+ unless details.empty?
114
+ reason = details["why"]
115
+ end
116
+ reason
117
+ end
118
+
119
+ # Obtains the ETA given by Jenkins if any
120
+ #
121
+ # @param[String] task_name name of the task
122
+ #
123
+ # @return [String] ETA for the task, nil if no task found or ETA is
124
+ # not available
125
+ #
126
+ def get_eta(task_name)
127
+ eta = nil
128
+ details = get_details(task_name)
129
+ unless details.empty?
130
+ matched = details["why"].match(/.*\(ETA:(.*)\)/)
131
+ eta = matched[1].strip unless matched.nil?
132
+ end
133
+ eta
134
+ end
135
+
136
+ # Obtains the ID of the task from the queue
137
+ #
138
+ # @param [String] task_name name of the task
139
+ #
140
+ # @return [String] ID of the task, nil of no task is found
141
+ #
142
+ def get_id(task_name)
143
+ id = nil
144
+ details = get_details(task_name)
145
+ unless details.empty?
146
+ id = details["id"]
147
+ end
148
+ id
149
+ end
150
+
151
+ # Obtains the params from the build queue
152
+ #
153
+ # @param [String] task_name name of the task
154
+ #
155
+ # @return [String] params, nil if the no task is found
156
+ #
157
+ def get_params(task_name)
158
+ params = nil
159
+ details = get_details(task_name)
160
+ unless details.empty?
161
+ params = details["params"]
162
+ end
163
+ params
164
+ end
165
+
166
+ # Obtains whether the task is buildable
167
+ #
168
+ # @param [String] task_name name of the task
169
+ #
170
+ # @return [TrueClass|FalseClass] buildable or not
171
+ #
172
+ def is_buildable?(task_name)
173
+ buildable = nil
174
+ details = get_details(task_name)
175
+ unless details.empty?
176
+ buildable = details["buildable"] == "true" ? true : false
177
+ end
178
+ buildable
179
+ end
180
+
181
+ # Obtains whether the task is blocked
182
+ #
183
+ # @param [String] task_name name of the task
184
+ #
185
+ # @return [TrueClass|FalseClass] blocked or not
186
+ #
187
+ def is_blocked?(task_name)
188
+ blocked = nil
189
+ details = get_details(task_name)
190
+ unless details.empty?
191
+ blocked = details["blocked"] == "true" ? true : false
192
+ end
193
+ blocked
194
+ end
195
+
196
+ # Obtains whether the task is stuck
197
+ #
198
+ # @param [String] task_name name of the task
199
+ #
200
+ # @return [TrueClass|FalseClass] stuck or not
201
+ #
202
+ def is_stuck?(task_name)
203
+ stuck = nil
204
+ details = get_details(task_name)
205
+ unless details.empty?
206
+ stuck = details["stuck"] == "true" ? true : false
207
+ end
208
+ stuck
209
+ end
210
+
211
+ end
212
+ end
213
+ end