jenkins_pipeline_builder 0.5.1 → 0.5.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 07be75a38a219e527c74b522aba4798a01b41433
4
- data.tar.gz: 296de68ba768f231001b279641c4baa28d971e30
3
+ metadata.gz: a1e9094c74dee6457c8b9feb1f72c386bec441a6
4
+ data.tar.gz: 3f9f57f5be8a20d1ed0ca2c0f988c99d827a05b9
5
5
  SHA512:
6
- metadata.gz: d38d2dce1fb6bc2060f1de5d798cbaad0b87afdfd851ebf0367a39fca69d6cfc0e7f01f6b6d4e2f64a2aa5f477ef843677af2dcc94f86630862c9f24db92af8f
7
- data.tar.gz: b957a87d0ea5fe5ec70f3470114362a0802896d224906b5a37bb959c6d58eafe1e53a1cc82082fad38994c181778c4d09fb2a7e9697f90e1e9679d16a2f3ab45
6
+ metadata.gz: 5b8af333e06b4ccba511bb2f268081547b5208dcdffce6f1a3cdd14b6815e813e12f10b98071a95ac7ea4770522acf1f70e34e931ac3a051806fedb9a33a180c
7
+ data.tar.gz: 55148fc5a1bb693af47ffc1f47f805195cce2ca6222dbeb5cf3c55b61eb592cb3304b3d4cae882da02dba4fb929846cd3e981074b57208f0f12868c871bec6b1
@@ -47,6 +47,9 @@ Style/CyclomaticComplexity:
47
47
  Style/Documentation:
48
48
  Enabled: false
49
49
 
50
+ Style/AccessModifierIndentation:
51
+ Enabled: false
52
+
50
53
  #######
51
54
  # We actually want these off
52
55
 
data/Rakefile CHANGED
@@ -69,4 +69,4 @@ namespace :doc do
69
69
  end
70
70
  end
71
71
 
72
- task default: [:unit_tests, :rubocop]
72
+ task default: [:spec, :rubocop]
@@ -20,23 +20,49 @@
20
20
  # THE SOFTWARE.
21
21
  #
22
22
 
23
+ require 'active_support'
24
+ require 'active_support/core_ext'
25
+
23
26
  require 'jenkins_pipeline_builder/version'
24
27
  require 'jenkins_pipeline_builder/utils'
25
28
  require 'jenkins_pipeline_builder/xml_helper'
29
+ require 'jenkins_pipeline_builder/extendable'
26
30
  require 'jenkins_pipeline_builder/compiler'
27
- require 'jenkins_pipeline_builder/job_builder'
28
31
  require 'jenkins_pipeline_builder/module_registry'
29
- require 'jenkins_pipeline_builder/builders'
30
- require 'jenkins_pipeline_builder/wrappers'
31
- require 'jenkins_pipeline_builder/triggers'
32
- require 'jenkins_pipeline_builder/publishers'
33
32
  require 'jenkins_pipeline_builder/pull_request'
34
33
  require 'jenkins_pipeline_builder/view'
35
34
  require 'jenkins_pipeline_builder/generator'
36
35
 
36
+ module JenkinsPipelineBuilder
37
+ class << self
38
+ attr_reader :client, :credentials
39
+ def generator
40
+ @_generator ||= Generator.new
41
+ end
42
+
43
+ def credentials=(creds)
44
+ @credentials = creds
45
+ @client =
46
+ @_client = JenkinsApi::Client.new(credentials)
47
+ generator.logger = @_client.logger
48
+ @credentials
49
+ end
50
+
51
+ def registry
52
+ generator.module_registry
53
+ end
54
+ end
55
+ end
56
+ JenkinsPipelineBuilder.generator
57
+ require 'jenkins_pipeline_builder/builders'
58
+ require 'jenkins_pipeline_builder/job_builder'
59
+ require 'jenkins_pipeline_builder/wrappers'
60
+ require 'jenkins_pipeline_builder/publishers'
61
+ require 'jenkins_pipeline_builder/triggers'
62
+
37
63
  require 'jenkins_pipeline_builder/cli/helper'
38
64
  require 'jenkins_pipeline_builder/cli/view'
39
65
  require 'jenkins_pipeline_builder/cli/pipeline'
66
+ require 'jenkins_pipeline_builder/cli/list'
67
+ require 'jenkins_pipeline_builder/cli/describe'
40
68
  require 'jenkins_pipeline_builder/cli/base'
41
- require 'active_support'
42
- require 'active_support/core_ext'
@@ -21,8 +21,8 @@
21
21
  #
22
22
 
23
23
  module JenkinsPipelineBuilder
24
- class Builders
25
- def self.build_multijob(params, xml)
24
+ class Builders < Extendable
25
+ register :multi_job do |params, xml|
26
26
  params[:phases].each do |name, content|
27
27
  xml.send('com.tikal.jenkins.plugins.multijob.MultiJobBuilder') do
28
28
  xml.phaseName name
@@ -49,7 +49,7 @@ module JenkinsPipelineBuilder
49
49
  end
50
50
  end
51
51
 
52
- def self.build_maven3(params, xml)
52
+ register :maven3 do |params, xml|
53
53
  xml.send('org.jfrog.hudson.maven3.Maven3Builder') do
54
54
  xml.mavenName params[:mavenName] || 'tools-maven-3.0.3'
55
55
  xml.rootPom params[:rootPom]
@@ -58,13 +58,13 @@ module JenkinsPipelineBuilder
58
58
  end
59
59
  end
60
60
 
61
- def self.build_shell_command(param, xml)
61
+ register :shell_command do |param, xml|
62
62
  xml.send('hudson.tasks.Shell') do
63
63
  xml.command param
64
64
  end
65
65
  end
66
66
 
67
- def self.build_environment_vars_injector(params, xml)
67
+ register :inject_vars_file do |params, xml|
68
68
  xml.EnvInjectBuilder do
69
69
  xml.info do
70
70
  xml.propertiesFilePath params
@@ -72,7 +72,7 @@ module JenkinsPipelineBuilder
72
72
  end
73
73
  end
74
74
 
75
- def self.blocking_downstream(params, xml)
75
+ register :blocking_downstream do |params, xml|
76
76
  colors = { 'SUCCESS' => { ordinal: 0, color: 'BLUE' }, 'FAILURE' => { ordinal: 2, color: 'RED' }, 'UNSTABLE' => { ordinal: 1, color: 'YELLOW' } }
77
77
  xml.send('hudson.plugins.parameterizedtrigger.TriggerBuilder', 'plugin' => 'parameterized-trigger') do
78
78
  xml.configs do
@@ -129,7 +129,7 @@ module JenkinsPipelineBuilder
129
129
  end
130
130
  end
131
131
 
132
- def self.start_remote_job(params, xml)
132
+ register :remote_job do |params, xml|
133
133
  parameters = params[:parameters][:content].split("\n") if params[:parameters] && params[:parameters][:content]
134
134
  xml.send('org.jenkinsci.plugins.ParameterizedRemoteTrigger.RemoteBuildConfiguration', 'plugin' => 'Parameterized-Remote-Trigger') do
135
135
  xml.remoteJenkinsName params[:server]
@@ -171,7 +171,7 @@ module JenkinsPipelineBuilder
171
171
  end
172
172
  end
173
173
 
174
- def self.build_copy_artifact(params, xml)
174
+ register :copy_artifact do |params, xml|
175
175
  xml.send('hudson.plugins.copyartifact.CopyArtifact', 'plugin' => 'copyartifact') do
176
176
  xml.project params[:project]
177
177
  xml.filter params[:artifacts]
@@ -41,21 +41,17 @@ module JenkinsPipelineBuilder
41
41
  puts JenkinsPipelineBuilder::VERSION
42
42
  end
43
43
 
44
- # Register the CLI::Pipeline class as 'pipeline' subcommand to CLI
45
- register(
46
- CLI::Pipeline,
47
- 'pipeline',
48
- 'pipeline [subcommand]',
49
- 'Provides functions to access pipeline functions of the Jenkins CI server'
50
- )
51
-
52
- # Register the CLI::Job class as 'view' subcommand to CLI
53
- register(
54
- CLI::View,
55
- 'view',
56
- 'view [subcommand]',
57
- 'Provides functions to access view interface of Jenkins CI server'
58
- )
44
+ desc 'pipeline [subcommand]', 'Provides functions to access pipeline functions of the Jenkins CI server'
45
+ subcommand 'pipeline', CLI::Pipeline
46
+
47
+ desc 'view [subcommand]', 'Provides functions to access view interface of Jenkins CI server'
48
+ subcommand 'view', CLI::View
49
+
50
+ desc 'list [type]', 'Lists all registered modules of a type'
51
+ subcommand 'list', List
52
+
53
+ desc 'describe [type]', 'Describe a module'
54
+ subcommand 'describe', Describe
59
55
  end
60
56
  end
61
57
  end
@@ -0,0 +1,55 @@
1
+ #
2
+ # Copyright (c) 2014 Constant Contact
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+
23
+ module JenkinsPipelineBuilder
24
+ module CLI
25
+ JenkinsPipelineBuilder.registry.entries.each do |entry, _path|
26
+ klass_name = entry.to_s.classify
27
+ klass = Class.new(Thor) do
28
+
29
+ modules = JenkinsPipelineBuilder.registry.registered_modules[entry]
30
+ modules.each do |mod, values|
31
+ desc mod, "Details for #{mod}"
32
+ define_method(mod) do
33
+ display_module(mod, values)
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def display_module(mod, values)
40
+ puts "#{mod}: #{values[:description]}"
41
+ end
42
+ end
43
+ Module.const_set(klass_name, klass)
44
+ end
45
+ class Describe < Thor
46
+ JenkinsPipelineBuilder.registry.entries.each do |entry, _path|
47
+ klass_name = entry.to_s.classify
48
+ singular_model = entry.to_s.singularize
49
+
50
+ desc "#{singular_model} [module]", 'Shows details for the named module'
51
+ subcommand singular_model, Module.const_get(klass_name)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -56,8 +56,8 @@ module JenkinsPipelineBuilder
56
56
  exit 1
57
57
  end
58
58
 
59
- client = JenkinsApi::Client.new(creds)
60
- generator = JenkinsPipelineBuilder::Generator.new(client)
59
+ JenkinsPipelineBuilder.credentials = creds
60
+ generator = JenkinsPipelineBuilder.generator
61
61
  generator.debug = options[:debug]
62
62
  generator
63
63
  end
@@ -0,0 +1,47 @@
1
+ #
2
+ # Copyright (c) 2014 Constant Contact
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+
23
+ module JenkinsPipelineBuilder
24
+ module CLI
25
+ class List < Thor
26
+ JenkinsPipelineBuilder.registry.entries.each do |entry, _path|
27
+ desc entry, "List all #{entry}"
28
+ define_method(entry) do
29
+ modules = JenkinsPipelineBuilder.registry.registered_modules[entry]
30
+ modules.each { |mod, values| display_module(mod, values) }
31
+ end
32
+ end
33
+
34
+ desc 'job_attributes', 'List all job attributes'
35
+ def job_attributes
36
+ modules = JenkinsPipelineBuilder.registry.registered_modules[:job_attributes]
37
+ modules.each { |mod, values| display_module(mod, values) }
38
+ end
39
+
40
+ private
41
+
42
+ def display_module(mod, values)
43
+ puts "#{mod}: Jenkins Name: #{values[:jenkins_name]}"
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,42 @@
1
+ #
2
+ # Copyright (c) 2014 Constant Contact
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+
23
+ module JenkinsPipelineBuilder
24
+ class Extendable
25
+ def self.register(name, jenkins_name: 'No jenkins display name provided', description: 'No description provided', &block)
26
+ registry = JenkinsPipelineBuilder.registry
27
+ registry.send(class_to_registry_method(to_s), name, jenkins_name, description, &block)
28
+ end
29
+
30
+ def self.class_to_registry_method(name)
31
+ h = {
32
+ 'JenkinsPipelineBuilder::JobBuilder' => :register_job_attribute,
33
+ 'JenkinsPipelineBuilder::Builders' => :register_builder,
34
+ 'JenkinsPipelineBuilder::Publishers' => :register_publisher,
35
+ 'JenkinsPipelineBuilder::Wrappers' => :register_wrapper,
36
+ 'JenkinsPipelineBuilder::Triggers' => :register_trigger
37
+ }
38
+ fail "Unknown class #{name} when adding an extension. Known classes are #{h.keys.join ', '}" unless h.key?(name)
39
+ h[name]
40
+ end
41
+ end
42
+ end
@@ -35,80 +35,12 @@ module JenkinsPipelineBuilder
35
35
  #
36
36
  # @raise [ArgumentError] when required options are not provided.
37
37
  #
38
- def initialize(client)
39
- @client = client
40
- @logger = @client.logger
41
- # @logger.level = (@debug) ? Logger::DEBUG : Logger::INFO;
38
+ def initialize
42
39
  @job_templates = {}
43
40
  @job_collection = {}
44
41
  @extensions = {}
45
42
  @remote_depends = {}
46
-
47
- @module_registry = ModuleRegistry.new(
48
- job: {
49
- description: JobBuilder.method(:change_description),
50
- scm_params: JobBuilder.method(:apply_scm_params),
51
- hipchat: JobBuilder.method(:hipchat_notifier),
52
- parameters: JobBuilder.method(:build_parameters),
53
- priority: JobBuilder.method(:use_specific_priority),
54
- discard_old: JobBuilder.method(:discard_old_param),
55
- throttle: JobBuilder.method(:throttle_job),
56
- prepare_environment: JobBuilder.method(:prepare_environment),
57
- concurrent_build: JobBuilder.method(:concurrent_build),
58
- builders: {
59
- registry: {
60
- multi_job: Builders.method(:build_multijob),
61
- inject_vars_file: Builders.method(:build_environment_vars_injector),
62
- shell_command: Builders.method(:build_shell_command),
63
- maven3: Builders.method(:build_maven3),
64
- blocking_downstream: Builders.method(:blocking_downstream),
65
- remote_job: Builders.method(:start_remote_job),
66
- copy_artifact: Builders.method(:build_copy_artifact)
67
- },
68
- method:
69
- ->(registry, params, n_xml) { @module_registry.run_registry_on_path('//builders', registry, params, n_xml) }
70
- },
71
- publishers: {
72
- registry: {
73
- git: Publishers.method(:push_to_git),
74
- hipchat: Publishers.method(:push_to_hipchat),
75
- description_setter: Publishers.method(:description_setter),
76
- downstream: Publishers.method(:push_to_projects),
77
- junit_result: Publishers.method(:publish_junit),
78
- coverage_result: Publishers.method(:publish_rcov),
79
- post_build_script: Publishers.method(:post_build_script),
80
- groovy_postbuild: Publishers.method(:groovy_postbuild),
81
- archive_artifact: Publishers.method(:archive_artifact)
82
- },
83
- method:
84
- ->(registry, params, n_xml) { @module_registry.run_registry_on_path('//publishers', registry, params, n_xml) }
85
- },
86
- wrappers: {
87
- registry: {
88
- timestamp: Wrappers.method(:console_timestamp),
89
- ansicolor: Wrappers.method(:ansicolor),
90
- artifactory: Wrappers.method(:publish_to_artifactory),
91
- rvm: Wrappers.method(:run_with_rvm),
92
- rvm05: Wrappers.method(:run_with_rvm05),
93
- inject_env_var: Wrappers.method(:inject_env_vars),
94
- inject_passwords: Wrappers.method(:inject_passwords),
95
- maven3artifactory: Wrappers.method(:artifactory_maven3_configurator)
96
- },
97
- method:
98
- ->(registry, params, n_xml) { @module_registry.run_registry_on_path('//buildWrappers', registry, params, n_xml) }
99
- },
100
- triggers: {
101
- registry: {
102
- git_push: Triggers.method(:enable_git_push),
103
- scm_polling: Triggers.method(:enable_scm_polling),
104
- periodic_build: Triggers.method(:enable_periodic_build),
105
- upstream: Triggers.method(:enable_upstream_check)
106
- },
107
- method:
108
- ->(registry, params, n_xml) { @module_registry.run_registry_on_path('//triggers', registry, params, n_xml) }
109
- }
110
- }
111
- )
43
+ @module_registry = ModuleRegistry.new
112
44
  end
113
45
 
114
46
  def load_extensions(path)
@@ -148,10 +80,12 @@ module JenkinsPipelineBuilder
148
80
  @logger.level = (value) ? Logger::DEBUG : Logger::INFO
149
81
  end
150
82
 
83
+ def client
84
+ JenkinsPipelineBuilder.client
85
+ end
86
+
151
87
  attr_reader :debug
152
- attr_accessor :client
153
- attr_accessor :no_files
154
- attr_accessor :job_collection
88
+ attr_accessor :no_files, :job_collection, :logger, :module_registry
155
89
 
156
90
  # Creates an instance to the View class by passing a reference to self
157
91
  #
@@ -191,9 +125,9 @@ module JenkinsPipelineBuilder
191
125
  value = section[key]
192
126
  if key == :dependencies
193
127
  @logger.info 'Resolving Dependencies for remote project'
194
- return load_remote_yaml(value)
128
+ load_remote_yaml(value)
129
+ next
195
130
  end
196
-
197
131
  name = value[:name]
198
132
  if @job_collection.key?(name)
199
133
  if remote
@@ -275,11 +209,11 @@ module JenkinsPipelineBuilder
275
209
  return load_collection_from_path(path)
276
210
  end
277
211
 
278
- load_templates(source[:templates])
212
+ load_templates(path, source[:templates])
279
213
  end
280
214
  end
281
215
 
282
- def load_templates(templates)
216
+ def load_templates(path, templates)
283
217
  templates.each do |template|
284
218
  version = template[:version] || 'newest'
285
219
  @logger.info "Loading #{template[:name]} at version #{version}"
@@ -355,7 +289,6 @@ module JenkinsPipelineBuilder
355
289
  def resolve_project(project)
356
290
  defaults = get_item('global')
357
291
  settings = defaults.nil? ? {} : defaults[:value] || {}
358
-
359
292
  project[:settings] = Compiler.get_settings_bag(project, settings) unless project[:settings]
360
293
  project_body = project[:value]
361
294
 
@@ -363,7 +296,7 @@ module JenkinsPipelineBuilder
363
296
  @logger.info project
364
297
  process_job_changes(jobs)
365
298
  errors = process_jobs(jobs, project)
366
- errors = process_view(project_body[:views], project, errors) if project_body[:views]
299
+ errors = process_views(project_body[:views], project, errors) if project_body[:views]
367
300
 
368
301
  errors.each do |k, v|
369
302
  puts "Encountered errors processing: #{k}:"
@@ -404,7 +337,7 @@ module JenkinsPipelineBuilder
404
337
 
405
338
  def publish_project(project_name, errors = {})
406
339
  projects.each do |project|
407
- next if project_name && project[:name] == project_name
340
+ next unless project_name.nil? || project[:name] == project_name
408
341
  success, payload = resolve_project(project)
409
342
  if success
410
343
  puts 'successfully resolved project'
@@ -445,6 +378,7 @@ module JenkinsPipelineBuilder
445
378
  def bootstrap(path, project_name)
446
379
  @logger.info "Bootstrapping pipeline from path #{path}"
447
380
  load_collection_from_path(path)
381
+ @logger.info @job_collection
448
382
  cleanup_temp_remote
449
383
  load_extensions(path)
450
384
  errors = {}
@@ -466,6 +400,7 @@ module JenkinsPipelineBuilder
466
400
  cleanup_temp_remote
467
401
  load_extensions(path)
468
402
  jobs = {}
403
+ @logger.info "Project: #{projects}"
469
404
  projects.each do |project|
470
405
  if project[:name] == project_name || project_name.nil?
471
406
  project_body = project[:value]
@@ -473,6 +408,7 @@ module JenkinsPipelineBuilder
473
408
  @logger.info "Using Project #{project}"
474
409
  pull_job = nil
475
410
  project_jobs.each do |job|
411
+ job = job.keys.first if job.is_a? Hash
476
412
  job = @job_collection[job.to_s]
477
413
  pull_job = job if job[:value][:job_type] == 'pull_request_generator'
478
414
  end
@@ -482,11 +418,27 @@ module JenkinsPipelineBuilder
482
418
  if job.is_a? String
483
419
  jobs[job.to_s] = @job_collection[job.to_s]
484
420
  else
485
- jobs[job.keys[0].to_s] = @job_collection[job.keys[0].to_s]
421
+ jobs[job.keys.first.to_s] = @job_collection[job.keys.first.to_s]
422
+ end
423
+ end
424
+ pull = JenkinsPipelineBuilder::PullRequestGenerator.new(project, jobs, pull_job)
425
+ # Build the jobs
426
+ @job_collection.merge! pull.jobs
427
+ pull.create.each do |project|
428
+ success, compiled_project = resolve_project(project)
429
+ compiled_project[:value][:jobs].each do |i|
430
+ job = i[:result]
431
+ success, payload = compile_job_to_xml(job)
432
+ create_or_update(job, payload) if success
433
+ end
434
+ end
435
+ # Purge old jobs
436
+ pull.purge.each do |job|
437
+ jobs = @client.job.list "#{job}.*"
438
+ jobs.each do |job|
439
+ @client.job.delete job
486
440
  end
487
441
  end
488
- pull = JenkinsPipelineBuilder::PullRequestGenerator.new(self)
489
- pull.run(project, jobs, pull_job)
490
442
  end
491
443
  end
492
444
  end
@@ -494,7 +446,7 @@ module JenkinsPipelineBuilder
494
446
  def dump(job_name)
495
447
  @logger.info "Debug #{@debug}"
496
448
  @logger.info "Dumping #{job_name} into #{job_name}.xml"
497
- xml = @client.job.get_config(job_name)
449
+ xml = client.job.get_config(job_name)
498
450
  File.open(job_name + '.xml', 'w') { |f| f.write xml }
499
451
  end
500
452
 
@@ -507,10 +459,10 @@ module JenkinsPipelineBuilder
507
459
  return
508
460
  end
509
461
 
510
- if @client.job.exists?(job_name)
511
- @client.job.update(job_name, xml)
462
+ if client.job.exists?(job_name)
463
+ client.job.update(job_name, xml)
512
464
  else
513
- @client.job.create(job_name, xml)
465
+ client.job.create(job_name, xml)
514
466
  end
515
467
  end
516
468
 
@@ -556,7 +508,7 @@ module JenkinsPipelineBuilder
556
508
  puts "Template merged: #{template}"
557
509
  end
558
510
 
559
- xml = @client.job.build_freestyle_config(params)
511
+ xml = client.job.build_freestyle_config(params)
560
512
  n_xml = Nokogiri::XML(xml)
561
513
 
562
514
  @module_registry.traverse_registry_path('job', params, n_xml)
@@ -586,7 +538,7 @@ module JenkinsPipelineBuilder
586
538
  def generate_job_dsl_body(params)
587
539
  @logger.info 'Generating pipeline'
588
540
 
589
- xml = @client.job.build_freestyle_config(params)
541
+ xml = client.job.build_freestyle_config(params)
590
542
 
591
543
  n_xml = Nokogiri::XML(xml)
592
544
  if n_xml.xpath('//javaposse.jobdsl.plugin.ExecuteDslScripts').empty?
@@ -21,13 +21,13 @@
21
21
  #
22
22
 
23
23
  module JenkinsPipelineBuilder
24
- class JobBuilder
25
- def self.change_description(description, n_xml)
24
+ class JobBuilder < Extendable
25
+ register :description do |description, n_xml|
26
26
  desc = n_xml.xpath('//description').first
27
27
  desc.content = "#{description}"
28
28
  end
29
29
 
30
- def self.apply_scm_params(params, n_xml)
30
+ register :scm_params do |params, n_xml|
31
31
  XmlHelper.update_node_text(n_xml, '//scm/localBranch', params[:local_branch]) if params[:local_branch]
32
32
  XmlHelper.update_node_text(n_xml, '//scm/recursiveSubmodules', params[:recursive_update]) if params[:recursive_update]
33
33
  XmlHelper.update_node_text(n_xml, '//scm/wipeOutWorkspace', params[:wipe_workspace]) if params[:wipe_workspace]
@@ -39,7 +39,7 @@ module JenkinsPipelineBuilder
39
39
  XmlHelper.update_node_text(n_xml, '//scm/includedRegions', params[:included_regions]) if params[:included_regions]
40
40
  end
41
41
 
42
- def self.hipchat_notifier(params, n_xml)
42
+ register :hipchat do |params, n_xml|
43
43
  fail 'No HipChat room specified' unless params[:room]
44
44
 
45
45
  properties = n_xml.xpath('//properties').first
@@ -51,7 +51,7 @@ module JenkinsPipelineBuilder
51
51
  end
52
52
  end
53
53
 
54
- def self.use_specific_priority(params, n_xml)
54
+ register :priority do |params, n_xml|
55
55
  n_builders = n_xml.xpath('//properties').first
56
56
  Nokogiri::XML::Builder.with(n_builders) do |xml|
57
57
  xml.send('jenkins.advancedqueue.AdvancedQueueSorterJobProperty', 'plugin' => 'PrioritySorter') do
@@ -61,7 +61,7 @@ module JenkinsPipelineBuilder
61
61
  end
62
62
  end
63
63
 
64
- def self.build_parameters(params, n_xml)
64
+ register :parameters do |params, n_xml|
65
65
  n_builders = n_xml.xpath('//properties').first
66
66
  Nokogiri::XML::Builder.with(n_builders) do |xml|
67
67
  xml.send('hudson.model.ParametersDefinitionProperty') do
@@ -105,7 +105,7 @@ module JenkinsPipelineBuilder
105
105
  end
106
106
  end
107
107
 
108
- def self.discard_old_param(params, n_xml)
108
+ register :discard_old do |params, n_xml|
109
109
  properties = n_xml.child
110
110
  Nokogiri::XML::Builder.with(properties) do |xml|
111
111
  xml.send('logRotator', 'class' => 'hudson.tasks.LogRotator') do
@@ -117,7 +117,7 @@ module JenkinsPipelineBuilder
117
117
  end
118
118
  end
119
119
 
120
- def self.throttle_job(params, n_xml)
120
+ register :throttle do |params, n_xml|
121
121
  properties = n_xml.xpath('//properties').first
122
122
  cat_set = params[:option] == 'category'
123
123
  Nokogiri::XML::Builder.with(properties) do |xml|
@@ -133,7 +133,7 @@ module JenkinsPipelineBuilder
133
133
  end
134
134
  end
135
135
 
136
- def self.prepare_environment(params, n_xml)
136
+ register :prepare_environment do |params, n_xml|
137
137
  properties = n_xml.xpath('//properties').first
138
138
  Nokogiri::XML::Builder.with(properties) do |xml|
139
139
  xml.send('EnvInjectJobProperty') do
@@ -148,7 +148,7 @@ module JenkinsPipelineBuilder
148
148
  end
149
149
  end
150
150
 
151
- def self.concurrent_build(params, n_xml)
151
+ register :concurrent_build do |params, n_xml|
152
152
  concurrentBuild = n_xml.xpath('//concurrentBuild').first
153
153
  concurrentBuild.content = (params == true) ? 'true' : 'false'
154
154
  end
@@ -22,10 +22,50 @@
22
22
 
23
23
  module JenkinsPipelineBuilder
24
24
  class ModuleRegistry
25
- attr_accessor :registry
25
+ attr_accessor :registry, :registered_modules
26
+ ENTRIES = {
27
+ builders: '//builders',
28
+ publishers: '//publishers',
29
+ wrappers: '//buildWrappers',
30
+ triggers: '//triggers'
31
+ }
26
32
 
27
- def initialize(registry)
28
- @registry = registry
33
+ # creates register_triggers and so on
34
+ # we declare job attribues below since it doesn't follow the pattern
35
+ ENTRIES.keys.each do |key|
36
+ # TODO: Too lazy to figure out a better way to do this
37
+ singular_key = key.to_s.singularize.to_sym
38
+ define_method "register_#{singular_key}" do |name, jenkins_name, description, &block|
39
+ @registered_modules[key][name] = {
40
+ jenkins_name: jenkins_name,
41
+ description: description
42
+ }
43
+ @registry[:job][key][:registry][name] = block
44
+ end
45
+ end
46
+
47
+ def initialize
48
+ @registry = { job: {} }
49
+ @registered_modules = { job_attributes: {} }
50
+
51
+ entries.each do |key, value|
52
+ @registered_modules[key] = {}
53
+ @registry[:job][key] = {}
54
+ @registry[:job][key][:registry] = {}
55
+ @registry[:job][key][:method] = ->(registry, params, n_xml) { run_registry_on_path(value, registry, params, n_xml) }
56
+ end
57
+ end
58
+
59
+ def entries
60
+ ENTRIES
61
+ end
62
+
63
+ def register_job_attribute(name, jenkins_name, description, &block)
64
+ @registered_modules[:job_attributes][name] = {
65
+ jenkins_name: jenkins_name,
66
+ description: description
67
+ }
68
+ @registry[:job][name] = block
29
69
  end
30
70
 
31
71
  def get(path)
@@ -21,8 +21,8 @@
21
21
  #
22
22
 
23
23
  module JenkinsPipelineBuilder
24
- class Publishers
25
- def self.description_setter(params, xml)
24
+ class Publishers < Extendable
25
+ register :description_setter do |params, xml|
26
26
  xml.send('hudson.plugins.descriptionsetter.DescriptionSetterPublisher') do
27
27
  xml.regexp params[:regexp]
28
28
  xml.regexpForFailed params[:regexp]
@@ -32,7 +32,7 @@ module JenkinsPipelineBuilder
32
32
  end
33
33
  end
34
34
 
35
- def self.push_to_projects(params, xml)
35
+ register :downstream do |params, xml|
36
36
  xml.send('hudson.plugins.parameterizedtrigger.BuildTrigger') do
37
37
  xml.configs do
38
38
  xml.send('hudson.plugins.parameterizedtrigger.BuildTriggerConfig') do
@@ -60,7 +60,7 @@ module JenkinsPipelineBuilder
60
60
  end
61
61
  end
62
62
 
63
- def self.push_to_hipchat(params, xml)
63
+ register :hipchat do |params, xml|
64
64
  params = {} if params == true
65
65
  xml.send('jenkins.plugins.hipchat.HipChatNotifier') do
66
66
  xml.jenkinsUrl params[:jenkinsUrl] || ''
@@ -69,7 +69,7 @@ module JenkinsPipelineBuilder
69
69
  end
70
70
  end
71
71
 
72
- def self.push_to_git(params, xml)
72
+ register :git do |params, xml|
73
73
  xml.send('hudson.plugins.git.GitPublisher') do
74
74
  xml.configVersion params[:configVersion] || 2
75
75
  xml.pushMerge params[:'push-merge'] || false
@@ -83,7 +83,7 @@ module JenkinsPipelineBuilder
83
83
  end
84
84
  end
85
85
 
86
- def self.publish_junit(params, xml)
86
+ register :junit_result do |params, xml|
87
87
  xml.send('hudson.tasks.junit.JUnitResultArchiver') do
88
88
  xml.testResults params[:test_results] || ''
89
89
  xml.keepLongStdio false
@@ -91,16 +91,7 @@ module JenkinsPipelineBuilder
91
91
  end
92
92
  end
93
93
 
94
- def self.coverage_metric(name, params, xml)
95
- xml.send('hudson.plugins.rubyMetrics.rcov.model.MetricTarget') do
96
- xml.metric name
97
- xml.healthy params[:healthy]
98
- xml.unhealthy params[:unhealthy]
99
- xml.unstable params[:unstable]
100
- end
101
- end
102
-
103
- def self.publish_rcov(params, xml)
94
+ register :coverage_result do |params, xml|
104
95
  xml.send('hudson.plugins.rubyMetrics.rcov.RcovPublisher') do
