jenkins_pipeline_builder 0.10.11 → 0.10.12
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 +1 -1
- data/lib/jenkins_pipeline_builder.rb +24 -1
- data/lib/jenkins_pipeline_builder/cli/helper.rb +14 -10
- data/lib/jenkins_pipeline_builder/extension_dsl.rb +21 -0
- data/lib/jenkins_pipeline_builder/extension_set.rb +174 -0
- data/lib/jenkins_pipeline_builder/extensions.rb +0 -175
- data/lib/jenkins_pipeline_builder/generator.rb +41 -370
- data/lib/jenkins_pipeline_builder/job.rb +128 -0
- data/lib/jenkins_pipeline_builder/job_collection.rb +112 -0
- data/lib/jenkins_pipeline_builder/module_registry.rb +1 -1
- data/lib/jenkins_pipeline_builder/pull_request.rb +1 -1
- data/lib/jenkins_pipeline_builder/remote_dependencies.rb +112 -0
- data/lib/jenkins_pipeline_builder/version.rb +1 -1
- data/lib/jenkins_pipeline_builder/view.rb +3 -3
- data/spec/lib/jenkins_pipeline_builder/cli/helper_spec.rb +1 -11
- data/spec/lib/jenkins_pipeline_builder/generator_spec.rb +26 -47
- data/spec/lib/jenkins_pipeline_builder/pull_request_spec.rb +1 -1
- data/spec/requests/pipeline_spec.rb +1 -1
- metadata +7 -2
@@ -0,0 +1,128 @@
|
|
1
|
+
module JenkinsPipelineBuilder
|
2
|
+
class Job
|
3
|
+
attr_accessor :job
|
4
|
+
|
5
|
+
def initialize(job)
|
6
|
+
@job = job
|
7
|
+
end
|
8
|
+
|
9
|
+
def name
|
10
|
+
job[:name]
|
11
|
+
end
|
12
|
+
|
13
|
+
def logger
|
14
|
+
JenkinsPipelineBuilder.logger
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_or_update
|
18
|
+
success, payload = to_xml
|
19
|
+
return success, payload unless success
|
20
|
+
xml = payload
|
21
|
+
if JenkinsPipelineBuilder.debug || JenkinsPipelineBuilder.file_mode
|
22
|
+
logger.info "Will create job #{job}"
|
23
|
+
logger.info "#{xml}" if @debug
|
24
|
+
FileUtils.mkdir_p(out_dir) unless File.exist?(out_dir)
|
25
|
+
File.open("#{out_dir}/#{name}.xml", 'w') { |f| f.write xml }
|
26
|
+
return [true, nil]
|
27
|
+
end
|
28
|
+
|
29
|
+
if JenkinsPipelineBuilder.client.job.exists?(name)
|
30
|
+
JenkinsPipelineBuilder.client.job.update(name, xml)
|
31
|
+
else
|
32
|
+
JenkinsPipelineBuilder.client.job.create(name, xml)
|
33
|
+
end
|
34
|
+
[true, nil]
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_xml
|
38
|
+
fail 'Job name is not specified' unless name
|
39
|
+
|
40
|
+
logger.info "Creating Yaml Job #{job}"
|
41
|
+
job[:job_type] = 'free_style' unless job[:job_type]
|
42
|
+
case job[:job_type]
|
43
|
+
when 'job_dsl'
|
44
|
+
@xml = setup_freestyle_base(job)
|
45
|
+
payload = update_job_dsl
|
46
|
+
when 'multi_project'
|
47
|
+
@xml = setup_freestyle_base(job)
|
48
|
+
payload = adjust_multi_project
|
49
|
+
when 'build_flow'
|
50
|
+
@xml = setup_freestyle_base(job)
|
51
|
+
payload = add_job_dsl
|
52
|
+
when 'free_style', 'pull_request_generator'
|
53
|
+
payload = setup_freestyle_base job
|
54
|
+
else
|
55
|
+
return false, "Job type: #{job[:job_type]} is not one of job_dsl, multi_project, build_flow or free_style"
|
56
|
+
end
|
57
|
+
|
58
|
+
[true, payload]
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def out_dir
|
64
|
+
'out/xml'
|
65
|
+
end
|
66
|
+
|
67
|
+
def update_job_dsl
|
68
|
+
n_xml = Nokogiri::XML(@xml)
|
69
|
+
n_builders = n_xml.xpath('//builders').first
|
70
|
+
Nokogiri::XML::Builder.with(n_builders) do |b_xml|
|
71
|
+
build_job_dsl(job, b_xml)
|
72
|
+
end
|
73
|
+
n_xml.to_xml
|
74
|
+
end
|
75
|
+
|
76
|
+
def build_job_dsl(job, xml)
|
77
|
+
xml.send('javaposse.jobdsl.plugin.ExecuteDslScripts') do
|
78
|
+
if job.key?(:job_dsl)
|
79
|
+
xml.scriptText job[:job_dsl]
|
80
|
+
xml.usingScriptText true
|
81
|
+
else
|
82
|
+
xml.targets job[:job_dsl_targets]
|
83
|
+
xml.usingScriptText false
|
84
|
+
end
|
85
|
+
xml.ignoreExisting false
|
86
|
+
xml.removedJobAction 'IGNORE'
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def adjust_multi_project
|
91
|
+
n_xml = Nokogiri::XML(@xml)
|
92
|
+
root = n_xml.root
|
93
|
+
root.name = 'com.tikal.jenkins.plugins.multijob.MultiJobProject'
|
94
|
+
n_xml.to_xml
|
95
|
+
end
|
96
|
+
|
97
|
+
def add_job_dsl
|
98
|
+
n_xml = Nokogiri::XML(@xml)
|
99
|
+
n_xml.root.name = 'com.cloudbees.plugins.flow.BuildFlow'
|
100
|
+
Nokogiri::XML::Builder.with(n_xml.root) do |b_xml|
|
101
|
+
b_xml.dsl job[:build_flow]
|
102
|
+
end
|
103
|
+
n_xml.to_xml
|
104
|
+
end
|
105
|
+
|
106
|
+
def setup_freestyle_base(params)
|
107
|
+
# I'm pretty unclear what these templates are...
|
108
|
+
if params.key?(:template)
|
109
|
+
template_name = params[:template]
|
110
|
+
fail "Job template '#{template_name}' can't be resolved." unless @job_templates.key?(template_name)
|
111
|
+
params.delete(:template)
|
112
|
+
template = @job_templates[template_name]
|
113
|
+
puts "Template found: #{template}"
|
114
|
+
params = template.deep_merge(params)
|
115
|
+
puts "Template merged: #{template}"
|
116
|
+
end
|
117
|
+
|
118
|
+
xml = JenkinsPipelineBuilder.client.job.build_freestyle_config(params)
|
119
|
+
n_xml = Nokogiri::XML(xml, &:noblanks)
|
120
|
+
|
121
|
+
logger.debug 'Loading the required modules'
|
122
|
+
JenkinsPipelineBuilder.registry.traverse_registry_path('job', params, n_xml)
|
123
|
+
logger.debug 'Module loading complete'
|
124
|
+
|
125
|
+
n_xml.to_xml
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module JenkinsPipelineBuilder
|
2
|
+
class JobCollection
|
3
|
+
attr_accessor :collection, :remote_dependencies
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@collection = {}
|
7
|
+
@remote_dependencies = RemoteDependencies.new self
|
8
|
+
end
|
9
|
+
|
10
|
+
def clear_remote_dependencies
|
11
|
+
@remote_dependencies = RemoteDependencies.new self
|
12
|
+
end
|
13
|
+
|
14
|
+
def logger
|
15
|
+
JenkinsPipelineBuilder.logger
|
16
|
+
end
|
17
|
+
|
18
|
+
def projects
|
19
|
+
result = []
|
20
|
+
collection.values.each do |item|
|
21
|
+
result << item if item[:type] == :project
|
22
|
+
end
|
23
|
+
result
|
24
|
+
end
|
25
|
+
|
26
|
+
def jobs
|
27
|
+
result = []
|
28
|
+
collection.values.each do |item|
|
29
|
+
result << item if item[:type] == :job
|
30
|
+
end
|
31
|
+
result
|
32
|
+
end
|
33
|
+
|
34
|
+
def defaults
|
35
|
+
collection.each_value do |item|
|
36
|
+
return item if item[:type] == 'defaults' || item[:type] == :defaults
|
37
|
+
end
|
38
|
+
# This is here for historical purposes
|
39
|
+
get_item('global')
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_item(name)
|
43
|
+
collection[name.to_s]
|
44
|
+
end
|
45
|
+
|
46
|
+
def load_from_path(path, remote = false)
|
47
|
+
load_extensions(path)
|
48
|
+
path = File.expand_path(path, Dir.getwd)
|
49
|
+
if File.directory?(path)
|
50
|
+
logger.info "Generating from folder #{path}"
|
51
|
+
Dir[File.join(path, '/*.{yaml,yml}')].each do |file|
|
52
|
+
logger.info "Loading file #{file}"
|
53
|
+
yaml = YAML.load_file(file)
|
54
|
+
load_file(yaml, remote)
|
55
|
+
end
|
56
|
+
Dir[File.join(path, '/*.json')].each do |file|
|
57
|
+
logger.info "Loading file #{file}"
|
58
|
+
json = JSON.parse(IO.read(file))
|
59
|
+
load_file(json, remote)
|
60
|
+
end
|
61
|
+
else
|
62
|
+
logger.info "Loading file #{path}"
|
63
|
+
if path.end_with? 'json'
|
64
|
+
hash = JSON.parse(IO.read(path))
|
65
|
+
else # elsif path.end_with?("yml") || path.end_with?("yaml")
|
66
|
+
hash = YAML.load_file(path)
|
67
|
+
end
|
68
|
+
load_file(hash, remote)
|
69
|
+
end
|
70
|
+
remote_dependencies.cleanup if remote
|
71
|
+
end
|
72
|
+
|
73
|
+
def load_file(yaml, remote = false)
|
74
|
+
yaml.each do |section|
|
75
|
+
Utils.symbolize_keys_deep!(section)
|
76
|
+
key = section.keys.first
|
77
|
+
value = section[key]
|
78
|
+
if key == :dependencies
|
79
|
+
logger.info 'Resolving Dependencies for remote project'
|
80
|
+
remote_dependencies.load value
|
81
|
+
next
|
82
|
+
end
|
83
|
+
name = value[:name]
|
84
|
+
if collection.key?(name)
|
85
|
+
existing_remote = collection[name.to_s][:remote]
|
86
|
+
# skip if the existing item is local and the new item is remote
|
87
|
+
if remote && !existing_remote
|
88
|
+
next
|
89
|
+
# override if the existing item is remote and the new is local
|
90
|
+
elsif existing_remote && !remote
|
91
|
+
logger.info "Duplicate item with name '#{name}' was detected from the remote folder."
|
92
|
+
else
|
93
|
+
fail "Duplicate item with name '#{name}' was detected."
|
94
|
+
end
|
95
|
+
end
|
96
|
+
collection[name.to_s] = { name: name.to_s, type: key, value: value, remote: remote }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def load_extensions(path)
|
101
|
+
path = "#{path}/extensions"
|
102
|
+
path = File.expand_path(path, Dir.getwd)
|
103
|
+
return unless File.directory?(path)
|
104
|
+
logger.info "Loading extensions from folder #{path}"
|
105
|
+
logger.info Dir.glob("#{path}/*.rb").inspect
|
106
|
+
Dir.glob("#{path}/*.rb").each do |file|
|
107
|
+
logger.info "Loaded #{file}"
|
108
|
+
require file
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -29,7 +29,7 @@ module JenkinsPipelineBuilder
|
|
29
29
|
|
30
30
|
def versions
|
31
31
|
# Return a hash with a default of 1000 so that we'll get the newest in debug
|
32
|
-
return Hash.new { |_| '1000.0' } if JenkinsPipelineBuilder.
|
32
|
+
return Hash.new { |_| '1000.0' } if JenkinsPipelineBuilder.debug
|
33
33
|
@versions ||= JenkinsPipelineBuilder.client.plugin.list_installed
|
34
34
|
end
|
35
35
|
|
@@ -56,7 +56,7 @@ module JenkinsPipelineBuilder
|
|
56
56
|
|
57
57
|
def override_git_2_params(job)
|
58
58
|
job[:value][:scm_params] ||= {}
|
59
|
-
job[:value][:scm_params][:changelog_to_branch] = { remote: 'origin', branch: 'pr
|
59
|
+
job[:value][:scm_params][:changelog_to_branch] = { remote: 'origin', branch: 'pr/{{pull_request_number}}/head' }
|
60
60
|
end
|
61
61
|
|
62
62
|
# Change the git branch for each job
|
@@ -0,0 +1,112 @@
|
|
1
|
+
module JenkinsPipelineBuilder
|
2
|
+
class RemoteDependencies
|
3
|
+
attr_reader :job_collection, :entries
|
4
|
+
|
5
|
+
def initialize(job_collection)
|
6
|
+
@entries = {}
|
7
|
+
@job_collection = job_collection
|
8
|
+
end
|
9
|
+
|
10
|
+
def logger
|
11
|
+
JenkinsPipelineBuilder.logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def cleanup
|
15
|
+
entries.each_value do |file|
|
16
|
+
FileUtils.rm_r file
|
17
|
+
FileUtils.rm_r "#{file}.tar"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# TODO: Look into remote jobs not working according to sinan
|
22
|
+
|
23
|
+
def load(dependencies)
|
24
|
+
### Load remote YAML
|
25
|
+
# Download Tar.gz
|
26
|
+
dependencies.each do |source|
|
27
|
+
source = source[:source]
|
28
|
+
url = source[:url]
|
29
|
+
|
30
|
+
file = "remote-#{entries.length}"
|
31
|
+
if entries[url]
|
32
|
+
file = entries[url]
|
33
|
+
else
|
34
|
+
opts = {}
|
35
|
+
opts = { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } if source[:verify_ssl] == false
|
36
|
+
download_yaml(url, file, opts)
|
37
|
+
end
|
38
|
+
|
39
|
+
path = File.expand_path(file, Dir.getwd)
|
40
|
+
# Load templates recursively
|
41
|
+
unless source[:templates]
|
42
|
+
logger.info 'No specific template specified'
|
43
|
+
# Try to load the folder or the pipeline folder
|
44
|
+
path = File.join(path, 'pipeline') if Dir.entries(path).include? 'pipeline'
|
45
|
+
return job_collection.load_from_path(path, true)
|
46
|
+
end
|
47
|
+
|
48
|
+
load_templates(path, source[:templates])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def load_template(path, template)
|
55
|
+
# If we specify what folder the yaml is in, load that
|
56
|
+
if template[:folder]
|
57
|
+
path = File.join(path, template[:folder])
|
58
|
+
else
|
59
|
+
path = File.join(path, template[:name]) unless template[:name] == 'default'
|
60
|
+
# If we are looking for the newest version or no version was set
|
61
|
+
if (template[:version].nil? || template[:version] == 'newest') && File.directory?(path)
|
62
|
+
folders = Dir.entries(path)
|
63
|
+
highest = folders.max
|
64
|
+
template[:version] = highest unless highest == 0
|
65
|
+
end
|
66
|
+
path = File.join(path, template[:version]) unless template[:version].nil?
|
67
|
+
path = File.join(path, 'pipeline')
|
68
|
+
end
|
69
|
+
|
70
|
+
if File.directory?(path)
|
71
|
+
logger.info "Loading from #{path}"
|
72
|
+
job_collection.load_from_path(path, true)
|
73
|
+
true
|
74
|
+
else
|
75
|
+
false
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def download_yaml(url, file, remote_opts = {})
|
80
|
+
entries[url] = file
|
81
|
+
logger.info "Downloading #{url} to #{file}.tar"
|
82
|
+
open("#{file}.tar", 'w') do |local_file|
|
83
|
+
open(url, remote_opts) do |remote_file|
|
84
|
+
local_file.write(Zlib::GzipReader.new(remote_file).read)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Extract Tar.gz to 'remote' folder
|
89
|
+
logger.info "Unpacking #{file}.tar to #{file} folder"
|
90
|
+
Archive::Tar::Minitar.unpack("#{file}.tar", file)
|
91
|
+
end
|
92
|
+
|
93
|
+
def load_templates(path, templates)
|
94
|
+
templates.each do |template|
|
95
|
+
version = template[:version] || 'newest'
|
96
|
+
logger.info "Loading #{template[:name]} at version #{version}"
|
97
|
+
# Move into the remote folder and look for the template folder
|
98
|
+
remote = Dir.entries(path)
|
99
|
+
if remote.include? template[:name]
|
100
|
+
# We found the template name, load this path
|
101
|
+
logger.info 'We found the template!'
|
102
|
+
load_template(path, template)
|
103
|
+
else
|
104
|
+
# Many cases we must dig one layer deep
|
105
|
+
remote.each do |file|
|
106
|
+
load_template(File.join(path, file), template)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -67,12 +67,12 @@ module JenkinsPipelineBuilder
|
|
67
67
|
def create(params)
|
68
68
|
# Name is a required parameter. Raise an error if not specified
|
69
69
|
fail ArgumentError, 'Name is required for creating view' unless params.is_a?(Hash) && params[:name]
|
70
|
-
clean_up_views(params) unless
|
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])
|
73
73
|
@logger.debug "Creating a #{params[:type]} view with params: #{params.inspect}"
|
74
74
|
|
75
|
-
if
|
75
|
+
if JenkinsPipelineBuilder.debug
|
76
76
|
# pp post_params(params)
|
77
77
|
return
|
78
78
|
end
|
@@ -156,7 +156,7 @@ module JenkinsPipelineBuilder
|
|
156
156
|
}.to_json
|
157
157
|
}
|
158
158
|
|
159
|
-
if
|
159
|
+
if JenkinsPipelineBuilder.debug
|
160
160
|
# pp initial_post_params
|
161
161
|
return
|
162
162
|
end
|
@@ -2,17 +2,6 @@ require File.expand_path('../../spec_helper', __FILE__)
|
|
2
2
|
|
3
3
|
describe JenkinsPipelineBuilder::CLI::Helper do
|
4
4
|
context '#setup' do
|
5
|
-
let(:generator) do
|
6
|
-
instance_double(
|
7
|
-
JenkinsPipelineBuilder::Generator,
|
8
|
-
:debug= => true
|
9
|
-
)
|
10
|
-
end
|
11
|
-
|
12
|
-
before(:each) do
|
13
|
-
allow(JenkinsPipelineBuilder).to receive(:generator).and_return(generator)
|
14
|
-
end
|
15
|
-
|
16
5
|
context 'username and password given' do
|
17
6
|
let(:options) do
|
18
7
|
{
|
@@ -92,6 +81,7 @@ describe JenkinsPipelineBuilder::CLI::Helper do
|
|
92
81
|
server_ip: :baz
|
93
82
|
}
|
94
83
|
expect(JenkinsPipelineBuilder).to receive(:credentials=).with(expected_options)
|
84
|
+
expect(JenkinsPipelineBuilder).to receive(:debug!).and_return true
|
95
85
|
described_class.setup(options)
|
96
86
|
end
|
97
87
|
|
@@ -1,11 +1,5 @@
|
|
1
1
|
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
|
3
|
-
def cleanup_compiled_xml(job_name)
|
4
|
-
Dir["#{@generator.out_dir}/#{job_name}*.xml"].each do |file|
|
5
|
-
File.delete(file)
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
3
|
describe JenkinsPipelineBuilder::Generator do
|
10
4
|
after :each do
|
11
5
|
JenkinsPipelineBuilder.registry.clear_versions
|
@@ -23,14 +17,13 @@ describe JenkinsPipelineBuilder::Generator do
|
|
23
17
|
end
|
24
18
|
|
25
19
|
after(:each) do
|
26
|
-
|
27
|
-
@generator.job_collection =
|
28
|
-
@generator.remote_depends = {}
|
20
|
+
JenkinsPipelineBuilder.no_debug!
|
21
|
+
@generator.job_collection = JenkinsPipelineBuilder::JobCollection.new
|
29
22
|
end
|
30
23
|
|
31
24
|
describe 'initialized in before(:example)' do
|
32
25
|
it 'creates a new generator' do
|
33
|
-
expect(@generator.job_collection).to be_empty
|
26
|
+
expect(@generator.job_collection.collection).to be_empty
|
34
27
|
expect(@generator.module_registry).not_to be_nil
|
35
28
|
end
|
36
29
|
|
@@ -38,23 +31,9 @@ describe JenkinsPipelineBuilder::Generator do
|
|
38
31
|
job_name = 'sample_job'
|
39
32
|
job_type = 'project'
|
40
33
|
job_value = {}
|
41
|
-
@generator.job_collection[job_name] = { name: job_name, type: job_type, value: job_value }
|
42
|
-
expect(@generator.job_collection).not_to be_empty
|
43
|
-
expect(@generator.job_collection[job_name]).not_to be_nil
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '#debug=' do
|
48
|
-
it 'sets debug mode to false' do
|
49
|
-
@generator.debug = false
|
50
|
-
expect(@generator.debug).to be false
|
51
|
-
expect(@generator.logger.level).to eq(Logger::INFO)
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'sets debug mode to true' do
|
55
|
-
@generator.debug = true
|
56
|
-
expect(@generator.debug).to be true
|
57
|
-
expect(@generator.logger.level).to eq(Logger::DEBUG)
|
34
|
+
@generator.job_collection.collection[job_name] = { name: job_name, type: job_type, value: job_value }
|
35
|
+
expect(@generator.job_collection.collection).not_to be_empty
|
36
|
+
expect(@generator.job_collection.collection[job_name]).not_to be_nil
|
58
37
|
end
|
59
38
|
end
|
60
39
|
|
@@ -79,9 +58,8 @@ describe JenkinsPipelineBuilder::Generator do
|
|
79
58
|
end
|
80
59
|
|
81
60
|
def bootstrap(fixture_path, job_name)
|
82
|
-
|
61
|
+
JenkinsPipelineBuilder.debug!
|
83
62
|
errors = @generator.bootstrap(fixture_path, job_name)
|
84
|
-
cleanup_compiled_xml(job_name)
|
85
63
|
errors
|
86
64
|
end
|
87
65
|
|
@@ -114,7 +92,7 @@ describe JenkinsPipelineBuilder::Generator do
|
|
114
92
|
it 'overrides the remote dependencies with local ones' do
|
115
93
|
errors = bootstrap(fixture_path('local_override/remote_and_local'), 'TemplatePipeline')
|
116
94
|
expect(errors).to be_empty
|
117
|
-
expect(@generator.job_collection['{{name}}-10'][:value][:description]).to eq('Overridden stuff')
|
95
|
+
expect(@generator.job_collection.collection['{{name}}-10'][:value][:description]).to eq('Overridden stuff')
|
118
96
|
end
|
119
97
|
|
120
98
|
it 'fails to override when there are duplicate local items' do
|
@@ -133,7 +111,7 @@ describe JenkinsPipelineBuilder::Generator do
|
|
133
111
|
before :each do
|
134
112
|
allow(JenkinsPipelineBuilder.client).to receive(:plugin).and_return double(
|
135
113
|
list_installed: { 'description' => '20.0', 'git' => '20.0' })
|
136
|
-
|
114
|
+
JenkinsPipelineBuilder.debug!
|
137
115
|
end
|
138
116
|
let(:jobs) do
|
139
117
|
{
|
@@ -174,7 +152,6 @@ describe JenkinsPipelineBuilder::Generator do
|
|
174
152
|
)
|
175
153
|
success = @generator.pull_request(path, job_name)
|
176
154
|
expect(success).to be_truthy
|
177
|
-
cleanup_compiled_xml(job_name)
|
178
155
|
end
|
179
156
|
|
180
157
|
it 'correclty creates jobs when there are multiple pulls open' do
|
@@ -196,18 +173,21 @@ describe JenkinsPipelineBuilder::Generator do
|
|
196
173
|
expect(JenkinsPipelineBuilder::PullRequestGenerator).to receive(:new).once.and_return(
|
197
174
|
double(purge: purge, create: create, jobs: jobs)
|
198
175
|
)
|
199
|
-
|
176
|
+
job1 = double name: 'job name'
|
177
|
+
job2 = double name: 'job name'
|
178
|
+
expect(JenkinsPipelineBuilder::Job).to receive(:new).once.with(
|
200
179
|
name: 'PullRequest-PR1-10-SampleJob', scm_branch: 'origin/pr/1/head', scm_params: {
|
201
180
|
refspec: 'refs/pull/*:refs/remotes/origin/pr/*'
|
202
181
|
}
|
203
|
-
)
|
204
|
-
expect(
|
182
|
+
).and_return job1
|
183
|
+
expect(JenkinsPipelineBuilder::Job).to receive(:new).once.with(
|
205
184
|
name: 'PullRequest-PR2-10-SampleJob', scm_branch: 'origin/pr/2/head', scm_params: {
|
206
185
|
refspec: 'refs/pull/*:refs/remotes/origin/pr/*'
|
207
186
|
}
|
208
|
-
)
|
187
|
+
).and_return job2
|
188
|
+
expect(job1).to receive(:create_or_update).and_return true
|
189
|
+
expect(job2).to receive(:create_or_update).and_return true
|
209
190
|
expect(@generator.pull_request(path, job_name)).to be_truthy
|
210
|
-
cleanup_compiled_xml(job_name)
|
211
191
|
end
|
212
192
|
# Things to check for
|
213
193
|
# Fail - no PR job type found
|
@@ -226,29 +206,28 @@ describe JenkinsPipelineBuilder::Generator do
|
|
226
206
|
}]
|
227
207
|
end
|
228
208
|
|
209
|
+
before :each do
|
210
|
+
expect(@generator.job_collection).to receive(:load_file).once.with(view_hash, false).and_return(true)
|
211
|
+
expect(@generator.job_collection).to receive(:load_file).once.with(project_hash, false).and_return(true)
|
212
|
+
end
|
213
|
+
|
229
214
|
it 'loads a yaml collection from a path' do
|
230
215
|
path = File.expand_path('../fixtures/generator_tests/test_yaml_files', __FILE__)
|
231
|
-
|
232
|
-
expect(@generator).to receive(:load_job_collection).once.with(project_hash, false).and_return(true)
|
233
|
-
@generator.send(:load_collection_from_path, path)
|
216
|
+
@generator.job_collection.send(:load_from_path, path)
|
234
217
|
end
|
235
218
|
it 'loads a json collection from a path' do
|
236
219
|
path = File.expand_path('../fixtures/generator_tests/test_json_files', __FILE__)
|
237
|
-
|
238
|
-
expect(@generator).to receive(:load_job_collection).once.with(project_hash, false).and_return(true)
|
239
|
-
@generator.send(:load_collection_from_path, path)
|
220
|
+
@generator.job_collection.send(:load_from_path, path)
|
240
221
|
end
|
241
222
|
it 'loads both yaml and json files from a path' do
|
242
223
|
path = File.expand_path('../fixtures/generator_tests/test_combo_files', __FILE__)
|
243
|
-
|
244
|
-
expect(@generator).to receive(:load_job_collection).once.with(project_hash, false).and_return(true)
|
245
|
-
@generator.send(:load_collection_from_path, path)
|
224
|
+
@generator.job_collection.send(:load_from_path, path)
|
246
225
|
end
|
247
226
|
end
|
248
227
|
|
249
228
|
describe '#dump' do
|
250
229
|
it "writes a job's config XML to a file" do
|
251
|
-
|
230
|
+
JenkinsPipelineBuilder.debug!
|
252
231
|
job_name = 'test_job'
|
253
232
|
body = ''
|
254
233
|
test_path = File.expand_path('../fixtures/generator_tests', __FILE__)
|