jenkins_pipeline_builder 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +4 -0
  5. data/Rakefile +68 -0
  6. data/bin/generate +28 -0
  7. data/config/login.yml +24 -0
  8. data/jenkins_pipeline_builder.gemspec +42 -0
  9. data/lib/jenksin_pipeline_builder.rb +39 -0
  10. data/lib/jenksin_pipeline_builder/builders.rb +72 -0
  11. data/lib/jenksin_pipeline_builder/cli/base.rb +69 -0
  12. data/lib/jenksin_pipeline_builder/cli/helper.rb +68 -0
  13. data/lib/jenksin_pipeline_builder/cli/pipeline.rb +40 -0
  14. data/lib/jenksin_pipeline_builder/cli/view.rb +40 -0
  15. data/lib/jenksin_pipeline_builder/compiler.rb +81 -0
  16. data/lib/jenksin_pipeline_builder/generator.rb +346 -0
  17. data/lib/jenksin_pipeline_builder/job_builder.rb +82 -0
  18. data/lib/jenksin_pipeline_builder/module_registry.rb +82 -0
  19. data/lib/jenksin_pipeline_builder/publishers.rb +113 -0
  20. data/lib/jenksin_pipeline_builder/triggers.rb +38 -0
  21. data/lib/jenksin_pipeline_builder/utils.rb +46 -0
  22. data/lib/jenksin_pipeline_builder/version.rb +25 -0
  23. data/lib/jenksin_pipeline_builder/view.rb +259 -0
  24. data/lib/jenksin_pipeline_builder/wrappers.rb +91 -0
  25. data/lib/jenksin_pipeline_builder/xml_helper.rb +40 -0
  26. data/spec/func_tests/spec_helper.rb +18 -0
  27. data/spec/func_tests/view_spec.rb +93 -0
  28. data/spec/unit_tests/compiler_spec.rb +19 -0
  29. data/spec/unit_tests/fixtures/files/Job-Build-Flow.xml +57 -0
  30. data/spec/unit_tests/fixtures/files/Job-Build-Flow.yaml +22 -0
  31. data/spec/unit_tests/fixtures/files/Job-Build-Maven.xml +90 -0
  32. data/spec/unit_tests/fixtures/files/Job-Build-Maven.yaml +26 -0
  33. data/spec/unit_tests/fixtures/files/Job-DSL.yaml +14 -0
  34. data/spec/unit_tests/fixtures/files/Job-DSL1.xml +27 -0
  35. data/spec/unit_tests/fixtures/files/Job-DSL2.xml +25 -0
  36. data/spec/unit_tests/fixtures/files/Job-Gem-Build.xml +142 -0
  37. data/spec/unit_tests/fixtures/files/Job-Gem-Build.yaml +41 -0
  38. data/spec/unit_tests/fixtures/files/Job-Generate-From-Template.xml +32 -0
  39. data/spec/unit_tests/fixtures/files/Job-Generate-From-Template.yaml +8 -0
  40. data/spec/unit_tests/fixtures/files/Job-Multi-Project.xml +117 -0
  41. data/spec/unit_tests/fixtures/files/Job-Multi-Project.yaml +36 -0
  42. data/spec/unit_tests/fixtures/files/project.yaml +15 -0
  43. data/spec/unit_tests/generator_spec.rb +67 -0
  44. data/spec/unit_tests/module_registry_spec.rb +19 -0
  45. data/spec/unit_tests/resolve_dependencies_spec.rb +230 -0
  46. data/spec/unit_tests/spec_helper.rb +29 -0
  47. metadata +75 -6