105
96
  xml.reportDir params[:report_dir]
106
97
  xml.targets do
@@ -110,7 +101,7 @@ module JenkinsPipelineBuilder
110
101
  end
111
102
  end
112
103
 
113
- def self.post_build_script(params, xml)
104
+ register :post_build_script do |params, xml|
114
105
  xml.send('org.jenkinsci.plugins.postbuildscript.PostBuildScript') do
115
106
  xml.buildSteps do
116
107
  if params[:shell_command]
@@ -125,7 +116,7 @@ module JenkinsPipelineBuilder
125
116
  end
126
117
  end
127
118
 
128
- def self.groovy_postbuild(params, xml)
119
+ register :groovy_postbuild do |params, xml|
129
120
  xml.send('org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder', 'plugin' => 'groovy-postbuild') do
130
121
  xml.groovyScript params[:groovy_script]
131
122
  xml.behavior params[:behavior] || '0'
@@ -140,7 +131,7 @@ module JenkinsPipelineBuilder
140
131
  end
141
132
  end
142
133
 
143
- def self.archive_artifact(params, xml)
134
+ register :archive_artifact do |params, xml|
144
135
  xml.send('hudson.tasks.ArtifactArchiver') do
145
136
  xml.artifacts params[:artifacts]
146
137
  xml.excludes params[:excludes] if params[:excludes]
@@ -148,5 +139,14 @@ module JenkinsPipelineBuilder
148
139
  xml.allowEmptyArchive params[:allow_empty] || false
149
140
  end
150
141
  end
142
+
143
+ def self.coverage_metric(name, params, xml)
144
+ xml.send('hudson.plugins.rubyMetrics.rcov.model.MetricTarget') do
145
+ xml.metric name
146
+ xml.healthy params[:healthy]
147
+ xml.unhealthy params[:unhealthy]
148
+ xml.unstable params[:unstable]
149
+ end
150
+ end
151
151
  end
152
152
  end
@@ -22,18 +22,31 @@
22
22
 
23
23
  module JenkinsPipelineBuilder
24
24
  class PullRequestGenerator
25
- # Initializes a new View object.
26
- #
27
- # @param generator [Generator] the client object
28
- #
29
- # @return [View] the view object
30
- #
31
- def initialize(generator)
32
- @generator = generator
33
- @client = generator.client
34
- @logger = @client.logger
25
+ attr_reader :purge
26
+ attr_reader :create
27
+ attr_reader :jobs
28
+
29
+ def initialize(project, job_collection, generator_job)
30
+ @purge = []
31
+ @create = []
32
+ @jobs = {}
33
+
34
+ pull_requests = check_for_pull generator_job[:value]
35
+ purge_old(pull_requests, project)
36
+ pull_requests.each do |number|
37
+ # Manipulate the YAML
38
+ req = JenkinsPipelineBuilder::PullRequest.new(project, number, job_collection, generator_job)
39
+ @jobs.merge! req.jobs
40
+ project_t = req.project
41
+
42
+ # Overwrite the jobs from the generator to the project
43
+ project_t[:value][:jobs] = generator_job[:value][:jobs]
44
+ @create << project_t
45
+ end
35
46
  end
36
47
 
48
+ private
49
+
37
50
  # Check for Github Pull Requests
38
51
  #
39
52
  # args[:git_url] URL to the github main page ex. https://www.github.com/
@@ -54,49 +67,16 @@ module JenkinsPipelineBuilder
54
67
  # Purge old builds
55
68
  def purge_old(pull_requests, project)
56
69
  reqs = pull_requests.clone.map { |req| "#{project[:name]}-PR#{req}" }
57
- @logger.info "Current pull requests: #{reqs}"
58
70
  # Read File
59
71
  old_requests = File.new('pull_requests.csv', 'a+').read.split(',')
60
72
 
61
73
  # Pop off current pull requests
62
74
  old_requests.delete_if { |req| reqs.include?("#{req}") }
75
+ @purge = old_requests
63
76
 
64
- # Delete the old requests from jenkins
65
- @logger.info "Purging old requests: #{old_requests}"
66
- old_requests.each do |req|
67
- jobs = @client.job.list "#{req}.*"
68
- jobs.each do |job|
69
- @client.job.delete job
70
- end
71
- end
72
77
  # Write File
73
78
  File.open('pull_requests.csv', 'w+') { |file| file.write reqs.join(',') }
74
79
  end
75
-
76
- def run(project, job_collection, generator_job)
77
- @logger.info 'Begin running Pull Request Generator'
78
- pull_requests = check_for_pull generator_job[:value]
79
- purge_old(pull_requests, project)
80
- main_collection = job_collection
81
- @logger.info pull_requests
82
- pull_requests.each do |number|
83
- # Manipulate the YAML
84
- req = JenkinsPipelineBuilder::PullRequest.new(project, number, main_collection, generator_job)
85
- @generator.job_collection.merge req.jobs
86
- project = req.project
87
-
88
- # Overwrite the jobs from the generator to the project
89
- project[:value][:jobs] = generator_job[:value][:jobs]
90
-
91
- # Build the jobs
92
- success, compiled_project = @generator.resolve_project(project)
93
- compiled_project[:value][:jobs].each do |i|
94
- job = i[:result]
95
- success, payload = @generator.compile_job_to_xml(job)
96
- @generator.create_or_update(job, payload) if success
97
- end
98
- end
99
- end
100
80
  end
101
81
 
102
82
  class PullRequest
@@ -107,11 +87,13 @@ module JenkinsPipelineBuilder
107
87
 
108
88
  # Initialize
109
89
  def initialize(project, number, jobs, generator)
110
- @project = project.clone
90
+ # Set instance vars
91
+ @project = Marshal.load(Marshal.dump(project))
111
92
  @number = number
112
- @jobs = jobs.clone
113
- @generator = generator.clone
93
+ @jobs = Marshal.load(Marshal.dump(jobs))
94
+ @generator = Marshal.load(Marshal.dump(generator))
114
95
 
96
+ # Run
115
97
  run!
116
98
  end
117
99
 
@@ -21,27 +21,27 @@
21
21
  #
22
22
 
23
23
  module JenkinsPipelineBuilder
24
- class Triggers
25
- def self.enable_git_push(_, xml)
24
+ class Triggers < Extendable
25
+ register :git_push do |_, xml|
26
26
  xml.send('com.cloudbees.jenkins.GitHubPushTrigger') do
27
27
  xml.spec
28
28
  end
29
29
  end
30
30
 
31
- def self.enable_scm_polling(scm_polling, xml)
31
+ register :scm_polling do |scm_polling, xml|
32
32
  xml.send('hudson.triggers.SCMTrigger') do
33
33
  xml.spec scm_polling
34
34
  xml.ignorePostCommitHooks false
35
35
  end
36
36
  end
37
37
 
38
- def self.enable_periodic_build(periodic_build, xml)
38
+ register :periodic_build do |periodic_build, xml|
39
39
  xml.send('hudson.triggers.TimerTrigger') do
40
40
  xml.spec periodic_build
41
41
  end
42
42
  end
43
43
 
44
- def self.enable_upstream_check(params, xml)
44
+ register :upstream do |params, xml|
45
45
  case params[:status]
46
46
  when 'unstable'
47
47
  name = 'UNSTABLE'
@@ -21,5 +21,5 @@
21
21
  #
22
22
 
23
23
  module JenkinsPipelineBuilder
24
- VERSION = '0.5.1'
24
+ VERSION = '0.5.2'
25
25
  end
@@ -21,18 +21,18 @@
21
21
  #
22
22
 
23
23
  module JenkinsPipelineBuilder
24
- class Wrappers
25
- def self.ansicolor(_, xml)
24
+ class Wrappers < Extendable
25
+ register :ansicolor, jenkins_name: 'color ansi', description: 'this is a description' do |_, xml|
26
26
  xml.send('hudson.plugins.ansicolor.AnsiColorBuildWrapper') do
27
27
  xml.colorMapName 'xterm'
28
28
  end
29
29
  end
30
30
 
31
- def self.console_timestamp(_, xml)
31
+ register :timestamp do |_, xml|
32
32
  xml.send('hudson.plugins.timestamper.TimestamperBuildWrapper', 'plugin' => 'timestamper')
33
33
  end
34
34
 
35
- def self.run_with_rvm05(wrapper, xml)
35
+ register :rvm05 do |wrapper, xml|
36
36
  xml.send('ruby-proxy-object') do
37
37
  xml.send('ruby-object', 'ruby-class' => 'Jenkins::Tasks::BuildWrapperProxy', 'pluginid' => 'rvm') do
38
38
  xml.object('ruby-class' => 'RvmWrapper', 'pluginid' => 'rvm') do
@@ -42,7 +42,8 @@ module JenkinsPipelineBuilder
42
42
  end
43
43
  end
44
44
  end
45
- def self.run_with_rvm(wrapper, xml)
45
+
46
+ register :rvm do |wrapper, xml|
46
47
  xml.send('ruby-proxy-object') do
47
48
  xml.send('ruby-object', 'ruby-class' => 'Jenkins::Plugin::Proxies::BuildWrapper', 'pluginid' => 'rvm') do
48
49
  xml.object('ruby-class' => 'RvmWrapper', 'pluginid' => 'rvm') do
@@ -53,7 +54,7 @@ module JenkinsPipelineBuilder
53
54
  end
54
55
  end
55
56
 
56
- def self.inject_passwords(passwords, xml)
57
+ register :inject_passwords do |passwords, xml|
57
58
  xml.EnvInjectPasswordWrapper do
58
59
  xml.injectGlobalPasswords false
59
60
  xml.passwordEntries do
@@ -67,7 +68,7 @@ module JenkinsPipelineBuilder
67
68
  end
68
69
  end
69
70
 
70
- def self.inject_env_vars(params, xml)
71
+ register :inject_env_var do |params, xml|
71
72
  xml.EnvInjectBuildWrapper do
72
73
  xml.info do
73
74
  xml.propertiesFilePath params[:file] if params[:file]
@@ -77,7 +78,7 @@ module JenkinsPipelineBuilder
77
78
  end
78
79
  end
79
80
 
80
- def self.publish_to_artifactory(wrapper, xml)
81
+ register :artifactory do |wrapper, xml|
81
82
  xml.send('org.jfrog.hudson.generic.ArtifactoryGenericConfigurator') do
82
83
  xml.details do
83
84
  xml.artifactoryUrl wrapper[:url]
@@ -99,7 +100,7 @@ module JenkinsPipelineBuilder
99
100
  end
100
101
  end
101
102
 
102
- def self.artifactory_maven3_configurator(wrapper, xml)
103
+ register :maven3artifactory do |wrapper, xml|
103
104
  xml.send('org.jfrog.hudson.maven3.ArtifactoryMaven3Configurator') do # plugin='artifactory@2.2.1'
104
105
  xml.details do
105
106
  xml.artifactoryUrl wrapper[:url]
@@ -6,11 +6,8 @@ describe JenkinsPipelineBuilder::View do
6
6
  @creds_file = '~/.jenkins_api_client/login.yml'
7
7
  @valid_post_responses = [200, 201, 302]
8
8
  begin
9
- @client = JenkinsApi::Client.new(
10
- YAML.load_file(File.expand_path(@creds_file, __FILE__))
11
- )
12
- @client.logger.level = Logger::DEBUG
13
- @generator = JenkinsPipelineBuilder::Generator.new(@client)
9
+ JenksinPipelineBuilder.credentials = YAML.load_file(File.expand_path(@creds_file, __FILE__))
10
+ @generator = JenkinsPipelineBuilder.generator
14
11
  @generator.no_files = true
15
12
  rescue StandardError => e
16
13
  puts 'WARNING: Credentials are not set properly.'
@@ -0,0 +1,14 @@
1
+ ---
2
+ - job:
3
+ name: '{{name}}-00'
4
+ job_type: pull_request_generator
5
+ git_url: 'https://www.github.com/'
6
+ git_repo: 'constantcontact'
7
+ git_org: 'jenkins_pipeline_builder'
8
+ jobs:
9
+ - '{{name}}-10'
10
+ - '{{name}}-11'
11
+ builders:
12
+ - shell_command: |
13
+ generate -v || gem install jenkins_pipeline_builder
14
+ generate pipeline -c config/{{login_config}} pull_request pipeline/ {{name}}
@@ -0,0 +1,7 @@
1
+ ---
2
+ - job-template:
3
+ name: '{{name}}-10'
4
+ description: '{{description}}'
5
+ publishers:
6
+ - downstream:
7
+ project: '{{job@{{name}}-15-Provision}}'
@@ -0,0 +1,4 @@
1
+ ---
2
+ - job-template:
3
+ name: '{{name}}-11'
4
+ description: '{{description}}'
@@ -0,0 +1,11 @@
1
+ - defaults:
2
+ name: global
3
+ description: 'Do not edit this job through the web!'
4
+ discard_days: '14'
5
+
6
+ - project:
7
+ name: pull_req_test
8
+ jobs:
9
+ - '{{name}}-00'
10
+ - '{{name}}-10'
11
+ - '{{name}}-11'
@@ -3,18 +3,22 @@ require 'unit_tests/spec_helper'
3
3
  describe 'Test YAML jobs conversion to XML' do
4
4
  context 'Loading YAML files' do
5
5
  before do
6
- @client = JenkinsApi::Client.new(
7
- server_ip: '127.0.0.1',
8
- server_port: 8080,
9
- username: 'username',
10
- password: 'password',
11
- log_location: '/dev/null'
12
- )
13
- @generator = JenkinsPipelineBuilder::Generator.new(@client)
6
+ JenkinsPipelineBuilder.credentials = {
7
+ server_ip: '127.0.0.1',
8
+ server_port: 8080,
9
+ username: 'username',
10
+ password: 'password',
11
+ log_location: '/dev/null'
12
+ }
13
+ @generator = JenkinsPipelineBuilder.generator
14
14
  @generator.debug = true
15
15
  @generator.no_files = true
16
16
  end
17
17
 
18
+ after :each do
19
+ JenkinsPipelineBuilder.generator.instance_variable_set(:@job_collection, {})
20
+ end
21
+
18
22
  def compare_jobs(job, path)
19
23
  success, xml = @generator.compile_job_to_xml(job)
20
24
  expect(success).to be_true
@@ -86,7 +90,5 @@ describe 'Test YAML jobs conversion to XML' do
86
90
  compare_jobs job, file_name
87
91
  end
88
92
  end
89
-
90
- it 'downloads from remote repos'
91
93
  end
92
94
  end
@@ -2,18 +2,15 @@ require File.expand_path('../spec_helper', __FILE__)
2
2
 
3
3
  describe 'ModuleRegistry' do
4
4
 
5
+ it 'needs more tests'
5
6
  it 'should return item by a specified path' do
6
7
 
7
- registry = JenkinsPipelineBuilder::ModuleRegistry.new(
8
- zz: {
9
- aa: 'aa',
10
- bb: 'bb',
11
- cc: {
12
- dd: 'dd'
13
- }
14
- }
15
- )
8
+ registry = JenkinsPipelineBuilder::ModuleRegistry.new
9
+ registry.register_job_attribute(:foo, 'jenkins name', 'desc') do
10
+ true
11
+ end
16
12
 
17
- registry.get('zz/aa').should be == 'aa'
13
+ puts registry.registry.inspect
14
+ registry.get('job/foo').call.should be_true
18
15
  end
19
16
  end
@@ -2,18 +2,22 @@ require File.expand_path('../spec_helper', __FILE__)
2
2
 
3
3
  describe 'Templates resolver' do
4
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(@client)
5
+ JenkinsPipelineBuilder.credentials = {
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
13
13
  @generator.debug = true
14
14
  @generator.no_files = true
15
15
  end
16
16
 
17
+ after :each do
18
+ JenkinsPipelineBuilder.generator.instance_variable_set(:@job_collection, {})
19
+ end
20
+
17
21
  describe 'resolving settings bags' do
18
22
  it 'gives a bag when all the variables can be resolved' do
19
23
  str = %(
@@ -3,6 +3,7 @@ require 'rspec'
3
3
 
4
4
  require 'simplecov'
5
5
  require 'simplecov-rcov'
6
+ require 'webmock/rspec'
6
7
 
7
8
  SimpleCov.profiles.define 'spec' do
8
9
  add_group 'jenkins_pipeline_builder', '/lib/'
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.5.1
4
+ version: 0.5.2
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: 2014-06-24 00:00:00.000000000 Z
12
+ date: 2014-06-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -333,10 +333,13 @@ files:
333
333
  - lib/jenkins_pipeline_builder.rb
334
334
  - lib/jenkins_pipeline_builder/builders.rb
335
335
  - lib/jenkins_pipeline_builder/cli/base.rb
336
+ - lib/jenkins_pipeline_builder/cli/describe.rb
336
337
  - lib/jenkins_pipeline_builder/cli/helper.rb
338
+ - lib/jenkins_pipeline_builder/cli/list.rb
337
339
  - lib/jenkins_pipeline_builder/cli/pipeline.rb
338
340
  - lib/jenkins_pipeline_builder/cli/view.rb
339
341
  - lib/jenkins_pipeline_builder/compiler.rb
342
+ - lib/jenkins_pipeline_builder/extendable.rb
340
343
  - lib/jenkins_pipeline_builder/generator.rb
341
344
  - lib/jenkins_pipeline_builder/job_builder.rb
342
345
  - lib/jenkins_pipeline_builder/module_registry.rb
@@ -402,6 +405,10 @@ files:
402
405
  - spec/unit_tests/fixtures/files/throttle.yaml
403
406
  - spec/unit_tests/fixtures/files/upstream.xml
404
407
  - spec/unit_tests/fixtures/files/upstream.yaml
408
+ - spec/unit_tests/fixtures/pull_request/00.yaml
409
+ - spec/unit_tests/fixtures/pull_request/10.yaml
410
+ - spec/unit_tests/fixtures/pull_request/11.yaml
411
+ - spec/unit_tests/fixtures/pull_request/project.yaml
405
412
  - spec/unit_tests/fixtures/templates/external_job.yaml
406
413
  - spec/unit_tests/fixtures/templates/project_with_jobs.yaml
407
414
  - spec/unit_tests/generator_spec.rb
@@ -486,6 +493,10 @@ test_files:
486
493
  - spec/unit_tests/fixtures/files/throttle.yaml
487
494
  - spec/unit_tests/fixtures/files/upstream.xml
488
495
  - spec/unit_tests/fixtures/files/upstream.yaml
496
+ - spec/unit_tests/fixtures/pull_request/00.yaml
497
+ - spec/unit_tests/fixtures/pull_request/10.yaml
498
+ - spec/unit_tests/fixtures/pull_request/11.yaml
499
+ - spec/unit_tests/fixtures/pull_request/project.yaml
489
500
  - spec/unit_tests/fixtures/templates/external_job.yaml
490
501
  - spec/unit_tests/fixtures/templates/project_with_jobs.yaml
491
502
  - spec/unit_tests/generator_spec.rb