jenkins_pipeline_builder 0.11.0 → 0.11.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MWM3M2NlYzkyODVkOTJiMDcxNjgyY2U4MDFhZWRkNDkyMDViNGFmZg==
4
+ ZWQ5ODAzODU5ZTFiZjA1NzkwMDgyMGEyYzFjMDcwNGY5NDQ4MGZlMg==
5
5
  data.tar.gz: !binary |-
6
- MGQ1MDM2NDQ4OGJjMWExNzRiZGI1ZDEwMzAwODcxNDFkMjAyYTE0Yw==
6
+ ZjFkOGIxYTJiMjc0NmViZGNiMTU1NTlmZGViN2Y4ODFiZTgyODBlNA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- YTQ2ZjU1YzkwOWNlN2RjNTJjNzhhZGEwNmZmNTI5ZWU5ZjE5MzgwN2YzNjAx
10
- NDIyNzJhMTI2ODkwMDhhOGE2NGNlYTc4OTgxYmZiODZjZjk3NmRhYTNiMWJh
11
- YTRjMTQxMGYyM2U4YTM0N2JmMTg3NGMzMWI4NzdmY2I3ZmVlNWQ=
9
+ OGZkNzk1ZmE2ODZmZTg4MzhiMTBiZDNlMzNkY2E1OGM4N2QzZDJmNzA0MTRi
10
+ Zjk5ZGRiNjJkNjhjNzYzNDY1OGY4MmRlMTE5YzliYjBmMjY3OTg4NWViOTE2
11
+ NmIxN2JiZjY3NmVkMWUzNzFiZjEyMjcyNDU5NmYxMmIyODdmYWM=
12
12
  data.tar.gz: !binary |-
13
- ZDE3OGY2ZDU3N2VjOTExN2MzNDYyZjEyYjU2MmZmM2I3ZmFkY2QxYzY4OGIw
14
- YzY0NDZjZTczNWMzMGQ5NWFiYzY0N2Q4ZjUxYTMwYzY3ZTZjY2U4N2M2ZjNl
15
- YmNiNjk2OTI4YmViODEyNWMxMzYxYTIzZjU3Y2I1YWQxMGU1MWE=
13
+ MzdiMDJkMWMyOTg1ZjI5MGQwYTllZTIxOWMwNTNjNjU4NWI4MjhmMmUxNmQ2
14
+ MTFmOTdlNDgyYjE0Nzc2M2U5NzE2ODIwMDI3NzgyMjQ2MjBmYWU5MjA1ZGMx
15
+ NTNiMTA5Y2UwZmQyOTdmMTdjOTg1NmZjYTM4NGJlODBjMTY4MDY=
@@ -1,13 +1,11 @@
1
1
  #######
2
2
  # WIP These should all go back to defaults at some point
3
- Metrics/CyclomaticComplexity:
4
- Max: 9
5
- Metrics/PerceivedComplexity:
6
- Max: 11
3
+ Metrics/AbcSize:
4
+ Max: 22
7
5
  Metrics/MethodLength:
8
6
  Max: 20
9
7
  Metrics/ClassLength:
10
- Max: 175
8
+ Max: 180
11
9
 
12
10
  #######
13
11
  # Finalized settings
@@ -17,7 +15,6 @@ Metrics/LineLength:
17
15
  Exclude:
18
16
  - 'spec/lib/jenkins_pipeline_builder/compiler_spec.rb'
19
17
  - 'spec/lib/jenkins_pipeline_builder/view_spec.rb'
20
- - 'spec/lib/jenkins_pipeline_builder/pull_request_spec.rb'
21
18
  - 'spec/lib/jenkins_pipeline_builder/pull_request_generator_spec.rb'
22
19
  - 'lib/jenkins_pipeline_builder/extensions/**/*'
23
20
 
@@ -15,8 +15,8 @@ automating Job & Pipeline creation from the YAML files checked-in with your appl
15
15
  spec.license = 'MIT'
16
16
 
17
17
  spec.files = `git ls-files`.split($RS)
18
- spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
19
- spec.test_files = spec.files.grep(/^(test|spec|features)\//)
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
20
  spec.require_paths = ['lib']
21
21
 
22
22
  ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] = 'true'
@@ -42,7 +42,5 @@ automating Job & Pipeline creation from the YAML files checked-in with your appl
42
42
  spec.add_development_dependency 'yard'
43
43
  spec.add_development_dependency 'rspec_junit_formatter'
44
44
  spec.add_development_dependency 'webmock'
45
- # Eventually, we'll fix all the Complexity that ties us to 0.26.1
46
- # spec.add_development_dependency 'rubocop'
47
- spec.add_development_dependency 'rubocop', '= 0.26.1'
45
+ spec.add_development_dependency 'rubocop'
48
46
  end
@@ -49,20 +49,14 @@ module JenkinsPipelineBuilder
49
49
  end
50
50
 
51
51
  def self.process_creds(options)
52
- if options[:username] && options[:server] && (options[:password] || options[:password_base64])
53
- return process_cli_creds(options)
52
+ if valid_cli_creds? options
53
+ process_cli_creds(options)
54
54
  elsif options[:creds_file]
55
- if options[:creds_file].end_with? 'json'
56
- return JSON.parse(IO.read(File.expand_path(options[:creds_file])))
57
- else
58
- return YAML.load_file(File.expand_path(options[:creds_file]))
59
- end
55
+ process_creds_file options[:creds_file]
60
56
  elsif File.exist?("#{ENV['HOME']}/.jenkins_api_client/login.yml")
61
- return YAML.load_file(
62
- File.expand_path("#{ENV['HOME']}/.jenkins_api_client/login.yml", __FILE__)
63
- )
57
+ YAML.load_file(File.expand_path("#{ENV['HOME']}/.jenkins_api_client/login.yml", __FILE__))
64
58
  elsif options[:debug]
65
- return { username: :foo, password: :bar, server_ip: :baz }
59
+ { username: :foo, password: :bar, server_ip: :baz }
66
60
  else
67
61
  msg = 'Credentials are not set. Please pass them as parameters or'
68
62
  msg << ' set them in the default credentials file'
@@ -71,6 +65,18 @@ module JenkinsPipelineBuilder
71
65
  end
72
66
  end
73
67
 
68
+ def self.valid_cli_creds?(options)
69
+ options[:username] && options[:server] && (options[:password] || options[:password_base64])
70
+ end
71
+
72
+ def self.process_creds_file(file)
73
+ if file.end_with? 'json'
74
+ return JSON.parse(IO.read(File.expand_path(file)))
75
+ else
76
+ return YAML.load_file(File.expand_path(file))
77
+ end
78
+ end
79
+
74
80
  def self.process_cli_creds(options)
75
81
  creds = {}.with_indifferent_access.merge options
76
82
  if creds[:server] =~ Resolv::AddressRegex
@@ -61,7 +61,7 @@ module JenkinsPipelineBuilder
61
61
 
62
62
  def handle_enable(item, settings)
63
63
  return true, item unless item.is_a? Hash
64
- if item.key?(:enabled) && item.key?(:parameters) && item.length == 2
64
+ if enable_block_present? item
65
65
  enabled_switch = resolve_value(item[:enabled], settings)
66
66
  return [true, {}] if enabled_switch == 'false'
67
67
  if enabled_switch != 'true'
@@ -80,6 +80,10 @@ module JenkinsPipelineBuilder
80
80
 
81
81
  private
82
82
 
83
+ def enable_block_present?(item)
84
+ item.key?(:enabled) && item.key?(:parameters) && item.length == 2
85
+ end
86
+
83
87
  def compile_string(item, settings)
84
88
  errors = {}
85
89
  new_value = resolve_value(item, settings)
@@ -65,11 +65,7 @@ module JenkinsPipelineBuilder
65
65
 
66
66
  n_builders = n_xml.xpath(path).first
67
67
  n_builders.instance_exec(value, &before) if before
68
- Nokogiri::XML::Builder.with(n_builders) do |builder|
69
- include_helper value, builder
70
- helper.extension = self
71
- builder.instance_exec helper, &xml
72
- end
68
+ build_extension_xml n_builders, value
73
69
  n_builders.instance_exec(value, &after) if after
74
70
  true
75
71
  end
@@ -93,6 +89,14 @@ module JenkinsPipelineBuilder
93
89
 
94
90
  private
95
91
 
92
+ def build_extension_xml(n_builders, value)
93
+ Nokogiri::XML::Builder.with(n_builders) do |builder|
94
+ include_helper value, builder
95
+ helper.extension = self
96
+ builder.instance_exec helper, &xml
97
+ end
98
+ end
99
+
96
100
  def include_helper(params, builder)
97
101
  klass = "#{name.to_s.camelize}Helper".safe_constantize
98
102
  klass ||= ExtensionHelper
@@ -238,7 +238,6 @@ job_attribute do
238
238
  send('hudson.model.ParametersDefinitionProperty') do
239
239
  parameterDefinitions do
240
240
  params.each do |param|
241
-
242
241
  send(params.param_type param) do
243
242
  name param[:name]
244
243
  description param[:description]
@@ -108,7 +108,6 @@ publisher do
108
108
  end
109
109
  end
110
110
  end
111
-
112
111
  end
113
112
 
114
113
  publisher do
@@ -328,7 +327,6 @@ publisher do
328
327
  announced false
329
328
 
330
329
  xml do |params|
331
-
332
330
  send('hudson.plugins.brakeman.BrakemanPublisher', 'plugin' => 'brakeman') do
333
331
  healthy params[:healthy] || ''
334
332
  unHealthy params[:unhealthy] || ''
@@ -356,7 +354,6 @@ publisher do
356
354
  doNotResolveRelativePaths { text(params[:do_not_resolve_relative_paths] || false) }
357
355
  outputFile { text(params[:output_file] || 'brakeman-output.tabs') }
358
356
  end
359
-
360
357
  end
361
358
  end
362
359
 
@@ -381,7 +378,6 @@ publisher do
381
378
 
382
379
  xml do |params|
