jenkins_pipeline_builder 0.11.0 → 0.11.1
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 +8 -8
- data/.rubocop.yml +3 -6
- data/jenkins_pipeline_builder.gemspec +3 -5
- data/lib/jenkins_pipeline_builder/cli/helper.rb +17 -11
- data/lib/jenkins_pipeline_builder/compiler.rb +5 -1
- data/lib/jenkins_pipeline_builder/extensions.rb +9 -5
- data/lib/jenkins_pipeline_builder/extensions/job_attributes.rb +0 -1
- data/lib/jenkins_pipeline_builder/extensions/publishers.rb +0 -7
- data/lib/jenkins_pipeline_builder/extensions/wrappers.rb +1 -1
- data/lib/jenkins_pipeline_builder/generator.rb +37 -22
- data/lib/jenkins_pipeline_builder/job_collection.rb +0 -1
- data/lib/jenkins_pipeline_builder/module_registry.rb +20 -11
- data/lib/jenkins_pipeline_builder/pull_request_generator.rb +8 -4
- data/lib/jenkins_pipeline_builder/remote_dependencies.rb +33 -22
- data/lib/jenkins_pipeline_builder/version.rb +1 -1
- data/lib/jenkins_pipeline_builder/view.rb +20 -21
- data/spec/lib/jenkins_pipeline_builder/compiler_spec.rb +1 -1
- data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/jobs.tar.gz +0 -0
- data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/project.yaml +15 -0
- data/spec/lib/jenkins_pipeline_builder/generator_spec.rb +6 -2
- data/spec/lib/jenkins_pipeline_builder/job_spec.rb +1 -1
- data/spec/lib/jenkins_pipeline_builder/pull_request_spec.rb +63 -50
- metadata +10 -6
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
ZWQ5ODAzODU5ZTFiZjA1NzkwMDgyMGEyYzFjMDcwNGY5NDQ4MGZlMg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZjFkOGIxYTJiMjc0NmViZGNiMTU1NTlmZGViN2Y4ODFiZTgyODBlNA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OGZkNzk1ZmE2ODZmZTg4MzhiMTBiZDNlMzNkY2E1OGM4N2QzZDJmNzA0MTRi
|
10
|
+
Zjk5ZGRiNjJkNjhjNzYzNDY1OGY4MmRlMTE5YzliYjBmMjY3OTg4NWViOTE2
|
11
|
+
NmIxN2JiZjY3NmVkMWUzNzFiZjEyMjcyNDU5NmYxMmIyODdmYWM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzdiMDJkMWMyOTg1ZjI5MGQwYTllZTIxOWMwNTNjNjU4NWI4MjhmMmUxNmQ2
|
14
|
+
MTFmOTdlNDgyYjE0Nzc2M2U5NzE2ODIwMDI3NzgyMjQ2MjBmYWU5MjA1ZGMx
|
15
|
+
NTNiMTA5Y2UwZmQyOTdmMTdjOTg1NmZjYTM4NGJlODBjMTY4MDY=
|
data/.rubocop.yml
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
#######
|
2
2
|
# WIP These should all go back to defaults at some point
|
3
|
-
Metrics/
|
4
|
-
Max:
|
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:
|
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(
|
19
|
-
spec.test_files = spec.files.grep(
|
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
|
-
|
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
|
53
|
-
|
52
|
+
if valid_cli_creds? options
|
53
|
+
process_cli_creds(options)
|
54
54
|
elsif options[:creds_file]
|
55
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
@@ -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(:
|
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
|
-
|
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
|
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]
|
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
|
@@ -94,19 +94,28 @@ module JenkinsPipelineBuilder
|
|
94
94
|
next
|
95
95
|
end
|
96
96
|
reg_value = registry[key]
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
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
|
-
|
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] =
|
102
|
+
jobs[job.to_s] = collection[job.to_s]
|
99
103
|
else
|
100
|
-
jobs[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 =
|
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
|
-
|
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
|
62
|
-
|
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
|
-
|
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 = {})
|
@@ -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
|
-
|
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
|
-
|
124
|
-
|
125
|
-
'hudson.model.
|
126
|
-
|
127
|
-
'
|
128
|
-
|
129
|
-
'
|
130
|
-
|
131
|
-
|
132
|
-
|
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,
|
142
|
+
success, _item = compiler.handle_enable(item, settings)
|
143
143
|
expect(success).to be false
|
144
144
|
end
|
145
145
|
|
data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/jobs.tar.gz
ADDED
Binary file
|
@@ -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
|
-
|
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,
|
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: '
|
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 =
|
63
|
-
|
64
|
-
|
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 =
|
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 =
|
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(:
|
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
|
-
|
126
|
-
|
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 =
|
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.
|
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-
|
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
|
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
|
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
|