jenkins_pipeline_builder 0.1.2 → 0.1.3

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 (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: