jenkins_pipeline_builder 0.13.4 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.gitignore +2 -1
- data/.ruby-version +1 -1
- data/.travis.yml +2 -0
- data/jenkins_pipeline_builder.gemspec +1 -1
- data/lib/jenkins_pipeline_builder/cli/describe.rb +5 -5
- data/lib/jenkins_pipeline_builder/cli/helper.rb +2 -5
- data/lib/jenkins_pipeline_builder/cli/pipeline.rb +1 -1
- data/lib/jenkins_pipeline_builder/compiler.rb +33 -45
- data/lib/jenkins_pipeline_builder/extension_set.rb +5 -5
- data/lib/jenkins_pipeline_builder/extensions.rb +1 -1
- data/lib/jenkins_pipeline_builder/extensions/builders.rb +31 -8
- data/lib/jenkins_pipeline_builder/extensions/helpers/extension_helper.rb +5 -5
- data/lib/jenkins_pipeline_builder/extensions/job_attributes.rb +6 -6
- data/lib/jenkins_pipeline_builder/extensions/publishers.rb +1 -0
- data/lib/jenkins_pipeline_builder/generator.rb +16 -21
- data/lib/jenkins_pipeline_builder/job.rb +3 -3
- data/lib/jenkins_pipeline_builder/job_collection.rb +12 -14
- data/lib/jenkins_pipeline_builder/module_registry.rb +2 -2
- data/lib/jenkins_pipeline_builder/project.rb +4 -6
- data/lib/jenkins_pipeline_builder/pull_request_generator.rb +3 -2
- data/lib/jenkins_pipeline_builder/version.rb +1 -1
- data/lib/jenkins_pipeline_builder/view.rb +18 -18
- data/spec/lib/jenkins_pipeline_builder/compiler_spec.rb +8 -13
- data/spec/lib/jenkins_pipeline_builder/extensions/registered_spec.rb +8 -6
- data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_json_files/project.json +15 -0
- data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_json_files/view.json +10 -0
- data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_yaml_files/project.yaml +8 -0
- data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_yaml_files/view.yaml +5 -0
- data/spec/lib/jenkins_pipeline_builder/generator_spec.rb +23 -3
- data/spec/lib/jenkins_pipeline_builder/module_registry_spec.rb +6 -6
- data/spec/lib/jenkins_pipeline_builder/pull_request_generator_spec.rb +10 -13
- metadata +12 -4
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
MDBiZGQ1ODhjMWU2ZTE0Mjk0MDM5ZjIzMmUyYzMwOTcyMDc2ODJkMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OTExNDQ5YjYyYTlhYzUxNjgxY2QzMDI4ODkyZDM5NjQ4MDI1NDg1Mw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZmRkMmE4OTA3MDA3YjZkM2Q2NDJkZGFhMTA1Njc0MGQ1N2E2NTBhYzgzYWM1
|
10
|
+
Mjc5ZjMzNjVhMDJjODI3ZjQ4ZDc4MTdjN2VlNjI0NjlmN2M1NDEyNWY2OWI4
|
11
|
+
YmMzMDJjNTZmYmIzNTk4NzNkMjc5MWRlMGE2ZDFlNTkxOWVjMGQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZjEwYjc1ODg1MzliMzNkYzkwM2M2ZDU4MGJhNjc4M2EwMTlmMWEzYTNlMmRi
|
14
|
+
Zjk3ZTM3YTlkYzBmOThjOWI1ODJhNzgyMzFhNGI2OWM3YTk5NWY3NWY5OThh
|
15
|
+
Y2M4ZWRmOWQ3YTA2MWJjMjk3OWZhZDkwZGI0YmJlZTgxYTQyOWY=
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.2.4
|
data/.travis.yml
CHANGED
@@ -33,7 +33,7 @@ automating Job & Pipeline creation from the YAML files checked-in with your appl
|
|
33
33
|
spec.add_development_dependency 'bump'
|
34
34
|
spec.add_development_dependency 'json'
|
35
35
|
spec.add_development_dependency 'gem-release'
|
36
|
-
spec.add_development_dependency '
|
36
|
+
spec.add_development_dependency 'byebug'
|
37
37
|
spec.add_development_dependency 'simplecov'
|
38
38
|
spec.add_development_dependency 'simplecov-rcov'
|
39
39
|
spec.add_development_dependency 'kwalify'
|
@@ -28,11 +28,11 @@ module JenkinsPipelineBuilder
|
|
28
28
|
klass_name = entry.to_s.classify
|
29
29
|
# rubocop:disable Style/AccessModifierIndentation
|
30
30
|
klass = Class.new(Thor) do
|
31
|
-
if entry == :job_attributes
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
extensions = if entry == :job_attributes
|
32
|
+
JenkinsPipelineBuilder.registry.registry[:job].select { |_, x| x.is_a? ExtensionSet }
|
33
|
+
else
|
34
|
+
JenkinsPipelineBuilder.registry.registry[:job][entry]
|
35
|
+
end
|
36
36
|
|
37
37
|
extensions.each do |key, extset|
|
38
38
|
# TODO: don't just take the first
|
@@ -71,11 +71,8 @@ module JenkinsPipelineBuilder
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def self.process_creds_file(file)
|
74
|
-
if file.end_with? 'json'
|
75
|
-
|
76
|
-
else
|
77
|
-
return YAML.load_file(File.expand_path(file))
|
78
|
-
end
|
74
|
+
return JSON.parse(IO.read(File.expand_path(file))) if file.end_with? 'json'
|
75
|
+
YAML.load_file(File.expand_path(file))
|
79
76
|
end
|
80
77
|
|
81
78
|
def self.process_cli_creds(options)
|
@@ -34,7 +34,7 @@ module JenkinsPipelineBuilder
|
|
34
34
|
desc 'bootstrap Path', 'Generates pipeline from folder or a file'
|
35
35
|
def bootstrap(path, project_name = nil)
|
36
36
|
failed = Helper.setup(parent_options).bootstrap(path, project_name)
|
37
|
-
|
37
|
+
raise 'Encountered error during run' unless failed.empty?
|
38
38
|
end
|
39
39
|
|
40
40
|
desc 'pull_request Path', 'Generates jenkins jobs based on a git pull request.'
|
@@ -44,9 +44,15 @@ module JenkinsPipelineBuilder
|
|
44
44
|
my_settings_bag.merge(bag)
|
45
45
|
end
|
46
46
|
|
47
|
+
def compile_job(item, settings = {})
|
48
|
+
new_item = compile(item, settings)
|
49
|
+
[true, new_item]
|
50
|
+
rescue => e
|
51
|
+
return [false, [e.message]]
|
52
|
+
end
|
53
|
+
|
47
54
|
def compile(item, settings = {})
|
48
|
-
|
49
|
-
return false, item unless success
|
55
|
+
item = handle_enable(item, settings)
|
50
56
|
|
51
57
|
case item
|
52
58
|
when String
|
@@ -56,16 +62,16 @@ module JenkinsPipelineBuilder
|
|
56
62
|
when Array
|
57
63
|
return compile_array item, settings
|
58
64
|
end
|
59
|
-
|
65
|
+
item
|
60
66
|
end
|
61
67
|
|
62
68
|
def handle_enable(item, settings)
|
63
|
-
return
|
69
|
+
return item unless item.is_a? Hash
|
64
70
|
if enable_block_present? item
|
65
71
|
enabled_switch = resolve_value(item[:enabled], settings)
|
66
|
-
return
|
72
|
+
return {} if enabled_switch == 'false'
|
67
73
|
if enabled_switch != 'true'
|
68
|
-
|
74
|
+
raise "Invalid value for #{item[:enabled]}: #{enabled_switch}"
|
69
75
|
end
|
70
76
|
if item[:parameters].is_a? Hash
|
71
77
|
item = item.merge item[:parameters]
|
@@ -75,7 +81,7 @@ module JenkinsPipelineBuilder
|
|
75
81
|
item = item[:parameters]
|
76
82
|
end
|
77
83
|
end
|
78
|
-
|
84
|
+
item
|
79
85
|
end
|
80
86
|
|
81
87
|
private
|
@@ -85,64 +91,44 @@ module JenkinsPipelineBuilder
|
|
85
91
|
end
|
86
92
|
|
87
93
|
def compile_string(item, settings)
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
return false, errors unless errors.empty?
|
92
|
-
[true, new_value]
|
94
|
+
resolve_value(item, settings)
|
95
|
+
rescue => e
|
96
|
+
raise "Failed to resolve #{item} because: #{e.message}"
|
93
97
|
end
|
94
98
|
|
95
99
|
def compile_array(array, settings)
|
96
|
-
errors = {}
|
97
100
|
result = []
|
98
101
|
array.each do |value|
|
99
|
-
|
100
|
-
errors[value] = payload unless success
|
102
|
+
payload = compile_array_item value, settings, array
|
101
103
|
result << payload
|
102
104
|
end
|
103
|
-
|
104
|
-
[true, result]
|
105
|
+
result
|
105
106
|
end
|
106
107
|
|
107
108
|
def compile_array_item(item, settings, array)
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
[true, payload]
|
109
|
+
raise "Found a nil value when processing following array:\n #{array.inspect}" if item.nil?
|
110
|
+
payload = compile(item, settings)
|
111
|
+
raise "Failed to resolve:\n===>item #{item}\n\n===>of list: #{array.inspect}" if payload.nil?
|
112
|
+
payload
|
113
113
|
end
|
114
114
|
|
115
|
-
def compile_item(key, value,
|
115
|
+
def compile_item(key, value, settings)
|
116
116
|
if value.nil?
|
117
|
-
|
118
|
-
return false, errors[key]
|
119
|
-
end
|
120
|
-
success, payload = compile(value, settings)
|
121
|
-
unless success
|
122
|
-
errors.merge!(payload)
|
123
|
-
return false, payload
|
117
|
+
raise "key: #{key} has a nil value, this is often a yaml syntax error. Skipping children and siblings"
|
124
118
|
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
end
|
129
|
-
[true, payload]
|
119
|
+
payload = compile(value, settings)
|
120
|
+
raise "Failed to resolve:\n===>key: #{key}\n\n===>value: #{value} payload" if payload.nil?
|
121
|
+
payload
|
130
122
|
end
|
131
123
|
|
132
124
|
def compile_hash(item, settings)
|
133
|
-
|
134
|
-
return false, item unless success
|
135
|
-
|
136
|
-
errors = {}
|
125
|
+
item = handle_enable(item, settings)
|
137
126
|
result = {}
|
138
|
-
|
139
127
|
item.each do |key, value|
|
140
|
-
|
141
|
-
next unless success
|
128
|
+
payload = compile_item(key, value, settings)
|
142
129
|
result[key] = payload unless payload == {}
|
143
130
|
end
|
144
|
-
|
145
|
-
[true, result]
|
131
|
+
result
|
146
132
|
end
|
147
133
|
|
148
134
|
def resolve_value(value, settings)
|
@@ -155,6 +141,7 @@ module JenkinsPipelineBuilder
|
|
155
141
|
end
|
156
142
|
|
157
143
|
settings = settings.with_indifferent_access
|
144
|
+
# TODO: this is actually a shallow copy and should be fixed
|
158
145
|
value_s = value.to_s.clone
|
159
146
|
correct_job_names! value_s
|
160
147
|
# Then we look for normal values to replace
|
@@ -165,7 +152,8 @@ module JenkinsPipelineBuilder
|
|
165
152
|
vars = value_s.scan(/{{([^{}@]+)}}/).flatten
|
166
153
|
vars.select! do |var|
|
167
154
|
var_val = settings[var]
|
168
|
-
|
155
|
+
raise "Could not find defined substitution variable: #{var}" if var_val.nil?
|
156
|
+
value_s.gsub!("{{#{var}}}", var_val.to_s)
|
169
157
|
var_val.nil?
|
170
158
|
end
|
171
159
|
return nil if vars.count != 0
|
@@ -7,7 +7,7 @@ module JenkinsPipelineBuilder
|
|
7
7
|
:description,
|
8
8
|
:announced,
|
9
9
|
:type
|
10
|
-
]
|
10
|
+
].freeze
|
11
11
|
SET_METHODS.each do |method_name|
|
12
12
|
define_method method_name do |value = nil|
|
13
13
|
return settings[method_name] if value.nil?
|
@@ -54,7 +54,7 @@ module JenkinsPipelineBuilder
|
|
54
54
|
return @version if @version
|
55
55
|
reg = JenkinsPipelineBuilder.registry
|
56
56
|
version = reg.versions[settings[:plugin_id]]
|
57
|
-
|
57
|
+
raise "Plugin #{settings[:name]} is not installed (plugin_id: #{settings[:plugin_id]})" if version.nil?
|
58
58
|
self.installed_version = version
|
59
59
|
@version
|
60
60
|
end
|
@@ -66,7 +66,7 @@ module JenkinsPipelineBuilder
|
|
66
66
|
extension = versions[highest_allowed_version]
|
67
67
|
|
68
68
|
unless extension
|
69
|
-
|
69
|
+
raise "Can't find version of #{name} lte #{installed_version}, available versions: #{versions.keys.map(&:to_s)}"
|
70
70
|
end
|
71
71
|
extension
|
72
72
|
end
|
@@ -81,7 +81,7 @@ module JenkinsPipelineBuilder
|
|
81
81
|
mismatch.each do |error|
|
82
82
|
puts error
|
83
83
|
end
|
84
|
-
|
84
|
+
raise 'Values did not match, cannot merge extension sets' if mismatch.any?
|
85
85
|
|
86
86
|
self.extensions = versions.merge(other_set.versions).values
|
87
87
|
end
|
@@ -100,7 +100,7 @@ module JenkinsPipelineBuilder
|
|
100
100
|
deprecation_warning(settings[:name], 'xml')
|
101
101
|
end
|
102
102
|
unless block
|
103
|
-
|
103
|
+
raise "no block found for version #{version}" unless blocks.key version
|
104
104
|
return blocks[version][:block]
|
105
105
|
end
|
106
106
|
store_xml version, block, path
|
@@ -282,14 +282,10 @@ builder do
|
|
282
282
|
else
|
283
283
|
send('selector', 'class' => 'hudson.plugins.copyartifact.StatusBuildSelector')
|
284
284
|
end
|
285
|
-
if params[:fingerprint].nil?
|
285
|
+
if params[:fingerprint].nil? || params[:fingerprint].to_s == 'true'
|
286
286
|
doNotFingerprintArtifacts false
|
287
287
|
else
|
288
|
-
|
289
|
-
doNotFingerprintArtifacts false
|
290
|
-
else
|
291
|
-
doNotFingerprintArtifacts true
|
292
|
-
end
|
288
|
+
doNotFingerprintArtifacts true
|
293
289
|
end
|
294
290
|
flatten true if params[:flatten]
|
295
291
|
optional true if params[:optional]
|
@@ -307,10 +303,10 @@ builder do
|
|
307
303
|
xml do |params|
|
308
304
|
send('hudson.plugins.groovy.SystemGroovy', 'plugin' => 'groovy@1.24') do
|
309
305
|
if params.key?(:script) && params.key?(:file)
|
310
|
-
|
306
|
+
raise 'Configuration invalid. Both \'script\' and \'file\' keys can not be specified'
|
311
307
|
end
|
312
308
|
unless params.key?(:script) || params.key?(:file)
|
313
|
-
|
309
|
+
raise 'Configuration invalid. At least one of \'script\' and \'file\' keys must be specified'
|
314
310
|
end
|
315
311
|
|
316
312
|
scriptSource('class' => 'hudson.plugins.groovy.StringScriptSource') do
|
@@ -381,4 +377,31 @@ builder do
|
|
381
377
|
filterPattern params[:filterPattern]
|
382
378
|
end
|
383
379
|
end
|
380
|
+
|
381
|
+
builder do
|
382
|
+
name :sonar_standalone
|
383
|
+
plugin_id 'sonar'
|
384
|
+
description 'Quickly benefit from Sonar, the open source platform for Continuous Inspection of code quality.'
|
385
|
+
jenkins_name 'SonarQube Plugin'
|
386
|
+
announced false
|
387
|
+
parameters [
|
388
|
+
:sonarInstallation,
|
389
|
+
:taskToRun,
|
390
|
+
:jdk,
|
391
|
+
:pathToProjectProperties,
|
392
|
+
:projectProperties,
|
393
|
+
:jvmOptions
|
394
|
+
]
|
395
|
+
|
396
|
+
xml do |params|
|
397
|
+
send('hudson.plugins.sonar.SonarRunnerBuilder', 'plugin' => 'sonar@2.1') do
|
398
|
+
installationName params[:sonarInstallation]
|
399
|
+
project params[:pathToProjectProperties]
|
400
|
+
properties params[:projectProperties]
|
401
|
+
javaOpts params[:jvmOptions]
|
402
|
+
jdk params[:jdk]
|
403
|
+
task params[:taskToRun]
|
404
|
+
end
|
405
|
+
end
|
406
|
+
end
|
384
407
|
end
|
@@ -6,11 +6,11 @@ class ExtensionHelper < SimpleDelegator
|
|
6
6
|
# That will allow for defaults to be pulled out of the extension and it
|
7
7
|
# will also let better enable overriding of those values that do not have
|
8
8
|
# an option to do so currently.
|
9
|
-
if params.is_a? Hash
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
@params = if params.is_a? Hash
|
10
|
+
defaults.merge params
|
11
|
+
else
|
12
|
+
params
|
13
|
+
end
|
14
14
|
@builder = builder
|
15
15
|
super @params
|
16
16
|
end
|
@@ -32,7 +32,7 @@ job_attribute do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
xml path: '//project' do |description|
|
35
|
-
description
|
35
|
+
description description.to_s
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -44,7 +44,7 @@ job_attribute do
|
|
44
44
|
announced false
|
45
45
|
|
46
46
|
xml path: '//project' do |jdk|
|
47
|
-
jdk
|
47
|
+
jdk jdk.to_s
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
@@ -60,7 +60,7 @@ job_attribute do
|
|
60
60
|
end
|
61
61
|
|
62
62
|
xml path: '//project' do |disabled|
|
63
|
-
disabled
|
63
|
+
disabled disabled.to_s
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
@@ -169,7 +169,7 @@ job_attribute do
|
|
169
169
|
extensions do
|
170
170
|
if params[:changelog_to_branch]
|
171
171
|
opts = params[:changelog_to_branch]
|
172
|
-
|
172
|
+
raise 'remote and branch are required for changelog_to_branch' unless opts[:remote] && opts[:branch]
|
173
173
|
send('hudson.plugins.git.extensions.impl.ChangelogToBranch') do
|
174
174
|
options do
|
175
175
|
compareRemote opts[:remote]
|
@@ -215,7 +215,7 @@ job_attribute do
|
|
215
215
|
announced false
|
216
216
|
|
217
217
|
xml path: '//properties' do |params|
|
218
|
-
|
218
|
+
raise 'No HipChat room specified' unless params[:room]
|
219
219
|
|
220
220
|
send('jenkins.plugins.hipchat.HipChatNotifier_-HipChatJobProperty') do
|
221
221
|
room params[:room]
|
@@ -257,7 +257,7 @@ job_attribute do
|
|
257
257
|
send('hudson.model.ParametersDefinitionProperty') do
|
258
258
|
parameterDefinitions do
|
259
259
|
params.each do |param|
|
260
|
-
send(params.param_type
|
260
|
+
send(params.param_type(param)) do
|
261
261
|
name param[:name]
|
262
262
|
description param[:description]
|
263
263
|
defaultValue param[:default]
|
@@ -86,11 +86,11 @@ module JenkinsPipelineBuilder
|
|
86
86
|
|
87
87
|
def resolve_job_by_name(name, settings = {})
|
88
88
|
job = job_collection.get_item(name)
|
89
|
-
|
89
|
+
raise "Failed to locate job by name '#{name}'" if job.nil?
|
90
90
|
job_value = job[:value]
|
91
91
|
logger.debug "Compiling job #{name}"
|
92
92
|
compiler = JenkinsPipelineBuilder::Compiler.new self
|
93
|
-
success, payload = compiler.
|
93
|
+
success, payload = compiler.compile_job(job_value, settings)
|
94
94
|
[success, payload]
|
95
95
|
end
|
96
96
|
|
@@ -115,11 +115,11 @@ module JenkinsPipelineBuilder
|
|
115
115
|
end
|
116
116
|
|
117
117
|
def publish(project_name)
|
118
|
-
if job_collection.projects.any?
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
118
|
+
errors = if job_collection.projects.any?
|
119
|
+
publish_project(project_name)
|
120
|
+
else
|
121
|
+
publish_jobs(job_collection.standalone_jobs)
|
122
|
+
end
|
123
123
|
print_compile_errors errors
|
124
124
|
errors
|
125
125
|
end
|
@@ -142,12 +142,9 @@ module JenkinsPipelineBuilder
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def print_project_errors(errors)
|
145
|
-
errors.each do |
|
146
|
-
puts
|
147
|
-
|
148
|
-
puts " key: #{key} had the following error:"
|
149
|
-
puts " #{error.inspect}"
|
150
|
-
end
|
145
|
+
errors.each do |error|
|
146
|
+
puts 'Encountered errors processing:'
|
147
|
+
puts error.inspect
|
151
148
|
end
|
152
149
|
end
|
153
150
|
|
@@ -210,12 +207,10 @@ module JenkinsPipelineBuilder
|
|
210
207
|
|
211
208
|
def create_jobs_and_views(project)
|
212
209
|
success, payload = resolve_project(project)
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
return { project_name: 'Failed to resolve' }
|
218
|
-
end
|
210
|
+
return { project_name: 'Failed to resolve' } unless success
|
211
|
+
|
212
|
+
logger.info 'successfully resolved project'
|
213
|
+
compiled_project = payload
|
219
214
|
|
220
215
|
errors = publish_jobs(compiled_project[:value][:jobs]) if compiled_project[:value][:jobs]
|
221
216
|
return errors unless compiled_project[:value][:views]
|
@@ -225,14 +220,14 @@ module JenkinsPipelineBuilder
|
|
225
220
|
|
226
221
|
def publish_project(project_name)
|
227
222
|
project = job_collection.projects.find { |p| p[:name] == project_name }
|
228
|
-
create_jobs_and_views(project ||
|
223
|
+
create_jobs_and_views(project || raise("Project #{project_name} not found!"))
|
229
224
|
end
|
230
225
|
|
231
226
|
def publish_jobs(jobs, errors = {})
|
232
227
|
jobs.each do |i|
|
233
228
|
logger.info "Processing #{i}"
|
234
229
|
job = i[:result]
|
235
|
-
|
230
|
+
raise "Result is empty for #{i}" if job.nil?
|
236
231
|
job = Job.new job
|
237
232
|
success, payload = job.create_or_update
|
238
233
|
errors[job.name] = payload unless success
|
@@ -29,7 +29,7 @@ module JenkinsPipelineBuilder
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def to_xml
|
32
|
-
|
32
|
+
raise 'Job name is not specified' unless name
|
33
33
|
|
34
34
|
logger.info "Creating Yaml Job #{job}"
|
35
35
|
job[:job_type] = 'free_style' unless job[:job_type]
|
@@ -59,7 +59,7 @@ module JenkinsPipelineBuilder
|
|
59
59
|
|
60
60
|
def local_output(xml)
|
61
61
|
logger.info "Will create job #{job}"
|
62
|
-
logger.info
|
62
|
+
logger.info xml.to_s if @debug
|
63
63
|
FileUtils.mkdir_p(out_dir) unless File.exist?(out_dir)
|
64
64
|
File.open("#{out_dir}/#{name}.xml", 'w') { |f| f.write xml }
|
65
65
|
[true, nil]
|
@@ -112,7 +112,7 @@ module JenkinsPipelineBuilder
|
|
112
112
|
# I'm pretty unclear what these templates are...
|
113
113
|
if params.key?(:template)
|
114
114
|
template_name = params[:template]
|
115
|
-
|
115
|
+
raise "Job template '#{template_name}' can't be resolved." unless @job_templates.key?(template_name)
|
116
116
|
params.delete(:template)
|
117
117
|
template = @job_templates[template_name]
|
118
118
|
puts "Template found: #{template}"
|
@@ -2,7 +2,7 @@ module JenkinsPipelineBuilder
|
|
2
2
|
class JobCollection
|
3
3
|
attr_accessor :collection, :remote_dependencies
|
4
4
|
attr_reader :loaded
|
5
|
-
|
5
|
+
alias loaded? loaded
|
6
6
|
|
7
7
|
def initialize
|
8
8
|
@collection = {}
|
@@ -70,15 +70,17 @@ module JenkinsPipelineBuilder
|
|
70
70
|
private
|
71
71
|
|
72
72
|
def load_file(path, remote = false)
|
73
|
-
if path.end_with? 'json'
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
73
|
+
hash = if path.end_with? 'json'
|
74
|
+
JSON.parse(IO.read(path))
|
75
|
+
else # elsif path.end_with?("yml") || path.end_with?("yaml")
|
76
|
+
YAML.load_file(path)
|
77
|
+
end
|
78
78
|
logger.info "Loading file #{path}"
|
79
79
|
hash.each do |section|
|
80
80
|
load_section section, remote
|
81
81
|
end
|
82
|
+
rescue StandardError => err
|
83
|
+
raise "There was an error while parsing a file #{err.message}"
|
82
84
|
end
|
83
85
|
|
84
86
|
def load_section(section, remote)
|
@@ -100,14 +102,10 @@ module JenkinsPipelineBuilder
|
|
100
102
|
if collection.key?(name)
|
101
103
|
existing_remote = collection[name.to_s][:remote]
|
102
104
|
# skip if the existing item is local and the new item is remote
|
103
|
-
if remote && !existing_remote
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
logger.info "Duplicate item with name '#{name}' was detected from the remote folder."
|
108
|
-
else
|
109
|
-
fail "Duplicate item with name '#{name}' was detected."
|
110
|
-
end
|
105
|
+
return if remote && !existing_remote
|
106
|
+
raise "Duplicate item with name '#{name}' was detected." unless existing_remote && !remote
|
107
|
+
# override if the existing item is remote and the new is local
|
108
|
+
logger.info "Duplicate item with name '#{name}' was detected from the remote folder."
|
111
109
|
end
|
112
110
|
collection[name.to_s] = { name: name.to_s, type: key, value: value, remote: remote }
|
113
111
|
end
|
@@ -90,7 +90,7 @@ module JenkinsPipelineBuilder
|
|
90
90
|
params.each do |key, value|
|
91
91
|
next unless registry.is_a? Hash
|
92
92
|
unless registry.key? key
|
93
|
-
|
93
|
+
raise "!!!! could not find key #{key} !!!!" if strict
|
94
94
|
next
|
95
95
|
end
|
96
96
|
reg_value = registry[key]
|
@@ -115,7 +115,7 @@ module JenkinsPipelineBuilder
|
|
115
115
|
def execute_extension(ext, value, n_xml)
|
116
116
|
logger.debug "Using #{ext.type} #{ext.name} version #{ext.min_version}"
|
117
117
|
success = ext.execute value, n_xml
|
118
|
-
|
118
|
+
raise 'Encountered errors compiling the xml' unless success
|
119
119
|
end
|
120
120
|
end
|
121
121
|
end
|
@@ -10,12 +10,10 @@ module JenkinsPipelineBuilder
|
|
10
10
|
|
11
11
|
def publish
|
12
12
|
success, payload = resolve_project(input)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
return { project_name: 'Failed to resolve' }
|
18
|
-
end
|
13
|
+
return { project_name: 'Failed to resolve' } unless success
|
14
|
+
|
15
|
+
logger.info 'successfully resolved project'
|
16
|
+
compiled_project = payload
|
19
17
|
|
20
18
|
self.errors = publish_jobs(compiled_project[:value][:jobs]) if compiled_project[:value][:jobs]
|
21
19
|
return unless compiled_project[:value][:views]
|
@@ -25,12 +25,13 @@ module JenkinsPipelineBuilder
|
|
25
25
|
attr_accessor :open_prs, :application_name
|
26
26
|
|
27
27
|
def initialize(defaults = {})
|
28
|
-
@application_name = defaults[:application_name] ||
|
28
|
+
@application_name = defaults[:application_name] || raise('Please set "application_name" in your project!')
|
29
29
|
@open_prs = active_prs defaults[:github_site], defaults[:git_org], defaults[:git_repo_name]
|
30
30
|
end
|
31
31
|
|
32
32
|
def convert!(job_collection, pr)
|
33
33
|
job_collection.defaults[:value][:application_name] = "#{application_name}-PR#{pr}"
|
34
|
+
job_collection.defaults[:value][:pull_request_number] = pr.to_s
|
34
35
|
job_collection.jobs.each { |j| override j[:value], pr }
|
35
36
|
end
|
36
37
|
|
@@ -56,7 +57,7 @@ module JenkinsPipelineBuilder
|
|
56
57
|
end
|
57
58
|
|
58
59
|
def active_prs(git_url, git_org, git_repo)
|
59
|
-
(git_url && git_org && git_repo) ||
|
60
|
+
(git_url && git_org && git_repo) || raise('Please set github_site, git_org and git_repo_name in your project.')
|
60
61
|
# Build the Git URL
|
61
62
|
url = "#{git_url}/api/v3/repos/#{git_org}/#{git_repo}/pulls"
|
62
63
|
# Download the JSON Data from the API
|
@@ -35,11 +35,11 @@ module JenkinsPipelineBuilder
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def generate(path)
|
38
|
-
if path.end_with? 'json'
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
38
|
+
hash = if path.end_with? 'json'
|
39
|
+
JSON.parse(IO.read(path))
|
40
|
+
else
|
41
|
+
YAML.load_file(path)
|
42
|
+
end
|
43
43
|
|
44
44
|
hash.each do |item|
|
45
45
|
Utils.symbolize_keys_deep!(item)
|
@@ -66,7 +66,7 @@ module JenkinsPipelineBuilder
|
|
66
66
|
#
|
67
67
|
def create(params)
|
68
68
|
# Name is a required parameter. Raise an error if not specified
|
69
|
-
|
69
|
+
raise ArgumentError, 'Name is required for creating view' unless params.is_a?(Hash) && params[:name]
|
70
70
|
clean_up_views(params) unless JenkinsPipelineBuilder.debug
|
71
71
|
params[:type] ||= 'listview'
|
72
72
|
create_base_view(params[:name], params[:type], params[:parent_view])
|
@@ -90,16 +90,19 @@ module JenkinsPipelineBuilder
|
|
90
90
|
if params[:parent_view]
|
91
91
|
create_base_view(params[:parent_view], 'nestedView') unless exists?(params[:parent_view])
|
92
92
|
delete(params[:name], params[:parent_view]) if exists?(params[:name], params[:parent_view])
|
93
|
-
|
94
|
-
delete(params[:name])
|
93
|
+
elsif exists?(params[:name])
|
94
|
+
delete(params[:name])
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
98
|
def post_params(params)
|
99
99
|
payload = post_payload params
|
100
|
-
payload
|
101
|
-
payload
|
102
|
-
|
100
|
+
payload['filterQueue'] = 'on' if params[:filter_queue]
|
101
|
+
payload['filterExecutors'] = 'on' if params[:filter_executors]
|
102
|
+
if params[:regex]
|
103
|
+
payload['useincluderegex'] = 'on'
|
104
|
+
payload['includeRegex'] = params[:regex]
|
105
|
+
end
|
103
106
|
payload
|
104
107
|
end
|
105
108
|
|
@@ -113,7 +116,7 @@ module JenkinsPipelineBuilder
|
|
113
116
|
'statusFilter' => '',
|
114
117
|
'columns' => get_columns(params[:type])
|
115
118
|
}
|
116
|
-
json
|
119
|
+
json['groupingRules'] = params[:groupingRules] if params[:groupingRules]
|
117
120
|
|
118
121
|
{
|
119
122
|
'name' => params[:name],
|
@@ -133,7 +136,7 @@ module JenkinsPipelineBuilder
|
|
133
136
|
'dashboardView' => 'hudson.plugins.view.dashboard.Dashboard',
|
134
137
|
'multijobView' => 'com.tikal.jenkins.plugins.multijob.views.MultiJobView'
|
135
138
|
}
|
136
|
-
|
139
|
+
raise "Type #{type} is not supported by Jenkins." unless types.keys.include? type
|
137
140
|
types[type]
|
138
141
|
end
|
139
142
|
|
@@ -211,11 +214,8 @@ module JenkinsPipelineBuilder
|
|
211
214
|
path = parent_view.nil? ? '' : "/view/#{parent_view}"
|
212
215
|
response_json = @client.api_get_request(path)
|
213
216
|
response_json['views'].each do |view|
|
214
|
-
|
215
|
-
|
216
|
-
else
|
217
|
-
view_names << view['name'] if view['name'] =~ /#{filter}/
|
218
|
-
end
|
217
|
+
filter_exp = ignorecase ? /#{filter}/i : /#{filter}/
|
218
|
+
view_names << view['name'] if view['name'] =~ filter_exp
|
219
219
|
end
|
220
220
|
view_names
|
221
221
|
end
|
@@ -63,7 +63,7 @@ describe JenkinsPipelineBuilder::Compiler do
|
|
63
63
|
builders: [{ shell_command: "echo 'Running DummyPipeline'" }]
|
64
64
|
}
|
65
65
|
result = compiler.compile(job, settings_bag)
|
66
|
-
expect(result
|
66
|
+
expect(result).to eq(job_compiled)
|
67
67
|
end
|
68
68
|
|
69
69
|
it 'compiles a job with a downstream name change' do
|
@@ -96,7 +96,7 @@ describe JenkinsPipelineBuilder::Compiler do
|
|
96
96
|
publishers: [{ downstream: { project: 'DummyPipeline-02' } }]
|
97
97
|
}
|
98
98
|
result = compiler.compile(job, settings_bag)
|
99
|
-
expect(result
|
99
|
+
expect(result).to eq(job_compiled)
|
100
100
|
end
|
101
101
|
|
102
102
|
it 'compiles an enabled job with a string parameter' do
|
@@ -107,7 +107,7 @@ describe JenkinsPipelineBuilder::Compiler do
|
|
107
107
|
settings_bag = { var: 'this_is_a_var', name: 'name' }
|
108
108
|
|
109
109
|
result = compiler.compile(my_job, settings_bag)
|
110
|
-
expect(result
|
110
|
+
expect(result).to eq(compiled_job)
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
@@ -115,39 +115,34 @@ describe JenkinsPipelineBuilder::Compiler do
|
|
115
115
|
it 'generates correct new jobs with true' do
|
116
116
|
item = { enabled: '{{use1}}', parameters: { rootPom: 'path_to_pomasd' } }
|
117
117
|
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 }
|
118
|
-
|
119
|
-
expect(success).to be true
|
118
|
+
item = compiler.handle_enable(item, settings)
|
120
119
|
expect(item).to eq(rootPom: 'path_to_pomasd')
|
121
120
|
end
|
122
121
|
|
123
122
|
it 'generates correct new jobs when the params are a string' do
|
124
123
|
item = { enabled: '{{use1}}', parameters: 'path_to_pomasd' }
|
125
124
|
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 }
|
126
|
-
|
127
|
-
expect(success).to be true
|
125
|
+
item = compiler.handle_enable(item, settings)
|
128
126
|
expect(item).to eq('path_to_pomasd')
|
129
127
|
end
|
130
128
|
|
131
129
|
it 'generates correct new jobs with false' do
|
132
130
|
item = { enabled: '{{use1}}', parameters: { rootPom: 'path_to_pomasd' } }
|
133
131
|
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: false }
|
134
|
-
|
135
|
-
expect(success).to be true
|
132
|
+
item = compiler.handle_enable(item, settings)
|
136
133
|
expect(item).to eq({})
|
137
134
|
end
|
138
135
|
|
139
136
|
it 'fails when value not found' do
|
140
137
|
item = { enabled: '{{use_fail}}', parameters: { rootPom: 'path_to_pomasd' } }
|
141
138
|
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
|
-
|
143
|
-
expect(success).to be false
|
139
|
+
expect { compiler.handle_enable(item, settings) }.to raise_error(/Could not find defined substitution variable: use_fail/)
|
144
140
|
end
|
145
141
|
|
146
142
|
it 'removes empty builders' do
|
147
143
|
item = { enabled: '{{use}}', parameters: { rootPom: 'one' } }
|
148
144
|
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/', use: false }
|
149
|
-
|
150
|
-
expect(success).to be true
|
145
|
+
result = compiler.handle_enable(item, settings)
|
151
146
|
expect(result).to eq({})
|
152
147
|
end
|
153
148
|
end
|
@@ -9,7 +9,7 @@ WRAPPERS = {
|
|
9
9
|
rvm: ['0', '0.5'],
|
10
10
|
timestamp: ['0'],
|
11
11
|
xvfb: ['0']
|
12
|
-
}
|
12
|
+
}.freeze
|
13
13
|
PUBLISHERS = {
|
14
14
|
archive_artifact: ['0'],
|
15
15
|
brakeman: ['0'],
|
@@ -30,7 +30,7 @@ PUBLISHERS = {
|
|
30
30
|
publish_tap_results: ['0'],
|
31
31
|
sonar_result: ['0'],
|
32
32
|
xunit: ['0']
|
33
|
-
}
|
33
|
+
}.freeze
|
34
34
|
BUILDERS = {
|
35
35
|
blocking_downstream: ['0'],
|
36
36
|
copy_artifact: ['0'],
|
@@ -40,14 +40,16 @@ BUILDERS = {
|
|
40
40
|
remote_job: ['0'],
|
41
41
|
shell_command: ['0'],
|
42
42
|
checkmarx_scan: ['0'],
|
43
|
-
system_groovy: ['0']
|
44
|
-
|
43
|
+
system_groovy: ['0'],
|
44
|
+
sonar_standalone: ['0']
|
45
|
+
|
46
|
+
}.freeze
|
45
47
|
TRIGGERS = {
|
46
48
|
git_push: ['0'],
|
47
49
|
periodic_build: ['0'],
|
48
50
|
scm_polling: ['0'],
|
49
51
|
upstream: ['0']
|
50
|
-
}
|
52
|
+
}.freeze
|
51
53
|
JOB_ATTRIBUTES = {
|
52
54
|
concurrent_build: ['0'],
|
53
55
|
description: ['0'],
|
@@ -62,7 +64,7 @@ JOB_ATTRIBUTES = {
|
|
62
64
|
promoted_builds: ['0'],
|
63
65
|
scm_params: ['0', '2.0'],
|
64
66
|
throttle: ['0']
|
65
|
-
}
|
67
|
+
}.freeze
|
66
68
|
|
67
69
|
describe 'built in extensions' do
|
68
70
|
before :each do
|
@@ -174,7 +174,7 @@ describe JenkinsPipelineBuilder::Generator do
|
|
174
174
|
git_repo_name: 'generator_tests'))
|
175
175
|
.and_return(pr_generator)
|
176
176
|
expect(pr_generator).to receive(:delete_closed_prs)
|
177
|
-
pr_generator.
|
177
|
+
allow(pr_generator).to receive(:convert!) do |job_collection, pr|
|
178
178
|
job_collection.defaults[:value][:application_name] = "testapp-PR#{pr}"
|
179
179
|
end
|
180
180
|
expect(pr_generator).to receive(:open_prs).and_return [1, 2]
|
@@ -210,6 +210,19 @@ describe JenkinsPipelineBuilder::Generator do
|
|
210
210
|
path = File.expand_path('../fixtures/generator_tests/test_combo_files', __FILE__)
|
211
211
|
@generator.job_collection.load_from_path path
|
212
212
|
end
|
213
|
+
|
214
|
+
it 'errors when reading a bad yaml file' do
|
215
|
+
path = File.expand_path('../fixtures/generator_tests/test_bad_yaml_files', __FILE__)
|
216
|
+
expect { @generator.job_collection.load_from_path path }.to raise_error(
|
217
|
+
RuntimeError, /There was an error while parsing a file/
|
218
|
+
)
|
219
|
+
end
|
220
|
+
it 'errors when reading a bad json file' do
|
221
|
+
path = File.expand_path('../fixtures/generator_tests/test_bad_json_files', __FILE__)
|
222
|
+
expect { @generator.job_collection.load_from_path path }.to raise_error(
|
223
|
+
RuntimeError, /There was an error while parsing a file/
|
224
|
+
)
|
225
|
+
end
|
213
226
|
end
|
214
227
|
|
215
228
|
describe '#dump' do
|
@@ -224,7 +237,7 @@ describe JenkinsPipelineBuilder::Generator do
|
|
224
237
|
end
|
225
238
|
end
|
226
239
|
stub_request(:get, 'http://username:password@127.0.0.1:8080/job/test_job/config.xml')
|
227
|
-
.to_return(status: 200, body:
|
240
|
+
.to_return(status: 200, body: body.to_s, headers: {})
|
228
241
|
@generator.dump(job_name)
|
229
242
|
expect(File.exist?("#{job_name}.xml")).to be true
|
230
243
|
File.delete("#{job_name}.xml")
|
@@ -234,7 +247,7 @@ describe JenkinsPipelineBuilder::Generator do
|
|
234
247
|
describe '#projects' do
|
235
248
|
it 'returns a list of projects' do
|
236
249
|
path = File.expand_path('../fixtures/generator_tests/multi_project', __FILE__)
|
237
|
-
expect(@generator.projects
|
250
|
+
expect(@generator.projects(path)).to eq %w(SamplePipeline1 SamplePipeline2 SamplePipeline3)
|
238
251
|
end
|
239
252
|
end
|
240
253
|
|
@@ -243,6 +256,13 @@ describe JenkinsPipelineBuilder::Generator do
|
|
243
256
|
allow(JenkinsPipelineBuilder.client).to receive(:plugin).and_return double(
|
244
257
|
list_installed: { 'description' => '20.0', 'git' => '20.0' })
|
245
258
|
end
|
259
|
+
after :each do
|
260
|
+
file_paths = ['out/xml/TemplatePipeline-10.xml',
|
261
|
+
'out/xml/TemplatePipeline-11.xml']
|
262
|
+
file_paths.each do |file_path|
|
263
|
+
File.delete(file_path) if File.exist?(file_path)
|
264
|
+
end
|
265
|
+
end
|
246
266
|
it 'generates xml and saves to disk without sending jobs to the server' do
|
247
267
|
job_name = 'TemplatePipeline'
|
248
268
|
path = File.expand_path('../fixtures/generator_tests/template_pipeline', __FILE__)
|
@@ -96,7 +96,7 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
|
|
96
96
|
end
|
97
97
|
|
98
98
|
it 'calls the xml block when executing the item' do
|
99
|
-
@ext.xml -> (_) {
|
99
|
+
@ext.xml -> (_) { raise XmlException, 'foo' }
|
100
100
|
|
101
101
|
expect do
|
102
102
|
JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
|
@@ -104,7 +104,7 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
|
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'calls the before block' do
|
107
|
-
@ext.before -> (_) {
|
107
|
+
@ext.before -> (_) { raise BeforeException, 'foo' }
|
108
108
|
|
109
109
|
expect do
|
110
110
|
JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
|
@@ -112,7 +112,7 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
|
|
112
112
|
end
|
113
113
|
|
114
114
|
it 'calls the after block' do
|
115
|
-
@ext.after -> (_) {
|
115
|
+
@ext.after -> (_) { raise AfterException, 'foo' }
|
116
116
|
|
117
117
|
expect do
|
118
118
|
JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, @n_xml)
|
@@ -132,7 +132,7 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
|
|
132
132
|
plugin_id 'unorderedTest'
|
133
133
|
|
134
134
|
before do
|
135
|
-
|
135
|
+
raise BeforeException, 'foo'
|
136
136
|
end
|
137
137
|
|
138
138
|
xml do
|
@@ -154,7 +154,7 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
|
|
154
154
|
plugin_id 'unorderedTest'
|
155
155
|
|
156
156
|
after do
|
157
|
-
|
157
|
+
raise AfterException, 'foo'
|
158
158
|
end
|
159
159
|
|
160
160
|
xml do
|
@@ -176,7 +176,7 @@ describe JenkinsPipelineBuilder::ModuleRegistry do
|
|
176
176
|
plugin_id 'unorderedTest'
|
177
177
|
|
178
178
|
xml do
|
179
|
-
|
179
|
+
raise XmlException, 'foo'
|
180
180
|
end
|
181
181
|
|
182
182
|
after do
|
@@ -82,25 +82,28 @@ describe JenkinsPipelineBuilder::PullRequestGenerator do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
context '#convert!' do
|
85
|
-
|
85
|
+
before(:each) do
|
86
86
|
stub_request(:get, url)
|
87
87
|
.with(headers: { 'Accept' => '*/*',
|
88
88
|
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
89
89
|
'Host' => 'github.com',
|
90
90
|
'User-Agent' => 'Ruby' })
|
91
91
|
.to_return(status: 200, body: open_prs_json, headers: {})
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'converts the job application name' do
|
92
95
|
collection = job_collection.clone
|
93
96
|
subject.convert! collection, 8
|
94
97
|
expect(collection.defaults[:value][:application_name]).to eq "#{application_name}-PR8"
|
95
98
|
end
|
96
99
|
|
100
|
+
it 'provides the PR number to the job settings' do
|
101
|
+
collection = job_collection.clone
|
102
|
+
subject.convert! collection, 8
|
103
|
+
expect(collection.defaults[:value][:pull_request_number]).to eq '8'
|
104
|
+
end
|
105
|
+
|
97
106
|
it 'overrides the git params' do
|
98
|
-
stub_request(:get, url)
|
99
|
-
.with(headers: { 'Accept' => '*/*',
|
100
|
-
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
101
|
-
'Host' => 'github.com',
|
102
|
-
'User-Agent' => 'Ruby' })
|
103
|
-
.to_return(status: 200, body: open_prs_json, headers: {})
|
104
107
|
pr = 8
|
105
108
|
collection = job_collection.clone
|
106
109
|
subject.convert! collection, pr
|
@@ -115,12 +118,6 @@ describe JenkinsPipelineBuilder::PullRequestGenerator do
|
|
115
118
|
end
|
116
119
|
|
117
120
|
it 'does not override extra params' do
|
118
|
-
stub_request(:get, url)
|
119
|
-
.with(headers: { 'Accept' => '*/*',
|
120
|
-
'Accept-Encoding' => 'gzip;q=1.0,deflate;q=0.6,identity;q=0.3',
|
121
|
-
'Host' => 'github.com',
|
122
|
-
'User-Agent' => 'Ruby' })
|
123
|
-
.to_return(status: 200, body: open_prs_json, headers: {})
|
124
121
|
pr = 8
|
125
122
|
collection = job_collection.clone
|
126
123
|
subject.convert! collection, pr
|
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.
|
4
|
+
version: 0.14.0
|
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:
|
12
|
+
date: 2016-02-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -166,7 +166,7 @@ dependencies:
|
|
166
166
|
- !ruby/object:Gem::Version
|
167
167
|
version: '0'
|
168
168
|
- !ruby/object:Gem::Dependency
|
169
|
-
name:
|
169
|
+
name: byebug
|
170
170
|
requirement: !ruby/object:Gem::Requirement
|
171
171
|
requirements:
|
172
172
|
- - ! '>='
|
@@ -412,6 +412,10 @@ files:
|
|
412
412
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline/project.yaml
|
413
413
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/jobs.tar.gz
|
414
414
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/project.yaml
|
415
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_json_files/project.json
|
416
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_json_files/view.json
|
417
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_yaml_files/project.yaml
|
418
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_yaml_files/view.yaml
|
415
419
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/project.json
|
416
420
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/view.yaml
|
417
421
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_job.xml
|
@@ -455,7 +459,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
455
459
|
version: '0'
|
456
460
|
requirements: []
|
457
461
|
rubyforge_project:
|
458
|
-
rubygems_version: 2.
|
462
|
+
rubygems_version: 2.5.1
|
459
463
|
signing_key:
|
460
464
|
specification_version: 4
|
461
465
|
summary: This gem is will boostrap your Jenkins pipelines
|
@@ -494,6 +498,10 @@ test_files:
|
|
494
498
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline/project.yaml
|
495
499
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/jobs.tar.gz
|
496
500
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/template_pipeline_nested/project.yaml
|
501
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_json_files/project.json
|
502
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_json_files/view.json
|
503
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_yaml_files/project.yaml
|
504
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_bad_yaml_files/view.yaml
|
497
505
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/project.json
|
498
506
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_combo_files/view.yaml
|
499
507
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_job.xml
|