jenkins_api_client 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +7 -0
- data/CHANGELOG.md +9 -2
- data/Gemfile +1 -0
- data/README.md +15 -0
- data/Rakefile +2 -0
- data/java_deps/jenkins-cli.jar +0 -0
- data/jenkins_api_client.gemspec +100 -0
- data/lib/jenkins_api_client/build_queue.rb +3 -0
- data/lib/jenkins_api_client/cli/base.rb +7 -1
- data/lib/jenkins_api_client/cli/helper.rb +8 -0
- data/lib/jenkins_api_client/cli/job.rb +24 -1
- data/lib/jenkins_api_client/cli/node.rb +12 -0
- data/lib/jenkins_api_client/cli/system.rb +5 -0
- data/lib/jenkins_api_client/client.rb +150 -32
- data/lib/jenkins_api_client/exceptions.rb +16 -0
- data/lib/jenkins_api_client/job.rb +5 -1
- data/lib/jenkins_api_client/node.rb +2 -0
- data/lib/jenkins_api_client/system.rb +2 -0
- data/lib/jenkins_api_client/version.rb +7 -2
- data/lib/jenkins_api_client/view.rb +3 -0
- data/scripts/login_with_irb.rb +39 -1
- data/spec/unit_tests/client_spec.rb +51 -0
- data/spec/unit_tests/job_spec.rb +4 -2
- metadata +156 -127
@@ -21,19 +21,26 @@
|
|
21
21
|
#
|
22
22
|
|
23
23
|
module JenkinsApi
|
24
|
+
# This module contains classes that define exceptions for various catories.
|
24
25
|
module Exceptions
|
26
|
+
# This is the base class for Exceptions that is inherited from
|
27
|
+
# RuntimeError.
|
25
28
|
class ApiException < RuntimeError
|
26
29
|
def initialize(message = "")
|
27
30
|
super("Error: #{message}")
|
28
31
|
end
|
29
32
|
end
|
30
33
|
|
34
|
+
# This exception class handles cases where invalid credentials are provided
|
35
|
+
# to connect to the Jenkins
|
31
36
|
class UnautherizedException < ApiException
|
32
37
|
def initialize(message = "")
|
33
38
|
super("Invalid credentials are provided. #{message}")
|
34
39
|
end
|
35
40
|
end
|
36
41
|
|
42
|
+
# This exception class handles cases where a requested page is not found on
|
43
|
+
# the Jenkins API
|
37
44
|
class NotFoundException < ApiException
|
38
45
|
def initialize(message = "")
|
39
46
|
super("Requested component is not found on the Jenkins CI server." +
|
@@ -41,6 +48,8 @@ module JenkinsApi
|
|
41
48
|
end
|
42
49
|
end
|
43
50
|
|
51
|
+
# This exception class handles cases where the Jenkins API returns with a
|
52
|
+
# 500 Internel Server Error
|
44
53
|
class InternelServerErrorException < ApiException
|
45
54
|
def initialize(message = "")
|
46
55
|
super("Internel Server Error. Perhaps the in-memory configuration of" +
|
@@ -49,5 +58,12 @@ module JenkinsApi
|
|
49
58
|
)
|
50
59
|
end
|
51
60
|
end
|
61
|
+
|
62
|
+
# Exception occurred while running java CLI commands
|
63
|
+
class CLIException < ApiException
|
64
|
+
def initialize(message = "")
|
65
|
+
super("Execute CLI Error. #{message}")
|
66
|
+
end
|
67
|
+
end
|
52
68
|
end
|
53
69
|
end
|
@@ -22,6 +22,8 @@
|
|
22
22
|
|
23
23
|
module JenkinsApi
|
24
24
|
class Client
|
25
|
+
# This class communicates with the Jenkins "/job" API to obtain details
|
26
|
+
# about jobs, creating, deleting, building, and various other operations.
|
25
27
|
class Job
|
26
28
|
|
27
29
|
# Initialize the Job object and store the reference to Client object
|
@@ -211,6 +213,7 @@ module JenkinsApi
|
|
211
213
|
# @option params [String] :notification_email Email address to send
|
212
214
|
# @option params [TrueClass|FalseClass] :notification_email_for_every_unstable
|
213
215
|
# Send email notification email for every unstable build
|
216
|
+
#
|
214
217
|
def add_email_notification(params)
|
215
218
|
raise "No job name specified" unless params[:name]
|
216
219
|
raise "No email address specified" unless params[:notification_email]
|
@@ -357,7 +360,8 @@ module JenkinsApi
|
|
357
360
|
end
|
358
361
|
get_msg = "/job/#{job_name}/#{build_num}/logText/progressive#{mode}?"
|
359
362
|
get_msg << "start=#{start}"
|
360
|
-
|
363
|
+
raw_response = true
|
364
|
+
api_response = @client.api_get_request(get_msg, nil, nil, raw_response)
|
361
365
|
#puts "Response: #{api_response.header['x-more-data']}"
|
362
366
|
response = {}
|
363
367
|
response['output'] = api_response.body
|
@@ -22,10 +22,15 @@
|
|
22
22
|
|
23
23
|
module JenkinsApi
|
24
24
|
class Client
|
25
|
+
# Major version of the gem
|
25
26
|
MAJOR = 0
|
26
|
-
|
27
|
-
|
27
|
+
# Minor version of the gem
|
28
|
+
MINOR = 10
|
29
|
+
# Tiny version of the gem used for patches
|
30
|
+
TINY = 0
|
31
|
+
# Used for pre-releases
|
28
32
|
PRE = nil
|
33
|
+
# Version String of Jenkins API Client.
|
29
34
|
VERSION = [MAJOR, MINOR, TINY, PRE].compact.join('.')
|
30
35
|
end
|
31
36
|
end
|
data/scripts/login_with_irb.rb
CHANGED
@@ -7,8 +7,46 @@ require 'jenkins_api_client'
|
|
7
7
|
require 'yaml'
|
8
8
|
require 'irb'
|
9
9
|
|
10
|
+
def prompt_for_username
|
11
|
+
get_from_stdin("Username: ", false)
|
12
|
+
end
|
13
|
+
|
14
|
+
def prompt_for_password
|
15
|
+
get_from_stdin("Password: ", true)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_from_stdin(prompt, mask = false)
|
19
|
+
$stdout.write(prompt)
|
20
|
+
|
21
|
+
begin
|
22
|
+
Kernel::system "stty -echo" if mask == true
|
23
|
+
ret = gets.chomp!
|
24
|
+
ensure
|
25
|
+
if mask == true
|
26
|
+
Kernel::system "stty echo"
|
27
|
+
puts ""
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
ret
|
32
|
+
end
|
33
|
+
|
34
|
+
if ARGV.empty?
|
35
|
+
config_file = '~/.jenkins_api_client/login.yml'
|
36
|
+
else
|
37
|
+
config_file = ARGV.shift
|
38
|
+
end
|
39
|
+
|
10
40
|
begin
|
11
|
-
|
41
|
+
client_opts = YAML.load_file(File.expand_path(config_file))
|
42
|
+
unless client_opts.has_key?(:username)
|
43
|
+
client_opts[:username] = prompt_for_username()
|
44
|
+
end
|
45
|
+
unless client_opts.has_key?(:password) or client_opts.has_key?(:password_base64)
|
46
|
+
client_opts[:password] = prompt_for_password()
|
47
|
+
end
|
48
|
+
|
49
|
+
@client = JenkinsApi::Client.new(client_opts)
|
12
50
|
puts "logged-in to the Jenkins API, use the '@client' variable to use the client"
|
13
51
|
end
|
14
52
|
|
@@ -24,6 +24,21 @@ describe JenkinsApi::Client do
|
|
24
24
|
end
|
25
25
|
).not_to raise_error
|
26
26
|
end
|
27
|
+
|
28
|
+
it "initializes with proxy args without exception" do
|
29
|
+
expect(
|
30
|
+
lambda do
|
31
|
+
JenkinsApi::Client.new(
|
32
|
+
:server_ip => '127.0.0.1',
|
33
|
+
:server_port => 8080,
|
34
|
+
:username => 'username',
|
35
|
+
:password => 'password',
|
36
|
+
:proxy_ip => '127.0.0.1',
|
37
|
+
:proxy_port => 8081
|
38
|
+
)
|
39
|
+
end
|
40
|
+
).not_to raise_error
|
41
|
+
end
|
27
42
|
end
|
28
43
|
|
29
44
|
describe "#SubClassAccessorMethods" do
|
@@ -187,6 +202,14 @@ describe JenkinsApi::Client do
|
|
187
202
|
).not_to raise_error(NoMethodError)
|
188
203
|
end
|
189
204
|
end
|
205
|
+
|
206
|
+
describe "#exec_cli" do
|
207
|
+
it "is defined and should execute the CLI" do
|
208
|
+
expect(
|
209
|
+
lambda { @client.exec_cli("version") }
|
210
|
+
).not_to raise_error(NoMethodError)
|
211
|
+
end
|
212
|
+
end
|
190
213
|
end
|
191
214
|
end
|
192
215
|
|
@@ -230,6 +253,34 @@ describe JenkinsApi::Client do
|
|
230
253
|
end
|
231
254
|
).to raise_error
|
232
255
|
end
|
256
|
+
|
257
|
+
it "Should fail if proxy_ip is specified but proxy_port is not" do
|
258
|
+
expect(
|
259
|
+
lambda do
|
260
|
+
JenkinsApi::Client.new({
|
261
|
+
:bogus => '127.0.0.1',
|
262
|
+
:server_port => 8080,
|
263
|
+
:username => 'username',
|
264
|
+
:password => 'password',
|
265
|
+
:proxy_ip => '127.0.0.1',
|
266
|
+
})
|
267
|
+
end
|
268
|
+
).to raise_error
|
269
|
+
end
|
270
|
+
|
271
|
+
it "Should fail if proxy_port is specified but proxy_ip is not" do
|
272
|
+
expect(
|
273
|
+
lambda do
|
274
|
+
JenkinsApi::Client.new({
|
275
|
+
:bogus => '127.0.0.1',
|
276
|
+
:server_port => 8080,
|
277
|
+
:username => 'username',
|
278
|
+
:password => 'password',
|
279
|
+
:proxy_port => 8081,
|
280
|
+
})
|
281
|
+
end
|
282
|
+
).to raise_error
|
283
|
+
end
|
233
284
|
end
|
234
285
|
end
|
235
286
|
end
|
data/spec/unit_tests/job_spec.rb
CHANGED
@@ -197,8 +197,10 @@ describe JenkinsApi::Client::Job do
|
|
197
197
|
|
198
198
|
describe "#get_console_output" do
|
199
199
|
it "accepts the job name and the obtains the console output" do
|
200
|
-
|
201
|
-
|
200
|
+
msg = "/job/test_job/1/logText/progressiveText?start=0"
|
201
|
+
@client.should_receive(:api_get_request).
|
202
|
+
with(msg, nil, nil, true).
|
203
|
+
and_return(Net::HTTP.get_response(URI('http://example.com/index.html')))
|
202
204
|
@job.get_console_output('test_job', 1, 0, 'text')
|
203
205
|
end
|
204
206
|
|
metadata
CHANGED
@@ -1,138 +1,172 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: jenkins_api_client
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 9
|
8
|
-
- 1
|
9
|
-
version: 0.9.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.10.0
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Kannan Manickam
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
21
|
-
prerelease: false
|
22
|
-
type: :runtime
|
12
|
+
date: 2013-04-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
23
15
|
name: nokogiri
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
version: "0"
|
31
|
-
requirement: *id001
|
32
|
-
- !ruby/object:Gem::Dependency
|
33
|
-
prerelease: false
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
34
22
|
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
35
31
|
name: thor
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
- 0
|
42
|
-
- 16
|
43
|
-
- 0
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
44
37
|
version: 0.16.0
|
45
|
-
requirement: *id002
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
prerelease: false
|
48
38
|
type: :runtime
|
49
|
-
name: json
|
50
|
-
version_requirements: &id003 !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
segments:
|
55
|
-
- 0
|
56
|
-
version: "0"
|
57
|
-
requirement: *id003
|
58
|
-
- !ruby/object:Gem::Dependency
|
59
39
|
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.16.0
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: json
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
60
54
|
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
61
63
|
name: terminal-table
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
- 1
|
68
|
-
- 4
|
69
|
-
- 0
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
70
69
|
version: 1.4.0
|
71
|
-
|
72
|
-
- !ruby/object:Gem::Dependency
|
70
|
+
type: :runtime
|
73
71
|
prerelease: false
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.4.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: mixlib-shellout
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 1.1.0
|
86
|
+
type: :runtime
|
86
87
|
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.1.0
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: bundler
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '1.0'
|
87
102
|
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '1.0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
88
111
|
name: jeweler
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
- 1
|
95
|
-
- 6
|
96
|
-
- 4
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
97
117
|
version: 1.6.4
|
98
|
-
requirement: *id006
|
99
|
-
- !ruby/object:Gem::Dependency
|
100
|
-
prerelease: false
|
101
118
|
type: :development
|
102
|
-
name: simplecov
|
103
|
-
version_requirements: &id007 !ruby/object:Gem::Requirement
|
104
|
-
requirements:
|
105
|
-
- - ">="
|
106
|
-
- !ruby/object:Gem::Version
|
107
|
-
segments:
|
108
|
-
- 0
|
109
|
-
version: "0"
|
110
|
-
requirement: *id007
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
119
|
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.6.4
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: simplecov
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
113
134
|
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
114
143
|
name: rspec
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
description: ! '
|
159
|
+
|
125
160
|
This is a simple and easy-to-use Jenkins Api client with features focused on
|
126
|
-
|
127
|
-
|
161
|
+
|
162
|
+
automating Job configuration programaticaly and so forth'
|
163
|
+
email:
|
128
164
|
- arangamani.kannan@gmail.com
|
129
|
-
executables:
|
165
|
+
executables:
|
130
166
|
- jenkinscli
|
131
167
|
extensions: []
|
132
|
-
|
133
168
|
extra_rdoc_files: []
|
134
|
-
|
135
|
-
files:
|
169
|
+
files:
|
136
170
|
- .gitignore
|
137
171
|
- .jenkins.yml
|
138
172
|
- .travis.yml
|
@@ -143,6 +177,8 @@ files:
|
|
143
177
|
- Rakefile
|
144
178
|
- bin/jenkinscli
|
145
179
|
- config/login.yml.example
|
180
|
+
- java_deps/jenkins-cli.jar
|
181
|
+
- jenkins_api_client.gemspec
|
146
182
|
- lib/jenkins_api_client.rb
|
147
183
|
- lib/jenkins_api_client/build_queue.rb
|
148
184
|
- lib/jenkins_api_client/cli/base.rb
|
@@ -173,35 +209,28 @@ files:
|
|
173
209
|
- spec/unit_tests/spec_helper.rb
|
174
210
|
- spec/unit_tests/system_spec.rb
|
175
211
|
- spec/unit_tests/view_spec.rb
|
176
|
-
has_rdoc: true
|
177
212
|
homepage: https://github.com/arangamani/jenkins_api_client
|
178
213
|
licenses: []
|
179
|
-
|
180
214
|
post_install_message:
|
181
215
|
rdoc_options: []
|
182
|
-
|
183
|
-
require_paths:
|
216
|
+
require_paths:
|
184
217
|
- lib
|
185
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
requirements:
|
194
|
-
- -
|
195
|
-
- !ruby/object:Gem::Version
|
196
|
-
|
197
|
-
- 0
|
198
|
-
version: "0"
|
218
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
219
|
+
none: false
|
220
|
+
requirements:
|
221
|
+
- - ! '>='
|
222
|
+
- !ruby/object:Gem::Version
|
223
|
+
version: '0'
|
224
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
225
|
+
none: false
|
226
|
+
requirements:
|
227
|
+
- - ! '>='
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
199
230
|
requirements: []
|
200
|
-
|
201
231
|
rubyforge_project:
|
202
|
-
rubygems_version: 1.
|
232
|
+
rubygems_version: 1.8.23
|
203
233
|
signing_key:
|
204
234
|
specification_version: 3
|
205
235
|
summary: Jenkins JSON API Client
|
206
236
|
test_files: []
|
207
|
-
|