improved_jenkins_client 1.6.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.
- 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
|