383
380
  send('hudson.plugins.cobertura.CoberturaPublisher', 'plugin' => 'cobertura') do
384
-
385
381
  coberturaReportFile params[:cobertura_report_file]
386
382
  onlyStable params[:only_stable] || false
387
383
  failUnhealthy params[:fail_unhealthy] || false
@@ -399,7 +395,6 @@ publisher do
399
395
  sourceEncoding params[:source_encoding] || 'ASCII'
400
396
  end
401
397
  end
402
-
403
398
  end
404
399
 
405
400
  publisher do
@@ -417,7 +412,6 @@ publisher do
417
412
 
418
413
  configuredTriggers do
419
414
  params[:triggers].each do |trigger_params|
420
-
421
415
  trigger_type = trigger_params[:type].to_sym
422
416
  defaults = params.trigger_defaults[trigger_type]
423
417
 
@@ -507,7 +501,6 @@ publisher do
507
501
  validateNumberOfTests params[:validate_number_tests] || false
508
502
  end
509
503
  end
510
-
511
504
  end
512
505
 
513
506
  publisher do
@@ -174,7 +174,7 @@ wrapper do
174
174
  repositoryKey wrapper[:'release-repo']
175
175
  snapshotsRepositoryKey wrapper.fetch(:'snapshot-repo', wrapper[:'release-repo'])
176
176
  end
177
- deployArtifacts wrapper.fetch(:'deploy', true)
177
+ deployArtifacts wrapper.fetch(:deploy, true)
178
178
  artifactDeploymentPatterns do
179
179
  includePatterns
180
180
  excludePatterns
@@ -49,33 +49,28 @@ module JenkinsPipelineBuilder
49
49
  def bootstrap(path, project_name = nil)
50
50
  logger.info "Bootstrapping pipeline from path #{path}"
51
51
  job_collection.load_from_path(path)
52
- errors = {}
52
+ job_collection.remote_dependencies.cleanup
53
+
53
54
  if job_collection.projects.any?
54
55
  errors = publish_project(project_name)
55
56
  else
56
57
  errors = publish_jobs(job_collection.standalone_jobs)
57
58
  end
58
- errors.each do |k, v|
59
- logger.error "Encountered errors compiling: #{k}:"
60
- logger.error v
61
- end
59
+ print_compile_errors errors
62
60
  errors
63
61
  end
64
62
 
65
63
  def pull_request(path, project_name)
66
64
  logger.info "Pull Request Generator Running from path #{path}"
67
65
  job_collection.load_from_path(path)
66
+ job_collection.remote_dependencies.cleanup
68
67
  logger.info "Project: #{job_collection.projects}"
69
68
  errors = {}
70
69
  job_collection.projects.each do |project|
71
70
  next unless project[:name] == project_name || project_name.nil?
72
71
  errors.merge! process_pull_request_project project
73
-
74
- end
75
- errors.each do |k, v|
76
- logger.error "Encountered errors compiling: #{k}:"
77
- logger.error v
78
72
  end
73
+ print_compile_errors errors
79
74
  errors.empty?
80
75
  end
81
76
 
@@ -97,7 +92,7 @@ module JenkinsPipelineBuilder
97
92
  fail "Failed to locate job by name '#{name}'" if job.nil?
98
93
  job_value = job[:value]
99
94
  logger.debug "Compiling job #{name}"
100
- compiler = Compiler.new self
95
+ compiler = JenkinsPipelineBuilder::Compiler.new self
101
96
  success, payload = compiler.compile(job_value, settings)
102
97
  [success, payload]
103
98
  end
@@ -105,15 +100,36 @@ module JenkinsPipelineBuilder
105
100
  def resolve_project(project)
106
101
  defaults = job_collection.defaults
107
102
  settings = defaults.nil? ? {} : defaults[:value] || {}
108
- compiler = Compiler.new self
103
+ compiler = JenkinsPipelineBuilder::Compiler.new self
109
104
  project[:settings] = compiler.get_settings_bag(project, settings) unless project[:settings]
110
- project_body = project[:value]
111
105
 
106
+ errors = process_project project
107
+ print_project_errors errors
108
+ return false, 'Encountered errors exiting' unless errors.empty?
109
+
110
+ [true, project]
111
+ end
112
+
113
+ private
114
+
115
+ def process_project(project)
116
+ project_body = project[:value]
112
117
  jobs = prepare_jobs(project_body[:jobs]) if project_body[:jobs]
113
118
  logger.info project
114
119
  process_job_changes(jobs)
115
120
  errors = process_jobs(jobs, project)
116
121
  errors = process_views(project_body[:views], project, errors) if project_body[:views]
122
+ errors
123
+ end
124
+
125
+ def print_compile_errors(errors)
126
+ errors.each do |k, v|
127
+ logger.error "Encountered errors compiling: #{k}:"
128
+ logger.error v
129
+ end
130
+ end
131
+
132
+ def print_project_errors(errors)
117
133
  errors.each do |k, v|
118
134
  puts "Encountered errors processing: #{k}:"
119
135
  v.each do |key, error|
@@ -121,13 +137,8 @@ module JenkinsPipelineBuilder
121
137
  puts " #{error.inspect}"
122
138
  end
123
139
  end
124
- return false, 'Encountered errors exiting' unless errors.empty?
125
-
126
- [true, project]
127
140
  end
128
141
 
129
- private
130
-
131
142
  def process_pull_request_project(project)
132
143
  logger.info "Using Project #{project}"
133
144
 
@@ -187,6 +198,13 @@ module JenkinsPipelineBuilder
187
198
  errors
188
199
  end
189
200
 
201
+ def create_views(views)
202
+ views.each do |v|
203
+ compiled_view = v[:result]
204
+ view.create(compiled_view)
205
+ end
206
+ end
207
+
190
208
  def publish_project(project_name, errors = {})
191
209
  job_collection.projects.each do |project|
192
210
  next unless project_name.nil? || project[:name] == project_name
@@ -200,10 +218,7 @@ module JenkinsPipelineBuilder
200
218
 
201
219
  errors = publish_jobs(compiled_project[:value][:jobs]) if compiled_project[:value][:jobs]
202
220
  next unless compiled_project[:value][:views]
203
- compiled_project[:value][:views].each do |v|
204
- compiled_view = v[:result]
205
- view.create(compiled_view)
206
- end
221
+ create_views compiled_project[:value][:views]
207
222
  end
208
223
  errors
209
224
  end
@@ -61,7 +61,6 @@ module JenkinsPipelineBuilder
61
61
  else
62
62
  load_file(path, remote)
63
63
  end
64
- remote_dependencies.cleanup if remote
65
64
  end
66
65
 
67
66
  private
@@ -94,19 +94,28 @@ module JenkinsPipelineBuilder
94
94
  next
95
95
  end
96
96
  reg_value = registry[key]
97
- if reg_value.is_a? ExtensionSet
98
- ext = reg_value.extension
99
- logger.debug "Using #{ext.type} #{ext.name} version #{ext.min_version}"
100
- success = ext.execute value, n_xml
101
- fail 'Encountered errors compiling the xml' unless success
102
- elsif value.is_a? Hash
103
- traverse_registry reg_value, value, n_xml, true
104
- elsif value.is_a? Array
105
- value.each do |v|
106
- traverse_registry reg_value, v, n_xml, true
107
- end
97
+ execute_registry_value reg_value, value, n_xml
98
+ end
99
+ end
100
+
101
+ private
102
+
103
+ def execute_registry_value(reg_value, value, n_xml)
104
+ if reg_value.is_a? ExtensionSet
105
+ execute_extension reg_value.extension, value, n_xml
106
+ elsif value.is_a? Hash
107
+ traverse_registry reg_value, value, n_xml, true
108
+ elsif value.is_a? Array
109
+ value.each do |v|
110
+ traverse_registry reg_value, v, n_xml, true
108
111
  end
109
112
  end
110
113
  end
114
+
115
+ def execute_extension(ext, value, n_xml)
116
+ logger.debug "Using #{ext.type} #{ext.name} version #{ext.min_version}"
117
+ success = ext.execute value, n_xml
118
+ fail 'Encountered errors compiling the xml' unless success
119
+ end
111
120
  end
112
121
  end
@@ -43,7 +43,7 @@ module JenkinsPipelineBuilder
43
43
  find_old_pull_requests
44
44
  generate_pull_requests
45
45
 
46
- @generator.job_collection.collection.merge! @jobs
46
+ collection.merge! @jobs
47
47
  @errors.merge! create_jobs
48
48
 
49
49
  purge_jobs
@@ -90,14 +90,18 @@ module JenkinsPipelineBuilder
90
90
  errors
91
91
  end
92
92
 
93
+ def collection
94
+ generator.job_collection.collection
95
+ end
96
+
93
97
  def filter_jobs
94
98
  jobs = {}
95
99
  pull_jobs = pull_generator[:value][:jobs] || []
96
100
  pull_jobs.each do |job|
97
101
  if job.is_a? String
98
- jobs[job.to_s] = generator.job_collection.collection[job.to_s]
102
+ jobs[job.to_s] = collection[job.to_s]
99
103
  else
100
- jobs[job.keys.first.to_s] = generator.job_collection.collection[job.keys.first.to_s]
104
+ jobs[job.keys.first.to_s] = collection[job.keys.first.to_s]
101
105
  end
102
106
  end
103
107
  fail 'No jobs found for pull request' if jobs.empty?
@@ -121,7 +125,7 @@ module JenkinsPipelineBuilder
121
125
  pull_job = nil
122
126
  project_jobs.each do |job|
123
127
  job = job.keys.first if job.is_a? Hash
124
- job = generator.job_collection.collection[job.to_s]
128
+ job = collection[job.to_s]
125
129
 
126
130
  pull_job = job if job[:value][:job_type] == 'pull_request_generator'
127
131
  end
@@ -18,11 +18,7 @@ module JenkinsPipelineBuilder
18
18
  end
19
19
  end
20
20
 
21
- # TODO: Look into remote jobs not working according to sinan
22
-
23
21
  def load(dependencies)
24
- ### Load remote YAML
25
- # Download Tar.gz
26
22
  dependencies.each do |source|
27
23
  source = source[:source]
28
24
  url = source[:url]
@@ -37,13 +33,7 @@ module JenkinsPipelineBuilder
37
33
  end
38
34
 
39
35
  path = File.expand_path(file, Dir.getwd)
40
- # Load templates recursively
41
- unless source[:templates]
42
- logger.info 'No specific template specified'
43
- # Try to load the folder or the pipeline folder
44
- path = File.join(path, 'pipeline') if Dir.entries(path).include? 'pipeline'
45
- return job_collection.load_from_path(path, true)
46
- end
36
+ return load_default_path path unless source[:templates]
47
37
 
48
38
  load_templates(path, source[:templates])
49
39
  end
@@ -51,29 +41,50 @@ module JenkinsPipelineBuilder
51
41
 
52
42
  private
53
43
 
44
+ def load_default_path(path)
45
+ logger.info 'No specific template specified'
46
+ path = File.join(path, 'pipeline') if Dir.entries(path).include? 'pipeline'
47
+ job_collection.load_from_path(path, true)
48
+ end
49
+
54
50
  def load_template(path, template)
55
51
  # If we specify what folder the yaml is in, load that
52
+ path = template_path path, template
53
+
54
+ if File.directory?(path)
55
+ logger.info "Loading from #{path}"
56
+ job_collection.load_from_path(path, true)
57
+ true
58
+ else
59
+ false
60
+ end
61
+ end
62
+
63
+ def highest_template_version(path)
64
+ folders = Dir.entries(path)
65
+ highest = folders.max
66
+ highest = highest unless highest == 0
67
+ highest
68
+ end
69
+
70
+ def use_newest_version?(template, path)
71
+ (template[:version].nil? || template[:version] == 'newest') && File.directory?(path)
72
+ end
73
+
74
+ def template_path(path, template)
56
75
  if template[:folder]
57
76
  path = File.join(path, template[:folder])
58
77
  else
59
78
  path = File.join(path, template[:name]) unless template[:name] == 'default'
60
79
  # If we are looking for the newest version or no version was set
61
- if (template[:version].nil? || template[:version] == 'newest') && File.directory?(path)
62
- folders = Dir.entries(path)
63
- highest = folders.max
64
- template[:version] = highest unless highest == 0
80
+ if use_newest_version? template, path
81
+ template[:version] = highest_template_version path
65
82
  end
66
83
  path = File.join(path, template[:version]) unless template[:version].nil?
67
84
  path = File.join(path, 'pipeline')
68
85
  end
69
86
 
70
- if File.directory?(path)
71
- logger.info "Loading from #{path}"
72
- job_collection.load_from_path(path, true)
73
- true
74
- else
75
- false
76
- end
87
+ path
77
88
  end
78
89
 
79
90
  def download_yaml(url, file, remote_opts = {})
@@ -21,5 +21,5 @@
21
21
  #
22
22
 
23
23
  module JenkinsPipelineBuilder
24
- VERSION = '0.11.0'
24
+ VERSION = '0.11.1'
25
25
  end
@@ -96,6 +96,14 @@ module JenkinsPipelineBuilder
96
96
  end
97
97
 
98
98
  def post_params(params)
99
+ payload = post_payload params
100
+ payload.merge!('filterQueue' => 'on') if params[:filter_queue]
101
+ payload.merge!('filterExecutors' => 'on') if params[:filter_executors]
102
+ payload.merge!('useincluderegex' => 'on', 'includeRegex' => params[:regex]) if params[:regex]
103
+ payload
104
+ end
105
+
106
+ def post_payload(params)
99
107
  statuses = { 'enabled_jobs_only' => '1', 'disabled_jobs_only' => '2' }
100
108
 
101
109
  json = {
@@ -106,36 +114,27 @@ module JenkinsPipelineBuilder
106
114
  'columns' => get_columns(params[:type])
107
115
  }
108
116
  json.merge!('groupingRules' => params[:groupingRules]) if params[:groupingRules]
109
- payload = {
117
+
118
+ {
110
119
  'name' => params[:name],
111
120
  'mode' => get_mode(params[:type]),
112
121
  'description' => params[:description],
113
122
  'statusFilter' => statuses.fetch(params[:status_filter], ''),
114
123
  'json' => json.to_json
115
124
  }
116
- payload.merge!('filterQueue' => 'on') if params[:filter_queue]
117
- payload.merge!('filterExecutors' => 'on') if params[:filter_executors]
118
- payload.merge!('useincluderegex' => 'on', 'includeRegex' => params[:regex]) if params[:regex]
119
- payload
120
125
  end
121
126
 
122
127
  def get_mode(type)
123
- case type
124
- when 'listview'
125
- 'hudson.model.ListView'
126
- when 'myview'
127
- 'hudson.model.MyView'
128
- when 'nestedView'
129
- 'hudson.plugins.nested_view.NestedView'
130
- when 'categorizedView'
131
- 'org.jenkinsci.plugins.categorizedview.CategorizedJobsView'
132
- when 'dashboardView'
133
- 'hudson.plugins.view.dashboard.Dashboard'
134
- when 'multijobView'
135
- 'com.tikal.jenkins.plugins.multijob.views.MultiJobView'
136
- else
137
- fail "Type #{type} is not supported by Jenkins."
138
- end
128
+ types = {
129
+ 'listview' => 'hudson.model.ListView',
130
+ 'myview' => 'hudson.model.MyView',
131
+ 'nestedView' => 'hudson.plugins.nested_view.NestedView',
132
+ 'categorizedView' => 'org.jenkinsci.plugins.categorizedview.CategorizedJobsView',
133
+ 'dashboardView' => 'hudson.plugins.view.dashboard.Dashboard',
134
+ 'multijobView' => 'com.tikal.jenkins.plugins.multijob.views.MultiJobView'
135
+ }
136
+ fail "Type #{type} is not supported by Jenkins." unless types.keys.include? type
137
+ types[type]
139
138
  end
140
139
 
141
140
  # Creates a new empty view of the given type
@@ -139,7 +139,7 @@ describe JenkinsPipelineBuilder::Compiler do
139
139
  it 'fails when value not found' do
140
140
  item = { enabled: '{{use_fail}}', parameters: { rootPom: 'path_to_pomasd' } }
141
141
  settings = { name: 'PushTest', description: 'DB Pipeline tooling', git_repo: 'git@github.roving.com:devops/DBPipeline.git', git_branch: 'master', excluded_user: 'buildmaster', hipchat_room: 'CD Builds', hipchat_auth_token: 'f3e98ed54605b36f56dd2c562e3775', discard_days: '30', discard_number: '100', maven_name: 'tools-maven-3.0.3', hipchat_jenkins_url: 'https://cd-jenkins.ad.prodcc.net/', use1: true }
142
- success, _ = compiler.handle_enable(item, settings)
142
+ success, _item = compiler.handle_enable(item, settings)
143
143
  expect(success).to be false
144
144
  end
145
145
 
@@ -0,0 +1,15 @@
1
+ - defaults:
2
+ name: global
3
+ description: 'Test pipeline for generator_spec.rb'
4
+
5
+ - dependencies:
6
+ - source:
7
+ url: 'spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/jobs.tar.gz'
8
+ templates:
9
+ - name: test_temp
10
+
11
+ - project:
12
+ name: TemplatePipeline_nested
13
+ jobs:
14
+ - '{{name}}-10'
15
+ - '{{name}}-11'
@@ -61,8 +61,7 @@ describe JenkinsPipelineBuilder::Generator do
61
61
 
62
62
  def bootstrap(fixture_path, job_name)
63
63
  JenkinsPipelineBuilder.debug!
64
- errors = @generator.bootstrap(fixture_path, job_name)
65
- errors
64
+ @generator.bootstrap(fixture_path, job_name)
66
65
  end
67
66
 
68
67
  def fixture_path(fixture)
@@ -84,6 +83,11 @@ describe JenkinsPipelineBuilder::Generator do
84
83
  expect(errors).to be_empty
85
84
  end
86
85
 
86
+ it 'produces no errors while creating pipeline TemplatePipeline_nested' do
87
+ errors = bootstrap(fixture_path('template_pipeline_nested'), 'TemplatePipeline_nested')
88
+ expect(errors).to be_empty
89
+ end
90
+
87
91
  it 'loads extensions in remote dependencies' do
88
92
  errors = bootstrap(fixture_path('template_pipeline'), 'TemplatePipeline')
89
93
  expect(errors).to be_empty
@@ -135,7 +135,7 @@ describe JenkinsPipelineBuilder::Job do
135
135
  it 'fails on an unknown type' do
136
136
  job = described_class.new job_type: 'unknonw', name: 'asdf'
137
137
 
138
- success, _ = job.to_xml
138
+ success, _payload = job.to_xml
139
139
  expect(success).to be false
140
140
  end
141
141
  end
@@ -8,7 +8,6 @@ describe JenkinsPipelineBuilder::PullRequest do
8
8
  after :each do
9
9
  JenkinsPipelineBuilder.registry.registry[:job][:scm_params].clear_installed_version
10
10
  end
11
- let(:pull_request_class) { JenkinsPipelineBuilder::PullRequest }
12
11
  let(:project) do
13
12
  {
14
13
  name: 'pull_req_test',
@@ -19,6 +18,7 @@ describe JenkinsPipelineBuilder::PullRequest do
19
18
  }
20
19
  }
21
20
  end
21
+ let(:value) { { jobs: ['{{name}}-10', '{{name}}-11'] } }
22
22
  let(:pull_request) do
23
23
  {
24
24
  name: '{{name}}-00',
@@ -28,15 +28,45 @@ describe JenkinsPipelineBuilder::PullRequest do
28
28
  git_url: 'https://www.github.com/',
29
29
  git_repo: 'jenkins_pipeline_builder',
30
30
  git_org: 'constantcontact',
31
- value: {
32
- jobs: ['{{name}}-10', '{{name}}-11']
33
- },
31
+ value: value,
34
32
  builders: [
35
- { shell_command: 'generate -v || gem install jenkins_pipeline_builder\ngenerate pipeline -c config/{{login_config}} pull_request pipeline/ {{name}}\n' }
33
+ { shell_command: 'echo "shell command"' }
36
34
  ]
37
35
  }
38
36
  end
37
+ let(:job1) { '{{name}}-10' }
38
+ let(:job2) { '{{name}}-11' }
39
39
  let(:jobs) do
40
+ {
41
+ job1 => {
42
+ name: job1,
43
+ type: :'job-template',
44
+ value: {
45
+ name: job1,
46
+ description: '{{description}}',
47
+ publishers: [{ downstream: { project: "{{job@#{job2}}}" } }]
48
+ }
49
+ },
50
+ job2 => {
51
+ name: job2,
52
+ type: :'job-template',
53
+ value: {
54
+ name: job2,
55
+ description: '{{description}}'
56
+ }
57
+ }
58
+ }
59
+ end
60
+ let(:post_scm_params) do
61
+ {
62
+ changelog_to_branch: {
63
+ remote: 'origin',
64
+ branch: 'pr/{{pull_request_number}}/head'
65
+ },
66
+ refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head'
67
+ }
68
+ end
69
+ let(:post_jobs) do
40
70
  {
41
71
  '{{name}}-10' => {
42
72
  name: '{{name}}-10',
@@ -44,7 +74,9 @@ describe JenkinsPipelineBuilder::PullRequest do
44
74
  value: {
45
75
  name: '{{name}}-10',
46
76
  description: '{{description}}',
47
- publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }]
77
+ publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }],
78
+ scm_branch: 'origin/pr/{{pull_request_number}}/head',
79
+ scm_params: post_scm_params
48
80
  }
49
81
  },
50
82
  '{{name}}-11' => {
@@ -52,16 +84,25 @@ describe JenkinsPipelineBuilder::PullRequest do
52
84
  type: :'job-template',
53
85
  value: {
54
86
  name: '{{name}}-11',
55
- description: '{{description}}'
87
+ description: '{{description}}',
88
+ scm_branch: 'origin/pr/{{pull_request_number}}/head',
89
+ scm_params: post_scm_params
56
90
  }
57
91
  }
58
92
  }
59
93
  end
60
94
  describe '#initialize' do
61
95
  it 'process pull_request' do
62
- pull = pull_request_class.new(project, 2, jobs, pull_request)
63
- post_jobs = { '{{name}}-10' => { name: '{{name}}-10', type: :'job-template', value: { name: '{{name}}-10', description: '{{description}}', publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }], scm_branch: 'origin/pr/{{pull_request_number}}/head', scm_params: { changelog_to_branch: { remote: 'origin', branch: 'pr/{{pull_request_number}}/head' }, refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head' } } }, '{{name}}-11' => { name: '{{name}}-11', type: :'job-template', value: { name: '{{name}}-11', description: '{{description}}', scm_branch: 'origin/pr/{{pull_request_number}}/head', scm_params: { changelog_to_branch: { remote: 'origin', branch: 'pr/{{pull_request_number}}/head' }, refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head' } } } }
64
- post_project = { name: 'pull_req_test-PR2', type: :project, value: { name: 'pull_req_test-PR2', jobs: ['{{name}}-00', '{{name}}-10', '{{name}}-11'], pull_request_number: '2' } }
96
+ pull = described_class.new(project, 2, jobs, pull_request)
97
+ post_project = {
98
+ name: 'pull_req_test-PR2',
99
+ type: :project,
100
+ value: {
101
+ name: 'pull_req_test-PR2',
102
+ jobs: ['{{name}}-00', '{{name}}-10', '{{name}}-11'],
103
+ pull_request_number: '2'
104
+ }
105
+ }
65
106
 
66
107
  expect(pull.project).to eq(post_project)
67
108
  expect(pull.jobs).to eq(post_jobs)
@@ -69,12 +110,15 @@ describe JenkinsPipelineBuilder::PullRequest do
69
110
  end
70
111
 
71
112
  describe '#git_version_0' do
113
+ let(:post_scm_params) do
114
+ { refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head' }
115
+ end
116
+
72
117
  before :each do
73
118
  JenkinsPipelineBuilder.registry.registry[:job][:scm_params].installed_version = '0'
74
119
  end
75
120
  it 'process pull_request' do
76
- pull = pull_request_class.new(project, 2, jobs, pull_request)
77
- post_jobs = { '{{name}}-10' => { name: '{{name}}-10', type: :'job-template', value: { name: '{{name}}-10', description: '{{description}}', publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }], scm_branch: 'origin/pr/{{pull_request_number}}/head', scm_params: { refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head' } } }, '{{name}}-11' => { name: '{{name}}-11', type: :'job-template', value: { name: '{{name}}-11', description: '{{description}}', scm_branch: 'origin/pr/{{pull_request_number}}/head', scm_params: { refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head' } } } }
121
+ pull = described_class.new(project, 2, jobs, pull_request)
78
122
  expect(pull.jobs).to eq(post_jobs)
79
123
  end
80
124
  end
@@ -84,8 +128,7 @@ describe JenkinsPipelineBuilder::PullRequest do
84
128
  JenkinsPipelineBuilder.registry.registry[:job][:scm_params].installed_version = '2.0'
85
129
  end
86
130
  it 'process pull_request' do
87
- pull = pull_request_class.new(project, 2, jobs, pull_request)
88
- post_jobs = { '{{name}}-10' => { name: '{{name}}-10', type: :'job-template', value: { name: '{{name}}-10', description: '{{description}}', publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }], scm_branch: 'origin/pr/{{pull_request_number}}/head', scm_params: { refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head', changelog_to_branch: { remote: 'origin', branch: 'pr/{{pull_request_number}}/head' } } } }, '{{name}}-11' => { name: '{{name}}-11', type: :'job-template', value: { name: '{{name}}-11', description: '{{description}}', scm_branch: 'origin/pr/{{pull_request_number}}/head', scm_params: { refspec: 'refs/pull/{{pull_request_number}}/head:refs/remotes/origin/pr/{{pull_request_number}}/head', changelog_to_branch: { remote: 'origin', branch: 'pr/{{pull_request_number}}/head' } } } } }
131
+ pull = described_class.new(project, 2, jobs, pull_request)
89
132
  expect(pull.jobs).to eq(post_jobs)
90
133
  end
91
134
  end
@@ -103,46 +146,16 @@ describe JenkinsPipelineBuilder::PullRequest do
103
146
  }
104
147
  }
105
148
  end
106
- let(:pull_request) do
107
- {
108
- name: '{{name}}-00',
109
- type: :pull_request_generator,
110
- job_type: 'pull_request_generator',
111
- git_url: 'https://www.github.com/',
112
- git_repo: 'jenkins_pipeline_builder',
113
- git_org: 'constantcontact',
114
- value: {
115
- inject_pr_into: :app_name,
116
- jobs: ['{{app_name}}-10', '{{app_name}}-11']
117
- },
118
- builders: [
119
- { shell_command: 'generate -v || gem install jenkins_pipeline_builder\ngenerate pipeline -c config/{{login_config}} pull_request pipeline/ {{name}}\n' }
120
- ]
121
- }
122
- end
123
- let(:jobs) do
149
+ let(:value) do
124
150
  {
125
- '{{app_name}}-10' => {
126
- name: '{{app_name}}-10',
127
- type: :'job-template',
128
- value: {
129
- name: '{{app_name}}-10',
130
- description: '{{description}}',
131
- publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }]
132
- }
133
- },
134
- '{{app_name}}-11' => {
135
- name: '{{app_name}}-11',
136
- type: :'job-template',
137
- value: {
138
- name: '{{app_name}}-11',
139
- description: '{{description}}'
140
- }
141
- }
151
+ inject_pr_into: :app_name,
152
+ jobs: ['{{app_name}}-10', '{{app_name}}-11']
142
153
  }
143
154
  end
155
+ let(:job1) { '{{app_name}}-10' }
156
+ let(:job2) { '{{app_name}}-11' }
144
157
  it 'injects the pr number into the job name when told to' do
145
- pull = pull_request_class.new project, 2, jobs, pull_request
158
+ pull = described_class.new project, 2, jobs, pull_request
146
159
  expect(pull.project[:value][:app_name]).to eq '{{app_name}}-PR2'
147
160
  end
148
161
  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.11.0
4
+ version: 0.11.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Moochnick
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-04-23 00:00:00.000000000 Z
12
+ date: 2015-05-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -295,16 +295,16 @@ dependencies:
295
295
  name: rubocop
296
296
  requirement: !ruby/object:Gem::Requirement
297
297
  requirements:
298
- - - '='
298
+ - - ! '>='
299
299
  - !ruby/object:Gem::Version
300
- version: 0.26.1
300
+ version: '0'
301
301
  type: :development
302
302
  prerelease: false
303
303
  version_requirements: !ruby/object:Gem::Requirement
304
304
  requirements:
305
- - - '='
305
+ - - ! '>='
306
306
  - !ruby/object:Gem::Version
307
- version: 0.26.1
307
+ version: '0'
308
308
  description: ! 'This is a simple and easy-to-use Jenkins Pipeline generator with features
309
309
  focused on
310
310
 
@@ -406,6 +406,8 @@ files:
406
406
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/sample_pipeline/view.yaml
407
407
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline/jobs.tar.gz
408
408
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline/project.yaml
409
+ - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/jobs.tar.gz
410
+ - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/project.yaml
409
411
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/project.json
410
412
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/view.yaml
411
413
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_job.xml
@@ -482,6 +484,8 @@ test_files:
482
484
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/sample_pipeline/view.yaml
483
485
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline/jobs.tar.gz
484
486
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline/project.yaml
487
+ - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/jobs.tar.gz
488
+ - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/project.yaml
485
489
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/project.json
486
490
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/view.yaml
487
491
  - spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_job.xml