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 +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
|