jenkins2 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +43 -22
- data/README.md +140 -76
- data/bin/jenkins2 +8 -1
- data/lib/jenkins2.rb +10 -5
- data/lib/jenkins2/api.rb +33 -0
- data/lib/jenkins2/api/computer.rb +49 -0
- data/lib/jenkins2/api/credentials.rb +151 -0
- data/lib/jenkins2/api/job.rb +50 -0
- data/lib/jenkins2/api/plugins.rb +55 -0
- data/lib/jenkins2/api/root.rb +34 -0
- data/lib/jenkins2/api/rud.rb +21 -0
- data/lib/jenkins2/api/user.rb +35 -0
- data/lib/jenkins2/api/view.rb +40 -0
- data/lib/jenkins2/cli.rb +157 -0
- data/lib/jenkins2/cli/credentials.rb +232 -0
- data/lib/jenkins2/cli/job.rb +48 -0
- data/lib/jenkins2/cli/nodes.rb +233 -0
- data/lib/jenkins2/cli/plugins.rb +101 -0
- data/lib/jenkins2/cli/root.rb +65 -0
- data/lib/jenkins2/cli/user.rb +16 -0
- data/lib/jenkins2/cli/view.rb +155 -0
- data/lib/jenkins2/connection.rb +90 -0
- data/lib/jenkins2/errors.rb +37 -0
- data/lib/jenkins2/log.rb +8 -7
- data/lib/jenkins2/resource_proxy.rb +46 -0
- data/lib/jenkins2/util.rb +67 -0
- data/lib/jenkins2/version.rb +3 -1
- metadata +33 -49
- data/lib/jenkins2/client.rb +0 -127
- data/lib/jenkins2/client/credential_commands.rb +0 -134
- data/lib/jenkins2/client/node_commands.rb +0 -105
- data/lib/jenkins2/client/plugin_commands.rb +0 -53
- data/lib/jenkins2/cmdparse.rb +0 -51
- data/lib/jenkins2/command_line.rb +0 -221
- data/lib/jenkins2/try.rb +0 -36
- data/lib/jenkins2/uri.rb +0 -10
- data/lib/jenkins2/wait.rb +0 -29
@@ -0,0 +1,232 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jenkins2
|
4
|
+
class CLI
|
5
|
+
class CreateCredentialsByXml < CLI
|
6
|
+
def self.description
|
7
|
+
'Create credential by reading stdin as an XML configuration.'
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_options
|
11
|
+
parser.separator 'Mandatory arguments:'
|
12
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
13
|
+
options[:store] = s
|
14
|
+
end
|
15
|
+
parser.on '--domain DOMAIN', 'Domain id. (e.g. "_")' do |d|
|
16
|
+
options[:domain] = d
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def mandatory_arguments
|
21
|
+
super + %i[store domain]
|
22
|
+
end
|
23
|
+
|
24
|
+
def run
|
25
|
+
jc.credentials.store(options[:store]).domain(options[:domain]).create($stdin.read)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class CreateCredentialsDomainByXml < CLI
|
30
|
+
def self.description
|
31
|
+
'Create credential domain by reading stdin as an XML configuration.'
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_options
|
35
|
+
parser.separator 'Mandatory arguments:'
|
36
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
37
|
+
options[:store] = s
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def mandatory_arguments
|
42
|
+
super + %i[store]
|
43
|
+
end
|
44
|
+
|
45
|
+
def run
|
46
|
+
jc.credentials.store(options[:store]).create_domain($stdin.read)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
class DeleteCredentials < CLI
|
51
|
+
def self.description
|
52
|
+
'Delete credentials.'
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_options
|
56
|
+
parser.separator 'Mandatory arguments:'
|
57
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
58
|
+
options[:store] = s
|
59
|
+
end
|
60
|
+
parser.on '--domain DOMAIN', 'Domain id. (e.g. "_")' do |d|
|
61
|
+
options[:domain] = d
|
62
|
+
end
|
63
|
+
parser.on '--credential ID', 'Credential id.' do |c|
|
64
|
+
options[:credential] = c
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def mandatory_arguments
|
69
|
+
super + %i[store domain credential]
|
70
|
+
end
|
71
|
+
|
72
|
+
def run
|
73
|
+
jc.credentials.store(options[:store]).domain(options[:domain]).
|
74
|
+
credential(options[:credential]).delete
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class DeleteCredentialsDomain < CLI
|
79
|
+
def self.description
|
80
|
+
'Delete credentials domain.'
|
81
|
+
end
|
82
|
+
|
83
|
+
def add_options
|
84
|
+
parser.separator 'Mandatory arguments:'
|
85
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
86
|
+
options[:store] = s
|
87
|
+
end
|
88
|
+
parser.on '--domain DOMAIN', 'Domain id. (e.g. "_")' do |d|
|
89
|
+
options[:domain] = d
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def mandatory_arguments
|
94
|
+
super + %i[store domain]
|
95
|
+
end
|
96
|
+
|
97
|
+
def run
|
98
|
+
jc.credentials.store(options[:store]).domain(options[:domain]).delete
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class GetCredentialsAsXml < CLI
|
103
|
+
def self.description
|
104
|
+
'Get a credential as XML (secrets redacted).'
|
105
|
+
end
|
106
|
+
|
107
|
+
def add_options
|
108
|
+
parser.separator 'Mandatory arguments:'
|
109
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
110
|
+
options[:store] = s
|
111
|
+
end
|
112
|
+
parser.on '--domain DOMAIN', 'Domain id. (e.g. "_")' do |d|
|
113
|
+
options[:domain] = d
|
114
|
+
end
|
115
|
+
parser.on '--credential ID', 'Credential id.' do |c|
|
116
|
+
options[:credential] = c
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def mandatory_arguments
|
121
|
+
super + %i[store domain credential]
|
122
|
+
end
|
123
|
+
|
124
|
+
def run
|
125
|
+
jc.credentials.store(options[:store]).domain(options[:domain]).
|
126
|
+
credential(options[:credential]).config_xml
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
class GetCredentialsDomainAsXml < CLI
|
131
|
+
def self.description
|
132
|
+
'Get credentials domain as XML.'
|
133
|
+
end
|
134
|
+
|
135
|
+
def add_options
|
136
|
+
parser.separator 'Mandatory arguments:'
|
137
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
138
|
+
options[:store] = s
|
139
|
+
end
|
140
|
+
parser.on '--domain DOMAIN', 'Domain id. (e.g. "_")' do |d|
|
141
|
+
options[:domain] = d
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def mandatory_arguments
|
146
|
+
super + %i[store domain]
|
147
|
+
end
|
148
|
+
|
149
|
+
def run
|
150
|
+
jc.credentials.store(options[:store]).domain(options[:domain]).config_xml
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
class ListCredentials < CLI
|
155
|
+
def self.description
|
156
|
+
'Lists credentials in a specific store.'
|
157
|
+
end
|
158
|
+
|
159
|
+
def add_options
|
160
|
+
parser.separator 'Mandatory arguments:'
|
161
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
162
|
+
options[:store] = s
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def mandatory_arguments
|
167
|
+
super + [:store]
|
168
|
+
end
|
169
|
+
|
170
|
+
def run
|
171
|
+
jc.credentials.store(options[:store], depth: 2).domains.to_h.collect do |_, v|
|
172
|
+
"Domain: #{v.displayName}\n" +
|
173
|
+
v.credentials.collect do |crd|
|
174
|
+
"#{crd.id} - #{crd.displayName}"
|
175
|
+
end.join("\n")
|
176
|
+
end.join("\n")
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
class UpdateCredentialsByXml < CLI
|
181
|
+
def self.description
|
182
|
+
'Update credentials by XML.'
|
183
|
+
end
|
184
|
+
|
185
|
+
def add_options
|
186
|
+
parser.separator 'Mandatory arguments:'
|
187
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
188
|
+
options[:store] = s
|
189
|
+
end
|
190
|
+
parser.on '--domain DOMAIN', 'Domain id. (e.g. "_")' do |d|
|
191
|
+
options[:domain] = d
|
192
|
+
end
|
193
|
+
parser.on '--credential ID', 'Credential id.' do |c|
|
194
|
+
options[:credential] = c
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def mandatory_arguments
|
199
|
+
super + %i[store domain credential]
|
200
|
+
end
|
201
|
+
|
202
|
+
def run
|
203
|
+
jc.credentials.store(options[:store]).domain(options[:domain]).
|
204
|
+
credential(options[:credential]).update($stdin.read)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
class UpdateCredentialsDomainByXml < CLI
|
209
|
+
def self.description
|
210
|
+
'Update credentials domain by XML.'
|
211
|
+
end
|
212
|
+
|
213
|
+
def add_options
|
214
|
+
parser.separator 'Mandatory arguments:'
|
215
|
+
parser.on '--store STORE', 'Store id. (e.g. "system")' do |s|
|
216
|
+
options[:store] = s
|
217
|
+
end
|
218
|
+
parser.on '--domain DOMAIN', 'Domain id. (e.g. "_")' do |d|
|
219
|
+
options[:domain] = d
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def mandatory_arguments
|
224
|
+
super + %i[store domain]
|
225
|
+
end
|
226
|
+
|
227
|
+
def run
|
228
|
+
jc.credentials.store(options[:store]).domain(options[:domain]).update($stdin.read)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jenkins2
|
4
|
+
class CLI
|
5
|
+
class ListJobs < CLI
|
6
|
+
def self.description
|
7
|
+
'Lists all jobs in a specific view or item group.'
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def add_options
|
13
|
+
parser.separator 'Optional arguments:'
|
14
|
+
parser.on '-n', '--name NAME', 'Name of the view. Default - all' do |n|
|
15
|
+
options[:name] = n
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def run; end
|
20
|
+
end
|
21
|
+
|
22
|
+
class CopyJob < CLI
|
23
|
+
def self.description
|
24
|
+
'Copies a job.'
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def add_options
|
30
|
+
parser.separator 'Mandatory arguments:'
|
31
|
+
parser.on '-f', '--from NAME', 'Name of the job to copy.' do |f|
|
32
|
+
options[:from] = f
|
33
|
+
end
|
34
|
+
parser.on '-n', '--name NAME', 'Name of the new job, to be created.' do |n|
|
35
|
+
options[:name] = n
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def mandatory_arguments
|
40
|
+
super + %i[name from]
|
41
|
+
end
|
42
|
+
|
43
|
+
def run
|
44
|
+
jc.job(options[:name]).copy(options[:from])
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,233 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jenkins2
|
4
|
+
class CLI
|
5
|
+
class ConnectNode < CLI
|
6
|
+
def self.description
|
7
|
+
'Reconnect node(s).'
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_options
|
11
|
+
parser.separator 'Mandatory arguments:'
|
12
|
+
parser.on '-n', '--name X,Y,..', Array, 'Slave name, or "(master)" for master, '\
|
13
|
+
'comma-separated list is supported.' do |n|
|
14
|
+
options[:name] = n
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
options[:name].all? do |name|
|
20
|
+
jc.computer(name).launch_agent
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class CreateNode < CLI
|
26
|
+
def self.description
|
27
|
+
'Creates a new node by reading stdin for an XML configuration.'
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_options
|
31
|
+
parser.separator 'Mandatory arguments:'
|
32
|
+
parser.on '-n', '--name NAME', 'Name of the node.' do |n|
|
33
|
+
options[:name] = n
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def run
|
38
|
+
jc.computer(options[:name]).create and
|
39
|
+
jc.computer(options[:name]).update($stdin.read)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class DeleteNode < CLI
|
44
|
+
def self.description
|
45
|
+
'Deletes node(s).'
|
46
|
+
end
|
47
|
+
|
48
|
+
def add_options
|
49
|
+
parser.separator 'Mandatory arguments:'
|
50
|
+
parser.on '-n', '--name X,Y,..', Array, 'Names of nodes to delete.' do |n|
|
51
|
+
options[:name] = n
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def run
|
56
|
+
options[:name].all? do |name|
|
57
|
+
jc.computer(name).delete
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
class DisconnectNode < CLI
|
63
|
+
def self.description
|
64
|
+
'Disconnects node(s).'
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_options
|
68
|
+
parser.separator 'Mandatory arguments:'
|
69
|
+
parser.on '-n', '--name X,Y,..', Array, 'Slave name, or "(master)" for master, '\
|
70
|
+
'comma-separated list is supported.' do |n|
|
71
|
+
options[:name] = n
|
72
|
+
end
|
73
|
+
parser.separator 'Optional arguments:'
|
74
|
+
parser.on '-m', '--message TEXT', 'Record the reason about why you are disconnecting the'\
|
75
|
+
' node(s).' do |m|
|
76
|
+
options[:message] = m
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def run
|
81
|
+
options[:name].all? do |name|
|
82
|
+
jc.computer(name).disconnect(options[:message])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class GetNode < CLI
|
88
|
+
def self.description
|
89
|
+
'Dumps the node definition XML to stdout.'
|
90
|
+
end
|
91
|
+
|
92
|
+
def add_options
|
93
|
+
parser.separator 'Mandatory arguments:'
|
94
|
+
parser.on '-n', '--name NAME', 'Name of the node.' do |n|
|
95
|
+
options[:name] = n
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def run
|
100
|
+
jc.computer(options[:name]).config_xml
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class ListNode < CLI
|
105
|
+
def self.description
|
106
|
+
'Outputs the node list.'
|
107
|
+
end
|
108
|
+
|
109
|
+
def run
|
110
|
+
jc.computer.computer.collect(&:displayName).join("\n")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
class ListOnlineNode < CLI
|
115
|
+
def self.description
|
116
|
+
'Outputs the online node list.'
|
117
|
+
end
|
118
|
+
|
119
|
+
def run
|
120
|
+
jc.computer.computer.delete_if{|i| i.offline or i.temporarilyOffline }.
|
121
|
+
collect(&:displayName).join("\n")
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class OfflineNode < CLI
|
126
|
+
def self.description
|
127
|
+
'Stop using a node for performing builds temporarily, until the next "online-node" '\
|
128
|
+
'command.'
|
129
|
+
end
|
130
|
+
|
131
|
+
def add_options
|
132
|
+
parser.separator 'Mandatory arguments:'
|
133
|
+
parser.on '-n', '--name NAME', 'Name of the node or "(master)" for master.' do |n|
|
134
|
+
options[:name] = n
|
135
|
+
end
|
136
|
+
parser.separator 'Optional arguments:'
|
137
|
+
parser.on '-m', '--message TEXT', 'Record the reason about why you are disconnecting the'\
|
138
|
+
' node.' do |m|
|
139
|
+
options[:message] = m
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def run
|
144
|
+
return if jc.computer(options[:name]).temporarilyOffline
|
145
|
+
jc.computer(options[:name]).toggle_offline(options[:message])
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
class OnlineNode < CLI
|
150
|
+
def self.description
|
151
|
+
'Resume using a node for performing builds, to cancel out the earlier "offline-node" '\
|
152
|
+
'command.'
|
153
|
+
end
|
154
|
+
|
155
|
+
def add_options
|
156
|
+
parser.separator 'Mandatory arguments:'
|
157
|
+
parser.on '-n', '--name NAME', 'Name of the node or "(master)" for master.' do |n|
|
158
|
+
options[:name] = n
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def run
|
163
|
+
return unless jc.computer(options[:name]).temporarilyOffline
|
164
|
+
jc.computer(options[:name]).toggle_offline
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
class UpdateNode < CLI
|
169
|
+
def self.description
|
170
|
+
'Updates the node definition XML from stdin. The opposite of the get-node command.'
|
171
|
+
end
|
172
|
+
|
173
|
+
def add_options
|
174
|
+
parser.separator 'Mandatory arguments:'
|
175
|
+
parser.on '-n', '--name NAME', 'Name of the node.' do |n|
|
176
|
+
options[:name] = n
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
def run
|
181
|
+
jc.computer(options[:name]).update($stdin.read)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
class WaitNodeOffline < CLI
|
186
|
+
def self.description
|
187
|
+
'Wait for a node to become offline.'
|
188
|
+
end
|
189
|
+
|
190
|
+
def add_options
|
191
|
+
parser.separator 'Mandatory arguments:'
|
192
|
+
parser.on '-n', '--name NAME', 'Name of the node.' do |n|
|
193
|
+
options[:name] = n
|
194
|
+
end
|
195
|
+
parser.separator 'Optional arguments:'
|
196
|
+
parser.on '-w', '--wait MINUTES', Integer, 'Maximum number of minutes to wait. Default is '\
|
197
|
+
'60.' do |w|
|
198
|
+
options[:wait] = w
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def run
|
203
|
+
Jenkins2::Util.wait(max_wait_minutes: options[:wait]) do
|
204
|
+
!jc.computer(options[:name]).online?
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
class WaitNodeOnline < CLI
|
210
|
+
def self.description
|
211
|
+
'Wait for a node to become online.'
|
212
|
+
end
|
213
|
+
|
214
|
+
def add_options
|
215
|
+
parser.separator 'Mandatory arguments:'
|
216
|
+
parser.on '-n', '--name NAME', 'Name of the node.' do |n|
|
217
|
+
options[:name] = n
|
218
|
+
end
|
219
|
+
parser.separator 'Optional arguments:'
|
220
|
+
parser.on '-w', '--wait MINUTES', Integer, 'Maximum number of minutes to wait. Default is '\
|
221
|
+
'60.' do |w|
|
222
|
+
options[:wait] = w
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
def run
|
227
|
+
Jenkins2::Util.wait(max_wait_minutes: options[:wait]) do
|
228
|
+
jc.computer(options[:name]).online?
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|