@@ -0,0 +1,15 @@
1
+ - defaults:
2
+ name: global
3
+ description: 'Do not edit this job through the web!'
4
+ hipchat_room: HipChat Room Name
5
+ os_username: admin
6
+ os_priv_key: /home/user/qa-oskey.priv
7
+ os_password: some_encrypted_password
8
+
9
+ - project:
10
+ name: Generate
11
+ jobs:
12
+ - Job-{{name}}-From-Template:
13
+ command: run.sh
14
+ - Job-DSL1
15
+ - Job-DSL2
@@ -0,0 +1,67 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require 'equivalent-xml'
3
+
4
+ describe 'Test YAML jobs conversion to XML' do
5
+ context 'Loading YAML files' do
6
+ before do
7
+ @client = JenkinsApi::Client.new(
8
+ :server_ip => '127.0.0.1',
9
+ :server_port => 8080,
10
+ :username => 'username',
11
+ :password => 'password',
12
+ :log_location => '/dev/null'
13
+ )
14
+ @generator = JenkinsPipelineBuilder::Generator.new(nil, @client)
15
+ @generator.debug = true
16
+ @generator.no_files = true
17
+ end
18
+
19
+ def compare_jobs(job, path)
20
+ xml = @generator.compile_job_to_xml(job)
21
+ doc1 = Nokogiri::XML(xml)
22
+
23
+ sample_job_xml = File.read(path + '.xml')
24
+
25
+ doc2 = Nokogiri::XML(sample_job_xml)
26
+
27
+ doc1.should be_equivalent_to(doc2)
28
+ end
29
+
30
+ [
31
+ 'Job-Multi-Project',
32
+ 'Job-Build-Maven',
33
+ 'Job-Build-Flow',
34
+ 'Job-Gem-Build'
35
+ ].each do |file|
36
+ it "should create expected XML from YAML '#{file}'" do
37
+ path = File.expand_path('../fixtures/files/' + file, __FILE__)
38
+
39
+ @generator.load_collection_from_path path + '.yaml'
40
+ job_name = @generator.job_collection.keys.first
41
+ job = @generator.resolve_job_by_name(job_name)
42
+
43
+ compare_jobs job, path
44
+ end
45
+ end
46
+
47
+ it "should create expected XML from YAML collection" do
48
+ path = File.expand_path('../fixtures/files/', __FILE__)
49
+
50
+ @generator.load_collection_from_path(path)
51
+
52
+ project_name = @generator.projects.first[:name]
53
+
54
+ project = @generator.resolve_project(@generator.get_item(project_name))
55
+
56
+ project[:value][:jobs].should_not be_nil
57
+
58
+ project[:value][:jobs].each do |i|
59
+ job = i[:result]
60
+ job.should_not be_nil
61
+
62
+ file_name = File.join(path, job[:name])
63
+ compare_jobs job, file_name
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,19 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe 'ModuleRegistry' do
4
+
5
+ it 'should return item by a specified path' do
6
+
7
+ registry = JenkinsPipelineBuilder::ModuleRegistry.new ({
8
+ zz: {
9
+ aa: 'aa',
10
+ bb: 'bb',
11
+ cc: {
12
+ dd: 'dd'
13
+ }
14
+ }
15
+ })
16
+
17
+ registry.get('zz/aa').should be == 'aa'
18
+ end
19
+ end
@@ -0,0 +1,230 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+
3
+ describe 'Templates resolver' do
4
+ before(:each) do
5
+ @client = JenkinsApi::Client.new(
6
+ :server_ip => '127.0.0.1',
7
+ :server_port => 8080,
8
+ :username => 'username',
9
+ :password => 'password',
10
+ :log_location => '/dev/null'
11
+ )
12
+ @generator = JenkinsPipelineBuilder::Generator.new(nil, @client)
13
+ @generator.debug = true
14
+ @generator.no_files = true
15
+ end
16
+
17
+ describe 'resolving settings bags' do
18
+ it 'gives a bag when all the variables can be resolved' do
19
+ str = %{
20
+ - project:
21
+ name: project-name
22
+ db: my_own_db_{{else}}
23
+ }
24
+ project = YAML.load(str)
25
+ @generator.load_job_collection project
26
+
27
+ #@generator.resolve_item('project-name')
28
+ settings = JenkinsPipelineBuilder::Compiler.get_settings_bag(@generator.get_item('project-name'), { db: 'blah', else: "bum" })
29
+ settings.should == { name: "project-name", db: "my_own_db_bum", else: "bum", }
30
+ end
31
+
32
+ it 'returns nil when all the variables cant be resolved' do
33
+ str = %{
34
+ - project:
35
+ name: project-name
36
+ db: my_own_db_{{else}}_{{blah}}
37
+ }
38
+ project = YAML.load(str)
39
+ @generator.load_job_collection project
40
+
41
+ #@generator.resolve_item('project-name')
42
+ settings = JenkinsPipelineBuilder::Compiler.get_settings_bag(@generator.get_item('project-name'), { db: 'blah', else: "bum" })
43
+ settings.should be_nil
44
+ end
45
+ end
46
+
47
+ it 'starts with the defaults section for settings bag' do
48
+ str = %{
49
+ - defaults:
50
+ name: global
51
+ description: 'Do not edit this job through the web!'
52
+ - job-template:
53
+ name: 'foo-bar'
54
+ description: '{{description}}'
55
+ builders:
56
+ - shell: perftest
57
+ - project:
58
+ name: project-name
59
+ db: my_own_db
60
+ jobs:
61
+ - 'foo-bar'
62
+ }
63
+ project = YAML.load(str)
64
+ @generator.load_job_collection project
65
+
66
+ @generator.resolve_project(@generator.get_item('project-name')).should ==
67
+ {:name=>"project-name",
68
+ :type=>:project,
69
+ :value=>
70
+ {:name=>"project-name",
71
+ :db=>"my_own_db",
72
+ :jobs=>
73
+ [{:"foo-bar"=>{},
74
+ :result=>
75
+ {:name=>"foo-bar",
76
+ :description=>"Do not edit this job through the web!",
77
+ :builders=>[{:shell=>"perftest"}]}}]},
78
+ :settings=>
79
+ {:name=>"project-name",
80
+ :description=>"Do not edit this job through the web!",
81
+ :db=>"my_own_db"}}
82
+ end
83
+
84
+ it 'should build project collection from jobs templates' do
85
+ str = %{
86
+ - job-template:
87
+ name: '{{name}}-unit-tests'
88
+ builders:
89
+ - shell: unittest
90
+ publishers:
91
+ - email:
92
+ recipients: '{{mail-to}}'
93
+
94
+ - job-template:
95
+ name: '{{name}}-perf-tests'
96
+ builders:
97
+ - shell: perftest
98
+ publishers:
99
+ - email:
100
+ recipients: '{{mail-to}}'
101
+
102
+ - project:
103
+ name: project-name
104
+ db: my_own_db
105
+ jobs:
106
+ - '{{name}}-unit-tests':
107
+ mail-to: developer@nowhere.net
108
+ - '{{name}}-perf-tests':
109
+ mail-to: projmanager@nowhere.net
110
+ }
111
+
112
+ project = YAML.load(str)
113
+ @generator.load_job_collection project
114
+
115
+ @generator.resolve_project(@generator.get_item('project-name')).should ==
116
+ {:name=>"project-name",
117
+ :type=>:project,
118
+ :value=>
119
+ {:name=>"project-name",
120
+ :db=>"my_own_db",
121
+ :jobs=>
122
+ [{:"{{name}}-unit-tests"=>{:"mail-to"=>"developer@nowhere.net"},
123
+ :result=>
124
+ {:name=>"project-name-unit-tests",
125
+ :builders=>[{:shell=>"unittest"}],
126
+ :publishers=>[{:email=>{:recipients=>"developer@nowhere.net"}}]}},
127
+ {:"{{name}}-perf-tests"=>{:"mail-to"=>"projmanager@nowhere.net"},
128
+ :result=>
129
+ {:name=>"project-name-perf-tests",
130
+ :builders=>[{:shell=>"perftest"}],
131
+ :publishers=>[{:email=>{:recipients=>"projmanager@nowhere.net"}}]}}]},
132
+ :settings=>{:name=>"project-name", :db=>"my_own_db"}}
133
+ end
134
+
135
+ it 'should build project collection from jobs and jobs templates' do
136
+ str = %{
137
+ - job-template:
138
+ name: '{{name}}-unit-tests'
139
+ builders:
140
+ - shell: unittest
141
+ publishers:
142
+ - email:
143
+ recipients: '{{mail-to}}'
144
+
145
+ - job:
146
+ name: 'foo-bar'
147
+ builders:
148
+ - shell: perftest
149
+
150
+ - project:
151
+ name: project-name
152
+ db: my_own_db
153
+ jobs:
154
+ - 'foo-bar'
155
+ - '{{name}}-unit-tests':
156
+ mail-to: projmanager@nowhere.net
157
+ }
158
+
159
+ project = YAML.load(str)
160
+ @generator.load_job_collection project
161
+
162
+ @generator.resolve_project(@generator.get_item('project-name')).should ==
163
+ {:name=>"project-name",
164
+ :type=>:project,
165
+ :value=>
166
+ {:name=>"project-name",
167
+ :db=>"my_own_db",
168
+ :jobs=>
169
+ [{:"foo-bar"=>{},
170
+ :result=>
171
+ {:name=>"foo-bar",
172
+ :builders=>[{:shell=>"perftest"}]}},
173
+ {:"{{name}}-unit-tests"=>{:"mail-to"=>"projmanager@nowhere.net"},
174
+ :result=>
175
+ {:name=>"project-name-unit-tests",
176
+ :builders=>[{:shell=>"unittest"}],
177
+ :publishers=>[{:email=>{:recipients=>"projmanager@nowhere.net"}}]}}]},
178
+ :settings=>{:name=>"project-name", :db=>"my_own_db"}}
179
+ end
180
+
181
+
182
+ describe 'compilation of templates' do
183
+ it 'compiles String' do
184
+ JenkinsPipelineBuilder::Compiler.compile('blah', { item1: 'data1'}).should == 'blah'
185
+ end
186
+
187
+ it 'compiles simple Hash' do
188
+ JenkinsPipelineBuilder::Compiler.compile({ name: 'item-{{item1}}', value: 'item1-data'}, { item1: 'data1'}).should ==
189
+ { name: 'item-data1', value: 'item1-data'}
190
+ end
191
+
192
+ it 'compiles nested Hash' do
193
+ JenkinsPipelineBuilder::Compiler.compile({ name: 'item-{{item1}}', value: { house: 'house-{{item1}}'}}, { item1: 'data1'}).should ==
194
+ { name: 'item-data1', value: { house: 'house-data1'}}
195
+ end
196
+
197
+ it 'compiles complex Hash' do
198
+ template = {:name=>"{{name}}-unit-tests",
199
+ :builders=>[{:shell=>"unittest"}],
200
+ :publishers=>[{:email=>{:recipients=>"{{mail-to}}"}}]}
201
+ settings = {:name=>"project-name", :db=>"my_own_db", :'mail-to' => 'developer@nowhere.net'}
202
+
203
+ JenkinsPipelineBuilder::Compiler.compile(template, settings).should ==
204
+ {:name=>"project-name-unit-tests",
205
+ :builders=>[{:shell=>"unittest"}],
206
+ :publishers=>[{:email=>{:recipients=>"developer@nowhere.net"}}]}
207
+ end
208
+ end
209
+
210
+ it 'shoult resolve job template into a job' do
211
+ file = 'project_simple'
212
+ path = File.expand_path('../fixtures/templates/' + file, __FILE__)
213
+ project = YAML.load_file(path + '.yaml')
214
+
215
+ @generator.load_job_collection project
216
+
217
+ @generator.resolve_job_by_name('{{name}}-unit-tests', { name: 'project-name', db: 'my_own_db', :'mail-to' => 'developer@nowhere.net' }).should ==
218
+ {:name=>"project-name-unit-tests",
219
+ :builders=>[{:shell=>"unittest"}],
220
+ :publishers=>[{:email=>{:recipients=>"developer@nowhere.net"}}]}
221
+ end
222
+
223
+ it 'should load from folder' do
224
+ path = File.expand_path('../fixtures/templates/', __FILE__)
225
+ @generator.load_collection_from_path(path)
226
+
227
+ @generator.job_collection.count.should == 4
228
+ @generator.projects.count == 1
229
+ end
230
+ end
@@ -0,0 +1,29 @@
1
+ require 'logger'
2
+ require 'rspec'
3
+
4
+ require 'simplecov'
5
+ require 'simplecov-rcov'
6
+
7
+ SimpleCov.profiles.define 'spec' do
8
+ add_group 'jenksin_pipeline_builder', '/lib/'
9
+ coverage_dir 'out/coverage'
10
+ formatter SimpleCov::Formatter::MultiFormatter[
11
+ SimpleCov::Formatter::Console,
12
+ SimpleCov::Formatter::RcovFormatter,
13
+ ]
14
+ end
15
+
16
+ class SimpleCov::Formatter::Console
17
+ def format(result)
18
+ print "COVERAGE: #{result.covered_percent.round(2)}%\n"
19
+ end
20
+ end
21
+
22
+ SimpleCov.start 'spec' #if ENV["COVERAGE"]
23
+
24
+ require File.expand_path('../../../lib/jenksin_pipeline_builder', __FILE__)
25
+
26
+ RSpec.configure do |config|
27
+ config.before(:each) do
28
+ end
29
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jenkins_pipeline_builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Moochnick
@@ -248,16 +248,64 @@ dependencies:
248
248
  - - '>='
