jenkins_pipeline_builder 0.6.0 → 0.7.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.
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