improved_jenkins_client 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/jenkinscli +5 -0
- data/improved_jenkins_client.gemspec +34 -0
- data/java_deps/jenkins-cli.jar +0 -0
- data/lib/improved_jenkins_client/build_queue.rb +262 -0
- data/lib/improved_jenkins_client/cli/base.rb +84 -0
- data/lib/improved_jenkins_client/cli/helper.rb +61 -0
- data/lib/improved_jenkins_client/cli/job.rb +133 -0
- data/lib/improved_jenkins_client/cli/node.rb +97 -0
- data/lib/improved_jenkins_client/cli/system.rb +65 -0
- data/lib/improved_jenkins_client/client.rb +855 -0
- data/lib/improved_jenkins_client/exceptions.rb +246 -0
- data/lib/improved_jenkins_client/job.rb +1966 -0
- data/lib/improved_jenkins_client/node.rb +353 -0
- data/lib/improved_jenkins_client/plugin_manager.rb +460 -0
- data/lib/improved_jenkins_client/plugin_settings/base.rb +11 -0
- data/lib/improved_jenkins_client/plugin_settings/collection.rb +39 -0
- data/lib/improved_jenkins_client/plugin_settings/hipchat.rb +53 -0
- data/lib/improved_jenkins_client/plugin_settings/workspace_cleanup.rb +35 -0
- data/lib/improved_jenkins_client/root.rb +67 -0
- data/lib/improved_jenkins_client/system.rb +134 -0
- data/lib/improved_jenkins_client/urihelper.rb +18 -0
- data/lib/improved_jenkins_client/user.rb +131 -0
- data/lib/improved_jenkins_client/version.rb +36 -0
- data/lib/improved_jenkins_client/view.rb +313 -0
- data/lib/improved_jenkins_client.rb +52 -0
- metadata +172 -0
@@ -0,0 +1,246 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012-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
|
+
require 'logger'
|
24
|
+
|
25
|
+
module JenkinsApi
|
26
|
+
# This module contains classes that define exceptions for various catories.
|
27
|
+
#
|
28
|
+
module Exceptions
|
29
|
+
# This is the base class for Exceptions that is inherited from
|
30
|
+
# RuntimeError.
|
31
|
+
#
|
32
|
+
class ApiException < RuntimeError
|
33
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
34
|
+
logger.add(log_level) { "#{self.class}: #{message}" }
|
35
|
+
super(message)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# This exception class handles cases where parameters are expected
|
40
|
+
# but not provided.
|
41
|
+
#
|
42
|
+
class NothingSubmitted < ApiException
|
43
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
44
|
+
message = "Nothing is submitted." if message.empty?
|
45
|
+
super(logger, message)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# This exception class handles cases where a job not able to be created
|
50
|
+
# because it already exists.
|
51
|
+
#
|
52
|
+
class JobAlreadyExists < ApiException
|
53
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
54
|
+
super(logger, message)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
# Support for backward compatibility
|
58
|
+
JobAlreadyExistsWithName = JobAlreadyExists
|
59
|
+
|
60
|
+
# This exception class handles cases where a view not able to be created
|
61
|
+
# because it already exists
|
62
|
+
#
|
63
|
+
class ViewAlreadyExists < ApiException
|
64
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
65
|
+
super(logger, message)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# This exception class handles cases where a node not able to be created
|
70
|
+
# because it already exists
|
71
|
+
#
|
72
|
+
class NodeAlreadyExists < ApiException
|
73
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
74
|
+
super(logger, message)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# This exception class handles cases where invalid credentials are provided
|
79
|
+
# to connect to the Jenkins.
|
80
|
+
#
|
81
|
+
class Unauthorized < ApiException
|
82
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
83
|
+
message = "Invalid credentials are provided." if message.empty?
|
84
|
+
super(logger, message, Logger::FATAL)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
# Support for backward compatibility
|
88
|
+
UnauthorizedException = Unauthorized
|
89
|
+
|
90
|
+
# This exception class handles cases where invalid credentials are provided
|
91
|
+
# to connect to the Jenkins.
|
92
|
+
# While it is apparently used to indicate expiry of a Crumb, this is not
|
93
|
+
# the only cause of a forbidden error... maybe the user just isn't allowed
|
94
|
+
# to access the given url. We should treat forbidden as a specific "you
|
95
|
+
# are not welcome here"
|
96
|
+
#
|
97
|
+
class Forbidden < ApiException
|
98
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
99
|
+
msg = "Access denied. Please ensure that Jenkins is set up to allow" +
|
100
|
+
" access to this operation. #{message}"
|
101
|
+
super(logger, msg)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
# Support for backward compatibility
|
105
|
+
ForbiddenException = Forbidden
|
106
|
+
|
107
|
+
# This exception should be thrown specifically when the caller has had
|
108
|
+
# a ForbiddenException and has been able to determine that a (valid)
|
109
|
+
# crumb was used, and the attempt still failed.
|
110
|
+
# This may require an interim attempt to re-acquire the crumb in order
|
111
|
+
# to confirm it has not expired.
|
112
|
+
#
|
113
|
+
# @example A condition where this exception would be raised
|
114
|
+
# def operation
|
115
|
+
# retried = false
|
116
|
+
# begin
|
117
|
+
# make_attempt
|
118
|
+
# rescue Forbidden => e
|
119
|
+
# refresh_crumbs(true)
|
120
|
+
# if @crumbs_enabled
|
121
|
+
# if !retried
|
122
|
+
# retried = true
|
123
|
+
# retry
|
124
|
+
# else
|
125
|
+
# raise ForbiddenWithCrumb.new(@logger, e.message)
|
126
|
+
# end
|
127
|
+
# else
|
128
|
+
# raise
|
129
|
+
# end
|
130
|
+
# end
|
131
|
+
# end
|
132
|
+
#
|
133
|
+
# @note the 'refresh_crumbs' method will update crumb enablement and the
|
134
|
+
# stored crumb if called with 'true'
|
135
|
+
#
|
136
|
+
class ForbiddenWithCrumb < Forbidden
|
137
|
+
def initialize(logger, message = '', log_level = Logger::ERROR)
|
138
|
+
msg = "A crumb was used in attempt to access operation. #{message}"
|
139
|
+
super(logger, msg)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
# This exception class handles cases where a requested page is not found on
|
144
|
+
# the Jenkins API.
|
145
|
+
#
|
146
|
+
class NotFound < ApiException
|
147
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
148
|
+
msg = message.empty? ? "Requested component is not found on the" +
|
149
|
+
" Jenkins CI server." : message
|
150
|
+
super(logger, msg)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
# Support for backward compatibility
|
154
|
+
NotFoundException = NotFound
|
155
|
+
|
156
|
+
# This exception class handles cases when Crumb Issues did not issue a
|
157
|
+
# crumb upon request.
|
158
|
+
#
|
159
|
+
class CrumbNotFound < NotFound
|
160
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
161
|
+
message = "No crumb available on the server." if message.empty?
|
162
|
+
super(logger, message)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
# Support for backward compatibility
|
166
|
+
CrumbNotFoundException = CrumbNotFound
|
167
|
+
|
168
|
+
# This exception class handles cases where the requested job does not exist
|
169
|
+
# in Jenkins.
|
170
|
+
#
|
171
|
+
class JobNotFound < NotFound
|
172
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
173
|
+
msg = message.empty? ? "The specified job is not found" : message
|
174
|
+
super(logger, msg)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
# This exception class handles cases where the requested view does not exist
|
179
|
+
# in Jenkins.
|
180
|
+
#
|
181
|
+
class ViewNotFound < NotFound
|
182
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
183
|
+
msg = message.empty? ? "The specified view is not found" : message
|
184
|
+
super(logger, msg)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
# This exception class handles cases where the requested node does not exist
|
189
|
+
# in Jenkins.
|
190
|
+
#
|
191
|
+
class NodeNotFound < NotFound
|
192
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
193
|
+
msg = msg.empty? ? "The specified node is not found" : message
|
194
|
+
super(logger, msg)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
# This exception class handles cases where the Jenkins API returns with a
|
199
|
+
# 500 Internal Server Error.
|
200
|
+
#
|
201
|
+
class InternalServerError < ApiException
|
202
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
203
|
+
message = "Internal Server Error. Perhaps the in-memory configuration" +
|
204
|
+
" Jenkins is different from the disk configuration. Please try to" +
|
205
|
+
" reload the configuration" if message.nil? || message.empty?
|
206
|
+
super(logger, message)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
# Support for backward compatibility
|
210
|
+
InternalServerErrorException = InternalServerError
|
211
|
+
|
212
|
+
# This exception class handles cases where the Jenkins is getting restarted
|
213
|
+
# or reloaded where the response code returned is 503
|
214
|
+
#
|
215
|
+
class ServiceUnavailable < ApiException
|
216
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
217
|
+
message = "Jenkins is being reloaded or restarted. Please wait till" +
|
218
|
+
" Jenkins is completely back online. This can be" +
|
219
|
+
" programatically achieved by System#wait_for_ready" if message.empty?
|
220
|
+
super(logger, message)
|
221
|
+
end
|
222
|
+
end
|
223
|
+
# Support for backward compatibility
|
224
|
+
ServiceUnavailableException = ServiceUnavailable
|
225
|
+
|
226
|
+
# Exception occurred while running java CLI commands
|
227
|
+
#
|
228
|
+
class CLIError < ApiException
|
229
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
230
|
+
message = "Unable to execute the command." if message.empty?
|
231
|
+
super(logger, message)
|
232
|
+
end
|
233
|
+
end
|
234
|
+
# Support for backward compatibility
|
235
|
+
CLIException = CLIError
|
236
|
+
|
237
|
+
# Exception when a particular plugin is not found
|
238
|
+
#
|
239
|
+
class PluginNotFound < NotFound
|
240
|
+
def initialize(logger, message = "", log_level = Logger::ERROR)
|
241
|
+
message = "The specified plugin is not found" if message.empty?
|
242
|
+
super(logger, message)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
end
|