249
249
  - !ruby/object:Gem::Version
250
250
  version: '0'
251
- description: This gem is intended to upload Jenkins pipelines
251
+ description: |-
252
+ This is a simple and easy-to-use Jenkins Pipeline generator with features focused on
253
+ automating Job & Pipeline creation from the YAML files checked-in with your application source code
252
254
  email:
253
255
  - igor.moochnick@gmail.com
254
- executables: []
256
+ executables:
257
+ - generate
255
258
  extensions: []
256
259
  extra_rdoc_files: []
257
260
  files:
261
+ - .ruby-gemset
262
+ - .ruby-version
263
+ - Gemfile
258
264
  - LICENSE
259
265
  - README.md
260
- homepage: ''
266
+ - Rakefile
267
+ - bin/generate
268
+ - config/login.yml
269
+ - jenkins_pipeline_builder.gemspec
270
+ - lib/jenksin_pipeline_builder.rb
271
+ - lib/jenksin_pipeline_builder/builders.rb
272
+ - lib/jenksin_pipeline_builder/cli/base.rb
273
+ - lib/jenksin_pipeline_builder/cli/helper.rb
274
+ - lib/jenksin_pipeline_builder/cli/pipeline.rb
275
+ - lib/jenksin_pipeline_builder/cli/view.rb
276
+ - lib/jenksin_pipeline_builder/compiler.rb
277
+ - lib/jenksin_pipeline_builder/generator.rb
278
+ - lib/jenksin_pipeline_builder/job_builder.rb
279
+ - lib/jenksin_pipeline_builder/module_registry.rb
280
+ - lib/jenksin_pipeline_builder/publishers.rb
281
+ - lib/jenksin_pipeline_builder/triggers.rb
282
+ - lib/jenksin_pipeline_builder/utils.rb
283
+ - lib/jenksin_pipeline_builder/version.rb
284
+ - lib/jenksin_pipeline_builder/view.rb
285
+ - lib/jenksin_pipeline_builder/wrappers.rb
286
+ - lib/jenksin_pipeline_builder/xml_helper.rb
287
+ - spec/func_tests/spec_helper.rb
288
+ - spec/func_tests/view_spec.rb
289
+ - spec/unit_tests/compiler_spec.rb
290
+ - spec/unit_tests/fixtures/files/Job-Build-Flow.xml
291
+ - spec/unit_tests/fixtures/files/Job-Build-Flow.yaml
292
+ - spec/unit_tests/fixtures/files/Job-Build-Maven.xml
293
+ - spec/unit_tests/fixtures/files/Job-Build-Maven.yaml
294
+ - spec/unit_tests/fixtures/files/Job-DSL.yaml
295
+ - spec/unit_tests/fixtures/files/Job-DSL1.xml
296
+ - spec/unit_tests/fixtures/files/Job-DSL2.xml
297
+ - spec/unit_tests/fixtures/files/Job-Gem-Build.xml
298
+ - spec/unit_tests/fixtures/files/Job-Gem-Build.yaml
299
+ - spec/unit_tests/fixtures/files/Job-Generate-From-Template.xml
300
+ - spec/unit_tests/fixtures/files/Job-Generate-From-Template.yaml
301
+ - spec/unit_tests/fixtures/files/Job-Multi-Project.xml
302
+ - spec/unit_tests/fixtures/files/Job-Multi-Project.yaml
303
+ - spec/unit_tests/fixtures/files/project.yaml
304
+ - spec/unit_tests/generator_spec.rb
305
+ - spec/unit_tests/module_registry_spec.rb
306
+ - spec/unit_tests/resolve_dependencies_spec.rb
307
+ - spec/unit_tests/spec_helper.rb
308
+ homepage: https://github.com/IgorShare/jenkins_pipeline_builder
261
309
  licenses:
262
310
  - MIT
263
311
  metadata: {}
@@ -280,6 +328,27 @@ rubyforge_project:
280
328
  rubygems_version: 2.1.11
281
329
  signing_key:
282
330
  specification_version: 4
283
- summary: This gem is intended to upload Jenkins pipelines
284
- test_files: []
331
+ summary: This gem is will boostrap your Jenkins pipelines
332
+ test_files:
333
+ - spec/func_tests/spec_helper.rb
334
+ - spec/func_tests/view_spec.rb
335
+ - spec/unit_tests/compiler_spec.rb
336
+ - spec/unit_tests/fixtures/files/Job-Build-Flow.xml
337
+ - spec/unit_tests/fixtures/files/Job-Build-Flow.yaml
338
+ - spec/unit_tests/fixtures/files/Job-Build-Maven.xml
339
+ - spec/unit_tests/fixtures/files/Job-Build-Maven.yaml
340
+ - spec/unit_tests/fixtures/files/Job-DSL.yaml
341
+ - spec/unit_tests/fixtures/files/Job-DSL1.xml
342
+ - spec/unit_tests/fixtures/files/Job-DSL2.xml
343
+ - spec/unit_tests/fixtures/files/Job-Gem-Build.xml
344
+ - spec/unit_tests/fixtures/files/Job-Gem-Build.yaml
345
+ - spec/unit_tests/fixtures/files/Job-Generate-From-Template.xml
346
+ - spec/unit_tests/fixtures/files/Job-Generate-From-Template.yaml
347
+ - spec/unit_tests/fixtures/files/Job-Multi-Project.xml
348
+ - spec/unit_tests/fixtures/files/Job-Multi-Project.yaml
349
+ - spec/unit_tests/fixtures/files/project.yaml
350
+ - spec/unit_tests/generator_spec.rb
351
+ - spec/unit_tests/module_registry_spec.rb
352
+ - spec/unit_tests/resolve_dependencies_spec.rb
353
+ - spec/unit_tests/spec_helper.rb
285
354
  has_rdoc: