jenkins_pipeline_builder 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -11
  3. data/README.md +19 -29
  4. data/commit_build.sh +1 -4
  5. data/lib/jenkins_pipeline_builder.rb +9 -13
  6. data/lib/jenkins_pipeline_builder/cli/describe.rb +14 -5
  7. data/lib/jenkins_pipeline_builder/cli/helper.rb +2 -0
  8. data/lib/jenkins_pipeline_builder/cli/list.rb +11 -4
  9. data/lib/jenkins_pipeline_builder/extensions.rb +151 -40
  10. data/lib/jenkins_pipeline_builder/{builders.rb → extensions/builders.rb} +22 -15
  11. data/lib/jenkins_pipeline_builder/{job_builder.rb → extensions/job_attributes.rb} +37 -27
  12. data/lib/jenkins_pipeline_builder/{publishers.rb → extensions/publishers.rb} +55 -20
  13. data/lib/jenkins_pipeline_builder/{triggers.rb → extensions/triggers.rb} +18 -8
  14. data/lib/jenkins_pipeline_builder/{wrappers.rb → extensions/wrappers.rb} +23 -36
  15. data/lib/jenkins_pipeline_builder/generator.rb +29 -62
  16. data/lib/jenkins_pipeline_builder/module_registry.rb +21 -9
  17. data/lib/jenkins_pipeline_builder/pull_request.rb +1 -1
  18. data/lib/jenkins_pipeline_builder/version.rb +1 -1
  19. data/pipeline/Jenkins-Pipeline-Builder.yaml +3 -7
  20. data/pipeline/project.yaml +10 -0
  21. data/spec/lib/jenkins_pipeline_builder/compiler_spec.rb +9 -1
  22. data/spec/lib/jenkins_pipeline_builder/extensions/builders_spec.rb +53 -0
  23. data/spec/lib/jenkins_pipeline_builder/extensions/publishers_spec.rb +140 -0
  24. data/spec/lib/jenkins_pipeline_builder/extensions_spec.rb +113 -31
  25. data/spec/lib/jenkins_pipeline_builder/generator_spec.rb +12 -4
  26. data/spec/lib/jenkins_pipeline_builder/module_registry_spec.rb +202 -44
  27. data/spec/lib/jenkins_pipeline_builder/spec_helper.rb +5 -5
  28. data/spec/requests/pipeline_spec.rb +20 -0
  29. metadata +16 -7
@@ -42,12 +42,6 @@ describe JenkinsPipelineBuilder::Extension do
42
42
  expect(extension.plugin_id).to eq 'foo'
43
43
  end
44
44
  end
45
- context 'min_version' do
46
- it 'sets the min_version if a parameter is provided' do
47
- extension.min_version('foo')
48
- expect(extension.min_version).to eq 'foo'
49
- end
50
- end
51
45
  context 'jenkins_name' do
52
46
  it 'sets the jenkins_name if a parameter is provided' do
53
47
  extension.jenkins_name('foo')
@@ -78,51 +72,39 @@ describe JenkinsPipelineBuilder::Extension do
78
72
  expect(extension.type).to eq 'foo'
79
73
  end
80
74
  end
75
+ context 'min_version' do
76
+ it 'sets the min_version if a parameter is provided' do
77
+ extension.min_version('foo')
78
+ expect(extension.min_version).to eq 'foo'
79
+ end
80
+ end
81
81
  context 'xml' do
82
82
  it 'saves the block' do
83
- extension.xml do
84
- true
85
- end
83
+ extension.xml -> { true }
86
84
  expect(extension.xml.call).to be true
87
85
  end
88
- it 'uses the path if provided' do
89
- extension.xml('foo') do
90
- true
91
- end
92
- expect(extension.path).to eq 'foo'
93
- end
94
86
  it 'returns the saved block if there none is provided' do
95
- extension.xml do
96
- true
97
- end
87
+ extension.xml -> { true }
98
88
  expect(extension.xml).to be_kind_of Proc
99
89
  end
100
90
  end
101
91
  context 'after' do
102
92
  it 'saves the block' do
103
- extension.after do
104
- true
105
- end
93
+ extension.after -> { true }
106
94
  expect(extension.after.call).to be true
107
95
  end
108
96
  it 'returns the saved block if there none is provided' do
109
- extension.after do
110
- true
111
- end
97
+ extension.after -> { true }
112
98
  expect(extension.after).to be_kind_of Proc
113
99
  end
114
100
  end
115
101
  context 'before' do
116
102
  it 'saves the block' do
117
- extension.before do
118
- true
119
- end
103
+ extension.before -> { true }
120
104
  expect(extension.before.call).to be true
121
105
  end
122
106
  it 'returns the saved block if there none is provided' do
123
- extension.before do
124
- true
125
- end
107
+ extension.before -> { true }
126
108
  expect(extension.before).to be_kind_of Proc
127
109
  end
128
110
  end
@@ -130,7 +112,8 @@ describe JenkinsPipelineBuilder::Extension do
130
112
  it 'returns true if errors is empty' do
131
113
  extension.name 'foo'
132
114
  extension.plugin_id 'foo'
133
- extension.min_version 'foo'
115
+ extension.min_version '0.2'
116
+ extension.xml -> { true }
134
117
  extension.type 'foo'
135
118
  extension.path 'foo'
136
119
  expect(extension.errors).to be_empty
@@ -143,3 +126,102 @@ describe JenkinsPipelineBuilder::Extension do
143
126
  end
144
127
  end
145
128
  end
129
+
130
+ describe JenkinsPipelineBuilder::ExtensionSet do
131
+ subject(:set) { JenkinsPipelineBuilder::ExtensionSet.new }
132
+
133
+ before :each do
134
+ set.name 'example'
135
+ end
136
+
137
+ context 'xml' do
138
+ it 'returns the block for the correct version'
139
+ it 'sets the min_version if a parameter is provided' do
140
+ set.xml version: '0.2' do
141
+ true
142
+ end
143
+ expect(set.blocks).to have_key '0.2'
144
+ end
145
+ it 'uses the path if provided' do
146
+ set.xml path: 'foo' do
147
+ true
148
+ end
149
+ expect(set.blocks['0'][:path]).to eq 'foo'
150
+ end
151
+ end
152
+
153
+ context '#extension' do
154
+ def new_ext(version = '0.0')
155
+ ext = JenkinsPipelineBuilder::Extension.new
156
+ ext.name 'foo'
157
+ ext.plugin_id 'foo'
158
+ ext.min_version version
159
+ ext.xml -> { true }
160
+ ext.type 'foo'
161
+ ext.path 'foo'
162
+ ext
163
+ end
164
+
165
+ def ext_versions(versions)
166
+ versions.each do |v|
167
+ ext = new_ext(v)
168
+ expect(ext).to be_valid
169
+ set.extensions << ext
170
+ end
171
+
172
+ expect(set).to be_valid
173
+ expect(set.extensions.size).to eq versions.size
174
+ end
175
+
176
+ it 'returns an extension' do
177
+ ext_versions ['0.0']
178
+ set.installed_version = '0.1'
179
+ expect(set.extension).to be_kind_of JenkinsPipelineBuilder::Extension
180
+ end
181
+
182
+ it 'returns the highest that is lower than the installed version' do
183
+ ext_versions ['0.0', '0.2']
184
+
185
+ set.installed_version = '0.1'
186
+
187
+ expect(set.extension.min_version).to eq '0.0'
188
+ end
189
+
190
+ it 'returns highest available if the installed version is higher' do
191
+ ext_versions ['0.0', '0.2']
192
+
193
+ set.installed_version = '0.3'
194
+
195
+ expect(set.extension.min_version).to eq '0.2'
196
+ end
197
+
198
+ it 'works for complicated version comparions' do
199
+ ext_versions ['10.5', '9.2', '100.4']
200
+
201
+ set.installed_version = '11.3'
202
+
203
+ expect(set.extension.min_version).to eq '10.5'
204
+ end
205
+
206
+ it 'raises an error if the registered versions are too high' do
207
+ ext_versions ['10.5', '9.2']
208
+
209
+ set.installed_version = '1.3'
210
+
211
+ expect { set.extension.min_version }.to raise_error
212
+ end
213
+
214
+ it 'works for snapshot/beta stuff' do
215
+ ext_versions ['1.9', '2.3']
216
+
217
+ set.installed_version = '2.0-SNAPSHOT (private-06/06/2014 09:51-bgaulin)'
218
+ # Other examples
219
+ # set.installed_version = '2.0-beta-1'
220
+ # set.installed_version = '2.0+build.93'
221
+ # set.installed_version = '2.0.8'
222
+
223
+ expect(set.extension.min_version).to eq '1.9'
224
+
225
+ end
226
+ end
227
+ end
@@ -1,6 +1,9 @@
1
1
  require File.expand_path('../spec_helper', __FILE__)
2
2
 
3
3
  describe JenkinsPipelineBuilder::Generator do
4
+ after :each do
5
+ JenkinsPipelineBuilder.registry.clear_versions
6
+ end
4
7
 
5
8
  before(:all) do
6
9
  JenkinsPipelineBuilder.credentials = {
@@ -10,7 +13,6 @@ describe JenkinsPipelineBuilder::Generator do
10
13
  password: 'password',
11
14
  log_location: '/dev/null'
12
15
  }
13
- JenkinsPipelineBuilder.client
14
16
  @generator = JenkinsPipelineBuilder.generator
15
17
  end
16
18
 
@@ -18,8 +20,6 @@ describe JenkinsPipelineBuilder::Generator do
18
20
  @generator.debug = false
19
21
  @generator.job_collection = {}
20
22
  @generator.remote_depends = {}
21
- @generator.module_registry = JenkinsPipelineBuilder::ModuleRegistry.new
22
- JenkinsPipelineBuilder.load_registry
23
23
  end
24
24
 
25
25
  describe 'initialized in before(:example)' do
@@ -67,6 +67,10 @@ describe JenkinsPipelineBuilder::Generator do
67
67
  end
68
68
 
69
69
  describe '#bootstrap' do
70
+ before :each do
71
+ allow(JenkinsPipelineBuilder.client).to receive(:plugin).and_return double(
72
+ list_installed: { 'description' => '20.0', 'git' => '20.0' })
73
+ end
70
74
  it 'produces no errors while creating pipeline SamplePipeline with view' do
71
75
  @generator.debug = true
72
76
  job_name = 'SamplePipeline'
@@ -97,6 +101,10 @@ describe JenkinsPipelineBuilder::Generator do
97
101
  end
98
102
 
99
103
  describe '#pull_request' do
104
+ before :each do
105
+ allow(JenkinsPipelineBuilder.client).to receive(:plugin).and_return double(
106
+ list_installed: { 'description' => '20.0', 'git' => '20.0' })
107
+ end
100
108
  it 'produces no errors while creating pipeline PullRequest' do
101
109
  # Dummy data
102
110
  purge = []
@@ -129,7 +137,7 @@ describe JenkinsPipelineBuilder::Generator do
129
137
  @generator.debug = true
130
138
  job_name = 'PullRequest'
131
139
  path = File.expand_path('../fixtures/generator_tests/pullrequest_pipeline', __FILE__)
