jenkins_api_client 0.12.1 → 0.13.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 +2 -0
- data/CHANGELOG.md +30 -1
- data/CONTRIBUTORS.md +13 -0
- data/README.md +126 -66
- data/Vagrantfile +85 -0
- data/config/login.yml.example +4 -0
- data/jenkins_api_client.gemspec +12 -12
- data/lib/jenkins_api_client/build_queue.rb +34 -0
- data/lib/jenkins_api_client/cli/job.rb +4 -11
- data/lib/jenkins_api_client/client.rb +241 -79
- data/lib/jenkins_api_client/exceptions.rb +109 -21
- data/lib/jenkins_api_client/job.rb +143 -28
- data/lib/jenkins_api_client/node.rb +16 -8
- data/lib/jenkins_api_client/system.rb +21 -2
- data/lib/jenkins_api_client/version.rb +2 -2
- data/lib/jenkins_api_client/view.rb +18 -1
- data/spec/func_tests/client_spec.rb +9 -15
- data/spec/func_tests/job_spec.rb +190 -51
- data/spec/func_tests/node_spec.rb +29 -12
- data/spec/func_tests/spec_helper.rb +1 -7
- data/spec/func_tests/system_spec.rb +25 -6
- data/spec/func_tests/view_spec.rb +101 -34
- data/spec/unit_tests/build_queue_spec.rb +4 -0
- data/spec/unit_tests/client_spec.rb +2 -36
- data/spec/unit_tests/job_spec.rb +48 -5
- data/spec/unit_tests/node_spec.rb +4 -7
- data/spec/unit_tests/spec_helper.rb +1 -0
- data/spec/unit_tests/system_spec.rb +15 -2
- data/spec/unit_tests/view_spec.rb +11 -7
- data/travis/jenkins_config_with_crumb.xml +67 -0
- data/travis/setup_crumb.sh +11 -0
- data/travis/spec.yml +4 -0
- metadata +158 -140
@@ -10,6 +10,7 @@ describe JenkinsApi::Client::Node do
|
|
10
10
|
context "With properly initialized client" do
|
11
11
|
before(:all) do
|
12
12
|
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
+
@valid_post_responses = [200, 201, 302]
|
13
14
|
@node_name = 'master'
|
14
15
|
begin
|
15
16
|
@client = JenkinsApi::Client.new(
|
@@ -46,9 +47,13 @@ describe JenkinsApi::Client::Node do
|
|
46
47
|
|
47
48
|
def test_and_validate(params)
|
48
49
|
name = params[:name]
|
49
|
-
@
|
50
|
+
@valid_post_responses.should include(
|
51
|
+
@client.node.create_dump_slave(params).to_i
|
52
|
+
)
|
50
53
|
@client.node.list(name).include?(name).should be_true
|
51
|
-
@
|
54
|
+
@valid_post_responses.should include(
|
55
|
+
@client.node.delete(params[:name]).to_i
|
56
|
+
)
|
52
57
|
@client.node.list(name).include?(name).should be_false
|
53
58
|
end
|
54
59
|
|
@@ -75,7 +80,7 @@ describe JenkinsApi::Client::Node do
|
|
75
80
|
}
|
76
81
|
expect(
|
77
82
|
lambda{ @client.node.create_dump_slave(params) }
|
78
|
-
).to raise_error
|
83
|
+
).to raise_error(ArgumentError)
|
79
84
|
end
|
80
85
|
it "fails if slave_host is missing" do
|
81
86
|
params = {
|
@@ -84,7 +89,7 @@ describe JenkinsApi::Client::Node do
|
|
84
89
|
}
|
85
90
|
expect(
|
86
91
|
lambda{ @client.node.create_dump_slave(params) }
|
87
|
-
).to raise_error
|
92
|
+
).to raise_error(ArgumentError)
|
88
93
|
end
|
89
94
|
it "fails if private_key_file is missing" do
|
90
95
|
params = {
|
@@ -93,7 +98,7 @@ describe JenkinsApi::Client::Node do
|
|
93
98
|
}
|
94
99
|
expect(
|
95
100
|
lambda{ @client.node.create_dump_slave(params) }
|
96
|
-
).to raise_error
|
101
|
+
).to raise_error(ArgumentError)
|
97
102
|
end
|
98
103
|
it "fails if the slave already exists in Jenkins" do
|
99
104
|
params = {
|
@@ -101,11 +106,15 @@ describe JenkinsApi::Client::Node do
|
|
101
106
|
:slave_host => "10.10.10.10",
|
102
107
|
:private_key_file => "/root/.ssh/id_rsa"
|
103
108
|
}
|
104
|
-
@
|
109
|
+
@valid_post_responses.should include(
|
110
|
+
@client.node.create_dump_slave(params).to_i
|
111
|
+
)
|
105
112
|
expect(
|
106
113
|
lambda{ @client.node.create_dump_slave(params) }
|
107
|
-
).to raise_error
|
108
|
-
@
|
114
|
+
).to raise_error(JenkinsApi::Exceptions::NodeAlreadyExists)
|
115
|
+
@valid_post_responses.should include(
|
116
|
+
@client.node.delete(params[:name]).to_i
|
117
|
+
)
|
109
118
|
end
|
110
119
|
end
|
111
120
|
|
@@ -116,8 +125,12 @@ describe JenkinsApi::Client::Node do
|
|
116
125
|
:slave_host => "10.10.10.10",
|
117
126
|
:private_key_file => "/root/.ssh/id_rsa"
|
118
127
|
}
|
119
|
-
@
|
120
|
-
|
128
|
+
@valid_post_responses.should include(
|
129
|
+
@client.node.create_dump_slave(params).to_i
|
130
|
+
)
|
131
|
+
@valid_post_responses.should include(
|
132
|
+
@client.node.delete(params[:name]).to_i
|
133
|
+
)
|
121
134
|
end
|
122
135
|
it "raises an error if the slave doesn't exist in Jenkins" do
|
123
136
|
expect(
|
@@ -167,8 +180,12 @@ describe JenkinsApi::Client::Node do
|
|
167
180
|
|
168
181
|
describe "#change_mode" do
|
169
182
|
it "changes the mode of the given slave to the given mode" do
|
170
|
-
@
|
171
|
-
|
183
|
+
@valid_post_responses.should include(
|
184
|
+
@client.node.change_mode("slave", "exclusive").to_i
|
185
|
+
)
|
186
|
+
@valid_post_responses.should include(
|
187
|
+
@client.node.change_mode("slave", "normal").to_i
|
188
|
+
)
|
172
189
|
end
|
173
190
|
end
|
174
191
|
|
@@ -10,13 +10,8 @@ require 'pp'
|
|
10
10
|
require 'yaml'
|
11
11
|
require 'nokogiri'
|
12
12
|
|
13
|
-
#RSpec.configure do |config|
|
14
|
-
# config.mock_with :flexmock
|
15
|
-
#end
|
16
|
-
|
17
13
|
module JenkinsApiSpecHelper
|
18
14
|
class Helper
|
19
|
-
|
20
15
|
def create_job_xml
|
21
16
|
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') { |xml|
|
22
17
|
xml.project {
|
@@ -33,7 +28,7 @@ module JenkinsApiSpecHelper
|
|
33
28
|
xml.concurrentBuild "false"
|
34
29
|
xml.builders {
|
35
30
|
xml.send("hudson.tasks.Shell") {
|
36
|
-
xml.command "\necho 'going to take a nice nap'\nsleep
|
31
|
+
xml.command "\necho 'going to take a nice nap'\nsleep 15\necho 'took a nice nap'"
|
37
32
|
}
|
38
33
|
}
|
39
34
|
xml.publishers
|
@@ -42,6 +37,5 @@ module JenkinsApiSpecHelper
|
|
42
37
|
}
|
43
38
|
builder.to_xml
|
44
39
|
end
|
45
|
-
|
46
40
|
end
|
47
41
|
end
|
@@ -10,8 +10,11 @@ describe JenkinsApi::Client::System do
|
|
10
10
|
context "With properly initialized client" do
|
11
11
|
before(:all) do
|
12
12
|
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
+
@valid_post_responses = [200, 201, 302]
|
13
14
|
begin
|
14
|
-
@client = JenkinsApi::Client.new(
|
15
|
+
@client = JenkinsApi::Client.new(
|
16
|
+
YAML.load_file(File.expand_path(@creds_file, __FILE__))
|
17
|
+
)
|
15
18
|
rescue Exception => e
|
16
19
|
puts "WARNING: Credentials are not set properly."
|
17
20
|
puts e.message
|
@@ -22,19 +25,25 @@ describe JenkinsApi::Client::System do
|
|
22
25
|
|
23
26
|
describe "#quiet_down" do
|
24
27
|
it "Should be able to quiet down a Jenkins server" do
|
25
|
-
@
|
28
|
+
@valid_post_responses.should include(
|
29
|
+
@client.system.quiet_down.to_i
|
30
|
+
)
|
26
31
|
end
|
27
32
|
end
|
28
33
|
|
29
34
|
describe "#cancel_quiet_down" do
|
30
35
|
it "Should be able to cancel the quiet down a Jenkins server" do
|
31
|
-
@
|
36
|
+
@valid_post_responses.should include(
|
37
|
+
@client.system.cancel_quiet_down.to_i
|
38
|
+
)
|
32
39
|
end
|
33
40
|
end
|
34
41
|
|
35
42
|
describe "#restart" do
|
36
43
|
it "Should be able to restart a Jenkins server safely" do
|
37
|
-
@
|
44
|
+
@valid_post_responses.should include(
|
45
|
+
@client.system.restart.to_i
|
46
|
+
)
|
38
47
|
end
|
39
48
|
|
40
49
|
it "Should be able to wait after a safe restart" do
|
@@ -42,7 +51,9 @@ describe JenkinsApi::Client::System do
|
|
42
51
|
end
|
43
52
|
|
44
53
|
it "Should be able to force restart a Jenkins server" do
|
45
|
-
@
|
54
|
+
@valid_post_responses.should include(
|
55
|
+
@client.system.restart(true).to_i
|
56
|
+
)
|
46
57
|
end
|
47
58
|
|
48
59
|
it "Should be able to wait after a force restart" do
|
@@ -52,13 +63,21 @@ describe JenkinsApi::Client::System do
|
|
52
63
|
|
53
64
|
describe "#reload" do
|
54
65
|
it "Should be able to reload a Jenkins server" do
|
55
|
-
@
|
66
|
+
@valid_post_responses.should include(
|
67
|
+
@client.system.reload.to_i
|
68
|
+
)
|
56
69
|
end
|
57
70
|
it "Should be able to wait after a force restart" do
|
58
71
|
@client.system.wait_for_ready.should == true
|
59
72
|
end
|
60
73
|
end
|
61
74
|
|
75
|
+
describe "#list_users" do
|
76
|
+
it "Should be able to get a list of users" do
|
77
|
+
@client.system.list_users.size == 1
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
62
81
|
end
|
63
82
|
|
64
83
|
end
|
@@ -10,6 +10,7 @@ describe JenkinsApi::Client::View do
|
|
10
10
|
context "With properly initialized client" do
|
11
11
|
before(:all) do
|
12
12
|
@creds_file = '~/.jenkins_api_client/spec.yml'
|
13
|
+
@valid_post_responses = [200, 201, 302]
|
13
14
|
@node_name = 'master'
|
14
15
|
begin
|
15
16
|
@client = JenkinsApi::Client.new(
|
@@ -21,7 +22,9 @@ describe JenkinsApi::Client::View do
|
|
21
22
|
end
|
22
23
|
|
23
24
|
# Create a view that can be used for tests
|
24
|
-
@
|
25
|
+
@valid_post_responses.should include(
|
26
|
+
@client.view.create("general_purpose_view").to_i
|
27
|
+
)
|
25
28
|
end
|
26
29
|
|
27
30
|
describe "InstanceMethods" do
|
@@ -35,42 +38,75 @@ describe JenkinsApi::Client::View do
|
|
35
38
|
describe "#create" do
|
36
39
|
it "accepts the name of the view and creates the view" do
|
37
40
|
name = "test_view"
|
38
|
-
@
|
41
|
+
@valid_post_responses.should include(
|
42
|
+
@client.view.create(name).to_i
|
43
|
+
)
|
39
44
|
@client.view.list(name).include?(name).should be_true
|
40
|
-
@
|
45
|
+
@valid_post_responses.should include(
|
46
|
+
@client.view.delete(name).to_i
|
47
|
+
)
|
41
48
|
end
|
42
49
|
it "accepts spaces and other characters in the view name" do
|
43
50
|
name = "test view with spaces and {special characters}"
|
44
|
-
@
|
51
|
+
@valid_post_responses.should include(
|
52
|
+
@client.view.create(name).to_i
|
53
|
+
)
|
45
54
|
@client.view.list(name).include?(name).should be_true
|
46
|
-
@
|
55
|
+
@valid_post_responses.should include(
|
56
|
+
@client.view.delete(name).to_i
|
57
|
+
)
|
47
58
|
end
|
48
59
|
it "accepts the name of view and creates a listview" do
|
49
60
|
name = "test_view"
|
50
|
-
@
|
61
|
+
@valid_post_responses.should include(
|
62
|
+
@client.view.create(name, "listview").to_i
|
63
|
+
)
|
51
64
|
@client.view.list(name).include?(name).should be_true
|
52
|
-
@
|
65
|
+
@valid_post_responses.should include(
|
66
|
+
@client.view.delete(name).to_i
|
67
|
+
)
|
53
68
|
end
|
54
69
|
it "accepts the name of view and creates a myview" do
|
55
70
|
name = "test_view"
|
56
|
-
@
|
71
|
+
@valid_post_responses.should include(
|
72
|
+
@client.view.create(name, "myview").to_i
|
73
|
+
)
|
57
74
|
@client.view.list(name).include?(name).should be_true
|
58
|
-
@
|
75
|
+
@valid_post_responses.should include(
|
76
|
+
@client.view.delete(name).to_i
|
77
|
+
)
|
59
78
|
end
|
60
79
|
it "raises an error when unsupported view type is specified" do
|
61
80
|
expect(
|
62
81
|
lambda { @client.view.create(name, "awesomeview") }
|
63
82
|
).to raise_error
|
64
83
|
end
|
84
|
+
it "raises proper error if the view already exists" do
|
85
|
+
name = "duplicate_view"
|
86
|
+
@valid_post_responses.should include(
|
87
|
+
@client.view.create(name, "listview").to_i
|
88
|
+
)
|
89
|
+
@client.view.list(name).include?(name).should be_true
|
90
|
+
expect(
|
91
|
+
lambda { @client.view.create(name, "listview") }
|
92
|
+
).to raise_error(JenkinsApi::Exceptions::ViewAlreadyExists)
|
93
|
+
@valid_post_responses.should include(
|
94
|
+
@client.view.delete(name).to_i
|
95
|
+
)
|
96
|
+
end
|
65
97
|
end
|
66
98
|
|
67
99
|
describe "#create_list_view" do
|
68
100
|
|
69
101
|
def test_and_validate(params)
|
70
102
|
name = params[:name]
|
71
|
-
@
|
103
|
+
@valid_post_responses.should include(
|
104
|
+
@client.view.create_list_view(params).to_i
|
105
|
+
)
|
72
106
|
@client.view.list(name).include?(name).should be_true
|
73
|
-
@
|
107
|
+
@valid_post_responses.should include(
|
108
|
+
@client.view.delete(name).to_i
|
109
|
+
)
|
74
110
|
@client.view.list(name).include?(name).should be_false
|
75
111
|
end
|
76
112
|
|
@@ -112,16 +148,34 @@ describe JenkinsApi::Client::View do
|
|
112
148
|
}
|
113
149
|
test_and_validate(params)
|
114
150
|
end
|
151
|
+
it "raises an error when the input parameters is not a Hash" do
|
152
|
+
expect(
|
153
|
+
lambda {
|
154
|
+
@client.view.create_list_view("a_string")
|
155
|
+
}
|
156
|
+
).to raise_error(ArgumentError)
|
157
|
+
end
|
158
|
+
it "raises an error when the required name paremeter is missing" do
|
159
|
+
expect(
|
160
|
+
lambda {
|
161
|
+
@client.view.create_list_view(:description => "awesomeview")
|
162
|
+
}
|
163
|
+
).to raise_error(ArgumentError)
|
164
|
+
end
|
115
165
|
end
|
116
166
|
|
117
167
|
describe "#delete" do
|
118
168
|
name = "test_view_to_delete"
|
119
169
|
before(:all) do
|
120
|
-
@
|
170
|
+
@valid_post_responses.should include(
|
171
|
+
@client.view.create(name).to_i
|
172
|
+
)
|
121
173
|
end
|
122
174
|
it "accepts the name of the view and deletes from Jenkins" do
|
123
175
|
@client.view.list(name).include?(name).should be_true
|
124
|
-
@
|
176
|
+
@valid_post_responses.should include(
|
177
|
+
@client.view.delete(name).to_i
|
178
|
+
)
|
125
179
|
@client.view.list(name).include?(name).should be_false
|
126
180
|
end
|
127
181
|
end
|
@@ -140,15 +194,19 @@ describe JenkinsApi::Client::View do
|
|
140
194
|
|
141
195
|
describe "#add_job" do
|
142
196
|
before(:all) do
|
143
|
-
@
|
144
|
-
|
145
|
-
|
197
|
+
@valid_post_responses.should include(
|
198
|
+
@client.job.create_freestyle(
|
199
|
+
:name => "test_job_for_view"
|
200
|
+
).to_i
|
201
|
+
)
|
146
202
|
end
|
147
203
|
it "accepts the job and and adds it to the specified view" do
|
148
|
-
@
|
149
|
-
|
150
|
-
|
151
|
-
|
204
|
+
@valid_post_responses.should include(
|
205
|
+
@client.view.add_job(
|
206
|
+
"general_purpose_view",
|
207
|
+
"test_job_for_view"
|
208
|
+
).to_i
|
209
|
+
)
|
152
210
|
@client.view.list_jobs(
|
153
211
|
"general_purpose_view"
|
154
212
|
).include?("test_job_for_view").should be_true
|
@@ -158,23 +216,29 @@ describe JenkinsApi::Client::View do
|
|
158
216
|
describe "#remove_job" do
|
159
217
|
before(:all) do
|
160
218
|
unless @client.job.exists?("test_job_for_view")
|
161
|
-
@
|
162
|
-
|
163
|
-
|
219
|
+
@valid_post_responses.should include(
|
220
|
+
@client.job.create_freestyle(
|
221
|
+
:name => "test_job_for_view"
|
222
|
+
).to_i
|
223
|
+
)
|
164
224
|
end
|
165
225
|
unless @client.view.list_jobs(
|
166
226
|
"general_purpose_view").include?("test_job_for_view")
|
167
|
-
@
|
168
|
-
|
169
|
-
|
170
|
-
|
227
|
+
@valid_post_responses.should include(
|
228
|
+
@client.view.add_job(
|
229
|
+
"general_purpose_job",
|
230
|
+
"test_job_for_view"
|
231
|
+
).to_i
|
232
|
+
)
|
171
233
|
end
|
172
234
|
end
|
173
235
|
it "accepts the job name and removes it from the specified view" do
|
174
|
-
@
|
175
|
-
|
176
|
-
|
177
|
-
|
236
|
+
@valid_post_responses.should include(
|
237
|
+
@client.view.remove_job(
|
238
|
+
"general_purpose_view",
|
239
|
+
"test_job_for_view"
|
240
|
+
).to_i
|
241
|
+
)
|
178
242
|
end
|
179
243
|
end
|
180
244
|
|
@@ -199,11 +263,14 @@ describe JenkinsApi::Client::View do
|
|
199
263
|
end
|
200
264
|
|
201
265
|
after(:all) do
|
202
|
-
@
|
266
|
+
@valid_post_responses.should include(
|
267
|
+
@client.view.delete("general_purpose_view").to_i
|
268
|
+
)
|
203
269
|
if @client.job.exists?("test_job_for_view")
|
204
|
-
@
|
270
|
+
@valid_post_responses.should include(
|
271
|
+
@client.job.delete("test_job_for_view").to_i
|
272
|
+
)
|
205
273
|
end
|
206
274
|
end
|
207
|
-
|
208
275
|
end
|
209
276
|
end
|
@@ -4,6 +4,8 @@ describe JenkinsApi::Client::BuildQueue do
|
|
4
4
|
context "With properly initialized Client" do
|
5
5
|
before do
|
6
6
|
@client = mock
|
7
|
+
mock_logger = Logger.new "/dev/null"
|
8
|
+
@client.should_receive(:logger).and_return(mock_logger)
|
7
9
|
@queue = JenkinsApi::Client::BuildQueue.new(@client)
|
8
10
|
@sample_queue_json = {
|
9
11
|
"items" => [
|
@@ -38,6 +40,8 @@ describe JenkinsApi::Client::BuildQueue do
|
|
38
40
|
describe "InstanceMethods" do
|
39
41
|
describe "#initialize" do
|
40
42
|
it "initializes by receiving an instance of client object" do
|
43
|
+
mock_logger = Logger.new "/dev/null"
|
44
|
+
@client.should_receive(:logger).and_return(mock_logger)
|
41
45
|
expect(
|
42
46
|
lambda{ JenkinsApi::Client::BuildQueue.new(@client) }
|
43
47
|
).not_to raise_error
|
@@ -7,7 +7,8 @@ describe JenkinsApi::Client do
|
|
7
7
|
:server_ip => '127.0.0.1',
|
8
8
|
:server_port => 8080,
|
9
9
|
:username => 'username',
|
10
|
-
:password => 'password'
|
10
|
+
:password => 'password',
|
11
|
+
:log_location => '/dev/null'
|
11
12
|
)
|
12
13
|
end
|
13
14
|
|
@@ -141,41 +142,6 @@ describe JenkinsApi::Client do
|
|
141
142
|
end
|
142
143
|
|
143
144
|
describe "InstanceMethods" do
|
144
|
-
describe "#debug" do
|
145
|
-
it "The default for debug should be false" do
|
146
|
-
client = JenkinsApi::Client.new(
|
147
|
-
:server_ip => '127.0.0.1',
|
148
|
-
:server_port => 8080,
|
149
|
-
:username => 'username',
|
150
|
-
:password => 'password'
|
151
|
-
)
|
152
|
-
client.debug.should == false
|
153
|
-
end
|
154
|
-
|
155
|
-
it "Should be able to set the debug value" do
|
156
|
-
client = JenkinsApi::Client.new(
|
157
|
-
:server_ip => '127.0.0.1',
|
158
|
-
:server_port => 8080,
|
159
|
-
:username => 'username',
|
160
|
-
:password => 'password',
|
161
|
-
:debug => true
|
162
|
-
)
|
163
|
-
client.debug.should == true
|
164
|
-
end
|
165
|
-
|
166
|
-
it "Should be able to toggle the debug value" do
|
167
|
-
client = JenkinsApi::Client.new(
|
168
|
-
:server_ip => '127.0.0.1',
|
169
|
-
:server_port => 8080,
|
170
|
-
:username => 'username',
|
171
|
-
:password => 'password',
|
172
|
-
:debug => true
|
173
|
-
)
|
174
|
-
client.toggle_debug
|
175
|
-
client.debug.should == false
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
145
|
describe "#getroot" do
|
180
146
|
it "is defined with no parameters" do
|
181
147
|
expect(
|