132
- JenkinsPipelineBuilder::PullRequestGenerator.should_receive(:new).once.and_return(
140
+ expect(JenkinsPipelineBuilder::PullRequestGenerator).to receive(:new).once.and_return(
133
141
  double(purge: purge, create: create, jobs: jobs)
134
142
  )
135
143
  success = @generator.pull_request(path, job_name)
@@ -1,26 +1,29 @@
1
1
  require File.expand_path('../spec_helper', __FILE__)
2
2
 
3
3
  describe JenkinsPipelineBuilder::ModuleRegistry do
4
+ after :each do
5
+ JenkinsPipelineBuilder.registry.clear_versions
6
+ end
4
7
  describe '#register' do
5
8
  it 'should return item by a specified path' do
6
9
 
7
10
  registry = JenkinsPipelineBuilder::ModuleRegistry.new
8
- ext = double
9
- allow(ext).to receive(:name).and_return :foo
10
- registry.register [:job], ext
11
+ set = double
12
+ allow(set).to receive(:name).and_return :foo
13
+ registry.register [:job], set
11
14
 
12
- expect(registry.get('job/foo').first.name).to eq :foo
15
+ expect(registry.get('job/foo').name).to eq :foo
13
16
  end
14
17
 
15
18
  it 'registered the builders correctly' do
16
19
  builders = {
17
- multi_job: [0],
18
- maven3: [0],
19
- shell_command: [0],
20
- inject_vars_file: [0],
21
- blocking_downstream: [0],
22
- remote_job: [0],
23
- copy_artifact: [0]
20
+ multi_job: ['0'],
21
+ maven3: ['0'],
22
+ shell_command: ['0'],
23
+ inject_vars_file: ['0'],
24
+ blocking_downstream: ['0'],
25
+ remote_job: ['0'],
26
+ copy_artifact: ['0']
24
27
  }
25
28
  registry = JenkinsPipelineBuilder.registry.registry
26
29
  expect(registry[:job][:builders].size).to eq builders.size
@@ -32,12 +35,13 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
32
35
  end
33
36
  end
34
37
  end
38
+
35
39
  it 'registered the triggers correctly' do
36
40
  triggers = {
37
- git_push: [0],
38
- scm_polling: [0],
39
- periodic_build: [0],
40
- upstream: [0]
41
+ git_push: ['0'],
42
+ scm_polling: ['0'],
43
+ periodic_build: ['0'],
44
+ upstream: ['0']
41
45
  }
42
46
  registry = JenkinsPipelineBuilder.registry.registry
43
47
  expect(registry[:job][:triggers].size).to eq triggers.size
@@ -51,15 +55,15 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
51
55
  end
52
56
  it 'registered the job_attributes correctly' do
53
57
  job_attributes = {
54
- description: [0],
55
- scm_params: [0],
56
- hipchat: [0],
57
- priority: [0],
58
- parameters: [0],
59
- discard_old: [0],
60
- throttle: [0],
61
- prepare_environment: [0],
62
- concurrent_build: [0]
58
+ description: ['0'],
59
+ scm_params: ['0'],
60
+ hipchat: ['0'],
61
+ priority: ['0'],
62
+ parameters: ['0'],
63
+ discard_old: ['0'],
64
+ throttle: ['0'],
65
+ prepare_environment: ['0'],
66
+ concurrent_build: ['0']
63
67
  }
64
68
  registry = JenkinsPipelineBuilder.registry.registry
65
69
  # There are 4 sub types so, we don't count those
@@ -74,22 +78,21 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
74
78
  end
75
79
  it 'registered the publishers correctly' do
76
80
  publishers = {
77
- description_setter: [0],
78
- downstream: [0],
79
- hipchat: [0],
80
- git: [0],
81
- junit_result: [0],
82
- coverage_result: [0],
83
- post_build_script: [0],
84
- groovy_postbuild: [0],
85
- archive_artifact: [0],
86
- email_notifications: [0]
81
+ description_setter: ['0'],
82
+ downstream: ['0'],
83
+ hipchat: ['0'],
84
+ git: ['0'],
85
+ junit_result: ['0'],
86
+ coverage_result: ['0'],
87
+ post_build_script: ['0'],
88
+ groovy_postbuild: ['0'],
89
+ archive_artifact: ['0'],
90
+ email_notifications: ['0'],
91
+ sonar_result: ['0']
87
92
  }
88
93
  registry = JenkinsPipelineBuilder.registry.registry
89
- expect(registry[:job][:publishers].size).to eq publishers.size
94
+ expect(registry[:job][:publishers].keys).to match_array publishers.keys
90
95
  publishers.each do |publisher, versions|
91
- expect(registry[:job][:publishers]).to have_key publisher
92
-
93
96
  versions.each do |version|
94
97
  expect(registry[:job][:publishers][publisher]).to have_min_version version
95
98
  end
@@ -97,14 +100,13 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
97
100
  end
98
101
  it 'registered the wrappers correctly' do
99
102
  wrappers = {
100
- ansicolor: [0],
101
- timestamp: [0],
102
- name: [0],
103
+ ansicolor: ['0'],
104
+ timestamp: ['0'],
103
105
  rvm: ['0', '0.5'],
104
- inject_passwords: [0],
105
- inject_env_var: [0],
106
- artifactory: [0],
107
- maven3artifactory: [0]
106
+ inject_passwords: ['0'],
107
+ inject_env_var: ['0'],
108
+ artifactory: ['0'],
109
+ maven3artifactory: ['0']
108
110
  }
109
111
  registry = JenkinsPipelineBuilder.registry.registry
110
112
  expect(registry[:job][:wrappers].size).to eq wrappers.size
@@ -121,6 +123,23 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
121
123
 
122
124
  end
123
125
 
126
+ describe '#version' do
127
+ before :all do
128
+ JenkinsPipelineBuilder.credentials = {
129
+ server_ip: '127.0.0.1',
130
+ server_port: 8080,
131
+ username: 'username',
132
+ password: 'password',
133
+ log_location: '/dev/null'
134
+ }
135
+ end
136
+
137
+ it 'pulls the version from the registry if it is not memoized' do
138
+ expect(JenkinsPipelineBuilder.client).to receive(:plugin).and_return double(list_installed: { 'one' => '0.1' })
139
+ subject.versions
140
+ end
141
+ end
142
+
124
143
  describe '#entries' do
125
144
 
126
145
  end
@@ -144,4 +163,143 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
144
163
  describe '#execute_extension' do
145
164
  end
146
165
 
166
+ describe 'executing a registry item' do
167
+ before :all do
168
+ class XmlException < StandardError
169
+ end
170
+ class BeforeException < StandardError
171
+ end
172
+ class AfterException < StandardError
173
+ end
174
+ JenkinsPipelineBuilder.credentials = {
175
+ server_ip: '127.0.0.1',
176
+ server_port: 8080,
177
+ username: 'username',
178
+ password: 'password',
179
+ log_location: '/dev/null'
180
+ }
181
+ end
182
+
183
+ let(:params) { { wrappers: { test_name: :foo } } }
184
+
185
+ before :each do
186
+ allow(JenkinsPipelineBuilder.client).to receive(:plugin).and_return double(
187
+ list_installed: { 'test_name' => '20.0', 'unorderedTest' => '20.0' })
188
+ @n_xml = Nokogiri::XML::Document.new
189
+
190
+ wrapper do
191
+ name :test_name
192
+ plugin_id 'test_name'
193
+
194
+ xml do
195
+ true
196
+ end
197
+ end
198
+ expect(JenkinsPipelineBuilder.registry.registry[:job][:wrappers]).to have_key :test_name
199
+ @ext = JenkinsPipelineBuilder.registry.registry[:job][:wrappers][:test_name].extension
200
+
201
+ end
202
+
203
+ after :each do
204
+ JenkinsPipelineBuilder.registry.registry[:job][:wrappers].delete :test_name
205
+ end
206
+
207
+ it 'calls the xml block when executing the item' do
208
+ @ext.xml -> (_) { fail XmlException, 'foo' }
209
+
210
+ expect do
211
+ JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
212
+ end.to raise_error XmlException
213
+ end
214
+
215
+ it 'calls the before block' do
216
+ @ext.before -> (_) { fail BeforeException, 'foo' }
217
+
218
+ expect do
219
+ JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
220
+ end.to raise_error BeforeException
221
+ end
222
+
223
+ it 'calls the after block' do
224
+ @ext.after -> (_) { fail AfterException, 'foo' }
225
+
226
+ expect do
227
+ JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
228
+ end.to raise_error AfterException
229
+ end
230
+
231
+ context 'unordered dsl' do
232
+ let(:params) { { wrappers: { unordered_test: :foo } } }
233
+
234
+ after :each do
235
+ JenkinsPipelineBuilder.registry.registry[:job][:wrappers].delete :unordered_test
236
+ end
237
+
238
+ it 'works with before first' do
239
+ wrapper do
240
+ name :unordered_test
241
+ plugin_id 'unorderedTest'
242
+
243
+ before do
244
+ fail BeforeException, 'foo'
245
+ end
246
+
247
+ xml do
248
+ true
249
+ end
250
+ end
251
+
252
+ expect(JenkinsPipelineBuilder.registry.registry[:job][:wrappers]).to have_key :unordered_test
253
+ @ext = JenkinsPipelineBuilder.registry.registry[:job][:wrappers][:unordered_test].extension
254
+
255
+ expect do
256
+ JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
257
+ end.to raise_error BeforeException
258
+ end
259
+
260
+ it 'works with after first' do
261
+ wrapper do
262
+ name :unordered_test
263
+ plugin_id 'unorderedTest'
264
+
265
+ after do
266
+ fail AfterException, 'foo'
267
+ end
268
+
269
+ xml do
270
+ true
271
+ end
272
+ end
273
+
274
+ expect(JenkinsPipelineBuilder.registry.registry[:job][:wrappers]).to have_key :unordered_test
275
+ @ext = JenkinsPipelineBuilder.registry.registry[:job][:wrappers][:unordered_test].extension
276
+
277
+ expect do
278
+ JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
279
+ end.to raise_error AfterException
280
+ end
281
+
282
+ it 'works with xml first' do
283
+ wrapper do
284
+ name :unordered_test
285
+ plugin_id 'unorderedTest'
286
+
287
+ xml do
288
+ fail XmlException, 'foo'
289
+ end
290
+
291
+ after do
292
+ true
293
+ end
294
+ end
295
+
296
+ expect(JenkinsPipelineBuilder.registry.registry[:job][:wrappers]).to have_key :unordered_test
297
+ @ext = JenkinsPipelineBuilder.registry.registry[:job][:wrappers][:unordered_test].extension
298
+
299
+ expect do
300
+ JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
301
+ end.to raise_error XmlException
302
+ end
303
+ end
304
+ end
147
305
  end