jenkins_pipeline_builder 0.10.5 → 0.10.6
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 -0
- data/lib/jenkins_pipeline_builder.rb +1 -0
- data/lib/jenkins_pipeline_builder/cli/base.rb +1 -1
- data/lib/jenkins_pipeline_builder/cli/helper.rb +18 -4
- data/lib/jenkins_pipeline_builder/generator.rb +4 -4
- data/lib/jenkins_pipeline_builder/pull_request.rb +1 -60
- data/lib/jenkins_pipeline_builder/pull_request_generator.rb +81 -0
- data/lib/jenkins_pipeline_builder/version.rb +1 -1
- data/spec/lib/jenkins_pipeline_builder/cli/helper_spec.rb +105 -0
- data/spec/lib/jenkins_pipeline_builder/fixtures/sample_creds.json +6 -0
- data/spec/lib/jenkins_pipeline_builder/fixtures/sample_creds.yaml +4 -0
- data/spec/lib/jenkins_pipeline_builder/generator_spec.rb +52 -16
- data/spec/lib/jenkins_pipeline_builder/pull_request_generator_spec.rb +30 -0
- data/spec/lib/jenkins_pipeline_builder/pull_request_spec.rb +3 -31
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OGVhNGM1N2I0MzllNGY3NWQwZTE4ODUyYTBlNjg3M2UyZjQyYmMzOQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YjJlYTdjNTFhYTdlODVkMWEwNjI3MWE3YmE1MzA4ZjhlM2Y1MTY3Mw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NjU5YzFhZTQ0MmYyZjlmOTBiZGM2OTQ5YmNiZDM1YWUyZWZhNTRjNTZhOWY3
|
10
|
+
NzIzZGI4MTMwZDJhZmE1YjJjNDNmOTY1NmU5OTEzNjE1YmZlMjBiNzNhMjU2
|
11
|
+
YTlkNDU3MjliODdlYzUzODg3OGIwNjQ0NzA2ZGI2NjQyZTdhZmM=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZWRmODUwZmFkZDQ1N2ZmZGJkNDU3ZDc1OGM1MTU5OGVlMWNiMGJmNTc3ODg2
|
14
|
+
N2FjNTJlYjllOWZmMjEzM2U5MmEzNzdkMTExYmRhZjI0MGI4NDE5ZmZmM2U5
|
15
|
+
ODU4Y2JlZjI5MWI3YWZlMDdlYTViMWI3ZGJmNThlZWM2NjkzNjA=
|
data/.rubocop.yml
CHANGED
@@ -29,6 +29,7 @@ Metrics/LineLength:
|
|
29
29
|
- 'spec/lib/jenkins_pipeline_builder/compiler_spec.rb'
|
30
30
|
- 'spec/lib/jenkins_pipeline_builder/view_spec.rb'
|
31
31
|
- 'spec/lib/jenkins_pipeline_builder/pull_request_spec.rb'
|
32
|
+
- 'spec/lib/jenkins_pipeline_builder/pull_request_generator_spec.rb'
|
32
33
|
- 'lib/jenkins_pipeline_builder/extensions/*'
|
33
34
|
|
34
35
|
# Configuration parameters: CountComments.
|
@@ -27,6 +27,7 @@ require 'jenkins_pipeline_builder/version'
|
|
27
27
|
require 'jenkins_pipeline_builder/utils'
|
28
28
|
require 'jenkins_pipeline_builder/compiler'
|
29
29
|
require 'jenkins_pipeline_builder/module_registry'
|
30
|
+
require 'jenkins_pipeline_builder/pull_request_generator'
|
30
31
|
require 'jenkins_pipeline_builder/pull_request'
|
31
32
|
require 'jenkins_pipeline_builder/view'
|
32
33
|
require 'jenkins_pipeline_builder/generator'
|
@@ -28,7 +28,7 @@ module JenkinsPipelineBuilder
|
|
28
28
|
class_option :username, aliases: '-u', desc: 'Name of Jenkins user'
|
29
29
|
class_option :password, aliases: '-p', desc: 'Password of Jenkins user'
|
30
30
|
class_option :password_base64, aliases: '-b', desc: 'Base 64 encoded password of Jenkins user'
|
31
|
-
class_option :
|
31
|
+
class_option :server, aliases: '-s', desc: 'Jenkins server IP address or URL'
|
32
32
|
class_option :server_port, aliases: '-o', desc: 'Jenkins port'
|
33
33
|
class_option :creds_file, aliases: '-c', desc: 'Credentials file for communicating with Jenkins server'
|
34
34
|
class_option :debug, type: :boolean, aliases: '-d', desc: 'Run in debug mode (no Jenkins changes)', default: false
|
@@ -40,9 +40,8 @@ module JenkinsPipelineBuilder
|
|
40
40
|
# @return [JenkinsPipelineBuilder::Generator] A new Client object
|
41
41
|
#
|
42
42
|
def self.setup(options)
|
43
|
-
if options[:username] && options[:
|
44
|
-
|
45
|
-
creds = options
|
43
|
+
if options[:username] && options[:server] && (options[:password] || options[:password_base64])
|
44
|
+
creds = process_cli_creds(options)
|
46
45
|
elsif options[:creds_file]
|
47
46
|
if options[:creds_file].end_with? 'json'
|
48
47
|
creds = JSON.parse(IO.read(File.expand_path(options[:creds_file])))
|
@@ -58,7 +57,7 @@ module JenkinsPipelineBuilder
|
|
58
57
|
else
|
59
58
|
msg = 'Credentials are not set. Please pass them as parameters or'
|
60
59
|
msg << ' set them in the default credentials file'
|
61
|
-
puts msg
|
60
|
+
$stderr.puts msg
|
62
61
|
exit 1
|
63
62
|
end
|
64
63
|
|
@@ -67,6 +66,21 @@ module JenkinsPipelineBuilder
|
|
67
66
|
generator.debug = options[:debug]
|
68
67
|
generator
|
69
68
|
end
|
69
|
+
|
70
|
+
def self.process_cli_creds(options)
|
71
|
+
creds = {}.with_indifferent_access.merge options
|
72
|
+
if creds[:server] =~ Resolv::AddressRegex
|
73
|
+
creds[:server_ip] = creds.delete :server
|
74
|
+
elsif creds[:server] =~ URI.regexp
|
75
|
+
creds[:server_url] = creds.delete :server
|
76
|
+
else
|
77
|
+
msg = "server given (#{creds[:server]}) is neither a URL nor an IP."
|
78
|
+
msg << ' Please pass either a valid IP address or valid URI'
|
79
|
+
$stderr.puts msg
|
80
|
+
exit 1
|
81
|
+
end
|
82
|
+
creds
|
83
|
+
end
|
70
84
|
end
|
71
85
|
end
|
72
86
|
end
|
@@ -119,6 +119,10 @@ module JenkinsPipelineBuilder
|
|
119
119
|
File.open(job_name + '.xml', 'w') { |f| f.write xml }
|
120
120
|
end
|
121
121
|
|
122
|
+
def out_dir
|
123
|
+
'out/xml'
|
124
|
+
end
|
125
|
+
|
122
126
|
#
|
123
127
|
# BEGIN PRIVATE METHODS
|
124
128
|
#
|
@@ -618,9 +622,5 @@ module JenkinsPipelineBuilder
|
|
618
622
|
xml.removedJobAction 'IGNORE'
|
619
623
|
end
|
620
624
|
end
|
621
|
-
|
622
|
-
def out_dir
|
623
|
-
'out/xml'
|
624
|
-
end
|
625
625
|
end
|
626
626
|
end
|
@@ -19,66 +19,7 @@
|
|
19
19
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
20
|
# THE SOFTWARE.
|
21
21
|
#
|
22
|
-
|
23
22
|
module JenkinsPipelineBuilder
|
24
|
-
class PullRequestGenerator
|
25
|
-
attr_reader :purge
|
26
|
-
attr_reader :create
|
27
|
-
attr_reader :jobs
|
28
|
-
|
29
|
-
def initialize(project, jobs, pull_job)
|
30
|
-
@purge = []
|
31
|
-
@create = []
|
32
|
-
@jobs = {}
|
33
|
-
|
34
|
-
pull_requests = check_for_pull pull_job
|
35
|
-
purge_old(pull_requests, project)
|
36
|
-
pull_requests.each do |number|
|
37
|
-
# Manipulate the YAML
|
38
|
-
req = JenkinsPipelineBuilder::PullRequest.new(project, number, jobs, pull_job)
|
39
|
-
@jobs.merge! req.jobs
|
40
|
-
project_new = req.project
|
41
|
-
|
42
|
-
# Overwrite the jobs from the generator to the project
|
43
|
-
project_new[:value][:jobs] = req.jobs.keys
|
44
|
-
@create << project_new
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
private
|
49
|
-
|
50
|
-
# Check for Github Pull Requests
|
51
|
-
#
|
52
|
-
# args[:git_url] URL to the github main page ex. https://www.github.com/
|
53
|
-
# args[:git_repo] Name of repo only, not url ex. jenkins_pipeline_builder
|
54
|
-
# args[:git_org] The Orig user ex. constantcontact
|
55
|
-
# @return = array of pull request numbers
|
56
|
-
def check_for_pull(args)
|
57
|
-
fail 'Please specify all arguments' unless args[:git_url] && args[:git_org] && args[:git_repo]
|
58
|
-
# Build the Git URL
|
59
|
-
git_url = "#{args[:git_url]}api/v3/repos/#{args[:git_org]}/#{args[:git_repo]}/pulls"
|
60
|
-
|
61
|
-
# Download the JSON Data from the API
|
62
|
-
resp = Net::HTTP.get_response(URI.parse(git_url))
|
63
|
-
pulls = JSON.parse(resp.body)
|
64
|
-
pulls.map { |p| p['number'] }
|
65
|
-
end
|
66
|
-
|
67
|
-
# Purge old builds
|
68
|
-
def purge_old(pull_requests, project)
|
69
|
-
reqs = pull_requests.clone.map { |req| "#{project[:name]}-PR#{req}" }
|
70
|
-
# Read File
|
71
|
-
old_requests = File.new('pull_requests.csv', 'a+').read.split(',')
|
72
|
-
|
73
|
-
# Pop off current pull requests
|
74
|
-
old_requests.delete_if { |req| reqs.include?("#{req}") }
|
75
|
-
@purge = old_requests
|
76
|
-
|
77
|
-
# Write File
|
78
|
-
File.open('pull_requests.csv', 'w+') { |file| file.write reqs.join(',') }
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
23
|
class PullRequest
|
83
24
|
attr_reader :project # The root project YAML as a hash
|
84
25
|
attr_reader :number # The pull request number
|
@@ -117,7 +58,7 @@ module JenkinsPipelineBuilder
|
|
117
58
|
# Change the git branch for each job
|
118
59
|
def change_git!
|
119
60
|
@jobs.each_value do |job|
|
120
|
-
job[:value][:scm_branch] =
|
61
|
+
job[:value][:scm_branch] = 'origin/pr/{{pull_request_number}}/head'
|
121
62
|
job[:value][:scm_params] = {} unless job[:value][:scm_params]
|
122
63
|
job[:value][:scm_params][:refspec] = 'refs/pull/*:refs/remotes/origin/pr/*'
|
123
64
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2014 Constant Contact
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in
|
12
|
+
# all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#
|
22
|
+
|
23
|
+
module JenkinsPipelineBuilder
|
24
|
+
class PullRequestGenerator
|
25
|
+
attr_reader :purge
|
26
|
+
attr_reader :create
|
27
|
+
attr_reader :jobs
|
28
|
+
|
29
|
+
def initialize(project, jobs, pull_job)
|
30
|
+
@purge = []
|
31
|
+
@create = []
|
32
|
+
@jobs = {}
|
33
|
+
|
34
|
+
pull_requests = check_for_pull pull_job
|
35
|
+
purge_old(pull_requests, project)
|
36
|
+
pull_requests.each do |number|
|
37
|
+
# Manipulate the YAML
|
38
|
+
req = JenkinsPipelineBuilder::PullRequest.new(project, number, jobs, pull_job)
|
39
|
+
@jobs.merge! req.jobs
|
40
|
+
project_new = req.project
|
41
|
+
|
42
|
+
# Overwrite the jobs from the generator to the project
|
43
|
+
project_new[:value][:jobs] = req.jobs.keys
|
44
|
+
@create << project_new
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
# Check for Github Pull Requests
|
51
|
+
#
|
52
|
+
# args[:git_url] URL to the github main page ex. https://www.github.com/
|
53
|
+
# args[:git_repo] Name of repo only, not url ex. jenkins_pipeline_builder
|
54
|
+
# args[:git_org] The Orig user ex. constantcontact
|
55
|
+
# @return = array of pull request numbers
|
56
|
+
def check_for_pull(args)
|
57
|
+
fail 'Please specify all arguments' unless args[:git_url] && args[:git_org] && args[:git_repo]
|
58
|
+
# Build the Git URL
|
59
|
+
git_url = "#{args[:git_url]}api/v3/repos/#{args[:git_org]}/#{args[:git_repo]}/pulls"
|
60
|
+
|
61
|
+
# Download the JSON Data from the API
|
62
|
+
resp = Net::HTTP.get_response(URI.parse(git_url))
|
63
|
+
pulls = JSON.parse(resp.body)
|
64
|
+
pulls.map { |p| p['number'] }
|
65
|
+
end
|
66
|
+
|
67
|
+
# Purge old builds
|
68
|
+
def purge_old(pull_requests, project)
|
69
|
+
reqs = pull_requests.clone.map { |req| "#{project[:name]}-PR#{req}" }
|
70
|
+
# Read File
|
71
|
+
old_requests = File.new('pull_requests.csv', 'a+').read.split(',')
|
72
|
+
|
73
|
+
# Pop off current pull requests
|
74
|
+
old_requests.delete_if { |req| reqs.include?("#{req}") }
|
75
|
+
@purge = old_requests
|
76
|
+
|
77
|
+
# Write File
|
78
|
+
File.open('pull_requests.csv', 'w+') { |file| file.write reqs.join(',') }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe JenkinsPipelineBuilder::CLI::Helper do
|
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
|
+
context 'username and password given' do
|
17
|
+
let(:options) do
|
18
|
+
{
|
19
|
+
username: 'username',
|
20
|
+
password: 'password'
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:expected_options) do
|
25
|
+
{
|
26
|
+
username: 'username',
|
27
|
+
password: 'password'
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should handle server arg being an ipv4 address' do
|
32
|
+
expect(JenkinsPipelineBuilder).to receive(:credentials=).with(expected_options)
|
33
|
+
options[:server] = '127.0.0.1'
|
34
|
+
expected_options[:server_ip] = '127.0.0.1'
|
35
|
+
described_class.setup(options)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should handle server arg being an ipv6 address' do
|
39
|
+
expect(JenkinsPipelineBuilder).to receive(:credentials=).with(expected_options)
|
40
|
+
options[:server] = '::1'
|
41
|
+
expected_options[:server_ip] = '::1'
|
42
|
+
described_class.setup(options)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should handle server arg being a url' do
|
46
|
+
expect(JenkinsPipelineBuilder).to receive(:credentials=).with(expected_options)
|
47
|
+
options[:server] = 'https://localhost.localdomain'
|
48
|
+
expected_options[:server_url] = 'https://localhost.localdomain'
|
49
|
+
described_class.setup(options)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should puts an error to stdout and exit if server is invalid' do
|
53
|
+
options[:server] = 'not_valid_at_all'
|
54
|
+
expect($stderr).to receive(:puts).with(/server given \(not_valid_at_all\)/)
|
55
|
+
expect { described_class.setup(options) }.to raise_error(SystemExit, 'exit')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context 'credential file given' do
|
60
|
+
let(:creds_file_base) { 'spec/lib/jenkins_pipeline_builder/fixtures/sample_creds' }
|
61
|
+
|
62
|
+
let(:expected_options) do
|
63
|
+
{
|
64
|
+
'username' => 'username',
|
65
|
+
'password' => 'password',
|
66
|
+
'server_url' => 'https://localhost.localdomain',
|
67
|
+
'server_port' => 8080
|
68
|
+
}
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'should handle credentials passed as a yaml file' do
|
72
|
+
options = {
|
73
|
+
creds_file: "#{creds_file_base}.yaml"
|
74
|
+
}
|
75
|
+
expect(JenkinsPipelineBuilder).to receive(:credentials=).with(expected_options)
|
76
|
+
described_class.setup(options)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should handle credentials passed as a json file' do
|
80
|
+
options = {
|
81
|
+
creds_file: "#{creds_file_base}.json"
|
82
|
+
}
|
83
|
+
expect(JenkinsPipelineBuilder).to receive(:credentials=).with(expected_options)
|
84
|
+
described_class.setup(options)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'should handle the debug flag' do
|
88
|
+
options = { debug: true }
|
89
|
+
expected_options = {
|
90
|
+
username: :foo,
|
91
|
+
password: :bar,
|
92
|
+
server_ip: :baz
|
93
|
+
}
|
94
|
+
expect(JenkinsPipelineBuilder).to receive(:credentials=).with(expected_options)
|
95
|
+
described_class.setup(options)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should puts and error to stdout and exit if no credentials are passed' do
|
99
|
+
expect(File).to receive(:exist?).and_return(false)
|
100
|
+
expect($stderr).to receive(:puts).with(/Credentials are not set/)
|
101
|
+
expect { described_class.setup({}) }.to raise_error(SystemExit, 'exit')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
|
3
3
|
def cleanup_compiled_xml(job_name)
|
4
|
-
Dir["#{job_name}*.xml"].each do |file|
|
4
|
+
Dir["#{@generator.out_dir}/#{job_name}*.xml"].each do |file|
|
5
5
|
File.delete(file)
|
6
6
|
end
|
7
7
|
end
|
@@ -133,7 +133,24 @@ describe JenkinsPipelineBuilder::Generator do
|
|
133
133
|
before :each do
|
134
134
|
allow(JenkinsPipelineBuilder.client).to receive(:plugin).and_return double(
|
135
135
|
list_installed: { 'description' => '20.0', 'git' => '20.0' })
|
136
|
+
@generator.debug = true
|
136
137
|
end
|
138
|
+
let(:jobs) do
|
139
|
+
{
|
140
|
+
'{{name}}-10-SampleJob' => {
|
141
|
+
name: '{{name}}-10-SampleJob',
|
142
|
+
type: :job,
|
143
|
+
value: {
|
144
|
+
name: '{{name}}-10-SampleJob',
|
145
|
+
scm_branch: 'origin/pr/{{pull_request_number}}/head',
|
146
|
+
scm_params: {
|
147
|
+
refspec: 'refs/pull/*:refs/remotes/origin/pr/*'
|
148
|
+
}
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
end
|
153
|
+
let(:path) { File.expand_path('../fixtures/generator_tests/pullrequest_pipeline', __FILE__) }
|
137
154
|
it 'produces no errors while creating pipeline PullRequest' do
|
138
155
|
# Dummy data
|
139
156
|
purge = []
|
@@ -143,29 +160,15 @@ describe JenkinsPipelineBuilder::Generator do
|
|
143
160
|
type: :project,
|
144
161
|
value: {
|
145
162
|
name: 'PullRequest-PR1',
|
163
|
+
pull_request_number: '1',
|
146
164
|
jobs: [
|
147
165
|
'{{name}}-10-SampleJob'
|
148
166
|
]
|
149
167
|
}
|
150
168
|
}
|
151
169
|
]
|
152
|
-
jobs = {
|
153
|
-
'{{name}}-10-SampleJob' => {
|
154
|
-
name: '{{name}}-10-SampleJob',
|
155
|
-
type: :job,
|
156
|
-
value: {
|
157
|
-
name: '{{name}}-10-SampleJob',
|
158
|
-
scm_branch: 'origin/pr/2/head',
|
159
|
-
scm_params: {
|
160
|
-
refspec: 'refs/pull/*:refs/remotes/origin/pr/*'
|
161
|
-
}
|
162
|
-
}
|
163
|
-
}
|
164
|
-
}
|
165
170
|
# Run the test
|
166
|
-
@generator.debug = true
|
167
171
|
job_name = 'PullRequest'
|
168
|
-
path = File.expand_path('../fixtures/generator_tests/pullrequest_pipeline', __FILE__)
|
169
172
|
expect(JenkinsPipelineBuilder::PullRequestGenerator).to receive(:new).once.and_return(
|
170
173
|
double(purge: purge, create: create, jobs: jobs)
|
171
174
|
)
|
@@ -173,6 +176,39 @@ describe JenkinsPipelineBuilder::Generator do
|
|
173
176
|
expect(success).to be_truthy
|
174
177
|
cleanup_compiled_xml(job_name)
|
175
178
|
end
|
179
|
+
|
180
|
+
it 'correclty creates jobs when there are multiple pulls open' do
|
181
|
+
purge = []
|
182
|
+
create = %w(1 2).map do |n|
|
183
|
+
{
|
184
|
+
name: "PullRequest-PR#{n}",
|
185
|
+
type: :project,
|
186
|
+
value: {
|
187
|
+
pull_request_number: n,
|
188
|
+
name: "PullRequest-PR#{n}",
|
189
|
+
jobs: [
|
190
|
+
'{{name}}-10-SampleJob'
|
191
|
+
]
|
192
|
+
}
|
193
|
+
}
|
194
|
+
end
|
195
|
+
job_name = 'PullRequest'
|
196
|
+
expect(JenkinsPipelineBuilder::PullRequestGenerator).to receive(:new).once.and_return(
|
197
|
+
double(purge: purge, create: create, jobs: jobs)
|
198
|
+
)
|
199
|
+
expect(@generator).to receive(:compile_job_to_xml).once.with(
|
200
|
+
name: 'PullRequest-PR1-10-SampleJob', scm_branch: 'origin/pr/1/head', scm_params: {
|
201
|
+
refspec: 'refs/pull/*:refs/remotes/origin/pr/*'
|
202
|
+
}
|
203
|
+
)
|
204
|
+
expect(@generator).to receive(:compile_job_to_xml).once.with(
|
205
|
+
name: 'PullRequest-PR2-10-SampleJob', scm_branch: 'origin/pr/2/head', scm_params: {
|
206
|
+
refspec: 'refs/pull/*:refs/remotes/origin/pr/*'
|
207
|
+
}
|
208
|
+
)
|
209
|
+
expect(@generator.pull_request(path, job_name)).to be_truthy
|
210
|
+
cleanup_compiled_xml(job_name)
|
211
|
+
end
|
176
212
|
# Things to check for
|
177
213
|
# Fail - no PR job type found
|
178
214
|
# Encounters failure during build process
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require 'webmock/rspec'
|
3
|
+
|
4
|
+
describe JenkinsPipelineBuilder::PullRequestGenerator do
|
5
|
+
let(:pull_request_generator) { JenkinsPipelineBuilder::PullRequestGenerator }
|
6
|
+
let(:project) { { name: 'pull_req_test', type: :project, value: { name: 'pull_req_test', jobs: ['{{name}}-00', '{{name}}-10', '{{name}}-11'] } } }
|
7
|
+
let(:jobs) { { '{{name}}-10' => { name: '{{name}}-10', type: :'job-template', value: { name: '{{name}}-10', description: '{{description}}', publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }] } }, '{{name}}-11' => { name: '{{name}}-11', type: :'job-template', value: { name: '{{name}}-11', description: '{{description}}' } } } }
|
8
|
+
let(:create_jobs) { [{ name: 'pull_req_test-PR5', type: :project, value: { name: 'pull_req_test-PR5', jobs: ['{{name}}-10', '{{name}}-11'], pull_request_number: '5' } }, { name: 'pull_req_test-PR6', type: :project, value: { name: 'pull_req_test-PR6', jobs: ['{{name}}-10', '{{name}}-11'], pull_request_number: '6' } }] }
|
9
|
+
let(:pull_request) { { name: '{{name}}-00', type: :job, name: '{{name}}-00', job_type: 'pull_request_generator', git_url: 'https://www.github.com/', git_repo: 'jenkins_pipeline_builder', git_org: 'constantcontact', jobs: ['{{name}}-10', '{{name}}-11'], builders: [{ shell_command: 'generate -v || gem install jenkins_pipeline_builder\ngenerate pipeline -c config/{{login_config}} pull_request pipeline/ {{name}}\n' }] } }
|
10
|
+
before do
|
11
|
+
# Request to get current pull requests from github
|
12
|
+
stub_request(:any, 'https://www.github.com/api/v3/repos/constantcontact/jenkins_pipeline_builder/pulls').to_return(body: '[{"number": 5,"state": "open","title": "Update README again" },{"number": 6,"state": "open", "title": "Update README again2"}]')
|
13
|
+
stub_request(:any, 'http://username:password@127.0.0.1:8080/api/json').to_return(body: '{"assignedLabels":[{}],"mode":"NORMAL","nodeDescription":"the master Jenkins node","nodeName":"","numExecutors":2,"description":null,"jobs":[{"name":"PurgeTest-PR1","url":"http://localhost:8080/job/PurgeTest-PR1/","color":"notbuilt" },{"name":"PurgeTest-PR3","url":"http://localhost:8080/job/PurgeTest-PR3/","color":"notbuilt" },{"name":"PurgeTest-PR4","url":"http://localhost:8080/job/PurgeTest-PR4/","color":"notbuilt"}],"overallLoad":{},"primaryView":{"name":"All","url":"http://localhost:8080/" },"quietingDown":false,"slaveAgentPort":0,"unlabeledLoad":{},"useCrumbs":false,"useSecurity":true,"views":[{"name":"All","url":"http://localhost:8080/"}]}')
|
14
|
+
end
|
15
|
+
describe '#initialize' do
|
16
|
+
after(:all) do
|
17
|
+
FileUtils.rm_r 'pull_requests.csv'
|
18
|
+
end
|
19
|
+
it 'can work without a csv' do
|
20
|
+
pull = pull_request_generator.new(project, jobs, pull_request)
|
21
|
+
expect(pull.purge.count).to eq(0)
|
22
|
+
expect(pull.create).to eq(create_jobs)
|
23
|
+
end
|
24
|
+
it 'can work with a csv' do
|
25
|
+
pull = pull_request_generator.new(project, jobs, pull_request)
|
26
|
+
expect(pull.purge.count).to eq(0)
|
27
|
+
expect(pull.create).to eq(create_jobs)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,34 +1,6 @@
|
|
1
1
|
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
require 'webmock/rspec'
|
3
3
|
|
4
|
-
describe JenkinsPipelineBuilder::PullRequestGenerator do
|
5
|
-
let(:pull_request_generator) { JenkinsPipelineBuilder::PullRequestGenerator }
|
6
|
-
let(:project) { { name: 'pull_req_test', type: :project, value: { name: 'pull_req_test', jobs: ['{{name}}-00', '{{name}}-10', '{{name}}-11'] } } }
|
7
|
-
let(:jobs) { { '{{name}}-10' => { name: '{{name}}-10', type: :'job-template', value: { name: '{{name}}-10', description: '{{description}}', publishers: [{ downstream: { project: '{{job@{{name}}-11}}' } }] } }, '{{name}}-11' => { name: '{{name}}-11', type: :'job-template', value: { name: '{{name}}-11', description: '{{description}}' } } } }
|
8
|
-
let(:create_jobs) { [{ name: 'pull_req_test-PR5', type: :project, value: { name: 'pull_req_test-PR5', jobs: ['{{name}}-10', '{{name}}-11'], pull_request_number: '5' } }, { name: 'pull_req_test-PR6', type: :project, value: { name: 'pull_req_test-PR6', jobs: ['{{name}}-10', '{{name}}-11'], pull_request_number: '6' } }] }
|
9
|
-
let(:pull_request) { { name: '{{name}}-00', type: :job, name: '{{name}}-00', job_type: 'pull_request_generator', git_url: 'https://www.github.com/', git_repo: 'jenkins_pipeline_builder', git_org: 'constantcontact', jobs: ['{{name}}-10', '{{name}}-11'], builders: [{ shell_command: 'generate -v || gem install jenkins_pipeline_builder\ngenerate pipeline -c config/{{login_config}} pull_request pipeline/ {{name}}\n' }] } }
|
10
|
-
before do
|
11
|
-
# Request to get current pull requests from github
|
12
|
-
stub_request(:any, 'https://www.github.com/api/v3/repos/constantcontact/jenkins_pipeline_builder/pulls').to_return(body: '[{"number": 5,"state": "open","title": "Update README again" },{"number": 6,"state": "open", "title": "Update README again2"}]')
|
13
|
-
stub_request(:any, 'http://username:password@127.0.0.1:8080/api/json').to_return(body: '{"assignedLabels":[{}],"mode":"NORMAL","nodeDescription":"the master Jenkins node","nodeName":"","numExecutors":2,"description":null,"jobs":[{"name":"PurgeTest-PR1","url":"http://localhost:8080/job/PurgeTest-PR1/","color":"notbuilt" },{"name":"PurgeTest-PR3","url":"http://localhost:8080/job/PurgeTest-PR3/","color":"notbuilt" },{"name":"PurgeTest-PR4","url":"http://localhost:8080/job/PurgeTest-PR4/","color":"notbuilt"}],"overallLoad":{},"primaryView":{"name":"All","url":"http://localhost:8080/" },"quietingDown":false,"slaveAgentPort":0,"unlabeledLoad":{},"useCrumbs":false,"useSecurity":true,"views":[{"name":"All","url":"http://localhost:8080/"}]}')
|
14
|
-
end
|
15
|
-
describe '#initialize' do
|
16
|
-
after(:all) do
|
17
|
-
FileUtils.rm_r 'pull_requests.csv'
|
18
|
-
end
|
19
|
-
it 'can work without a csv' do
|
20
|
-
pull = pull_request_generator.new(project, jobs, pull_request)
|
21
|
-
expect(pull.purge.count).to eq(0)
|
22
|
-
expect(pull.create).to eq(create_jobs)
|
23
|
-
end
|
24
|
-
it 'can work with a csv' do
|
25
|
-
pull = pull_request_generator.new(project, jobs, pull_request)
|
26
|
-
expect(pull.purge.count).to eq(0)
|
27
|
-
expect(pull.create).to eq(create_jobs)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
4
|
describe JenkinsPipelineBuilder::PullRequest do
|
33
5
|
let(:pull_request_class) { JenkinsPipelineBuilder::PullRequest }
|
34
6
|
let(:project) { { name: 'pull_req_test', type: :project, value: { name: 'pull_req_test', jobs: ['{{name}}-00', '{{name}}-10', '{{name}}-11'] } } }
|
@@ -37,7 +9,7 @@ describe JenkinsPipelineBuilder::PullRequest do
|
|
37
9
|
describe '#initialize' do
|
38
10
|
it 'process pull_request' do
|
39
11
|
pull = pull_request_class.new(project, 2, jobs, pull_request)
|
40
|
-
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/
|
12
|
+
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/*:refs/remotes/origin/pr/*' } } }, '{{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/*:refs/remotes/origin/pr/*' } } } }
|
41
13
|
post_project = { name: 'pull_req_test-PR2', type: :project, value: { name: 'pull_req_test-PR2', jobs: ['{{name}}-00', '{{name}}-10', '{{name}}-11'], pull_request_number: '2' } }
|
42
14
|
|
43
15
|
expect(pull.project).to eq(post_project)
|
@@ -51,7 +23,7 @@ describe JenkinsPipelineBuilder::PullRequest do
|
|
51
23
|
end
|
52
24
|
it 'process pull_request' do
|
53
25
|
pull = pull_request_class.new(project, 2, jobs, pull_request)
|
54
|
-
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/
|
26
|
+
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/*:refs/remotes/origin/pr/*' } } }, '{{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/*:refs/remotes/origin/pr/*' } } } }
|
55
27
|
expect(pull.jobs).to eq(post_jobs)
|
56
28
|
end
|
57
29
|
end
|
@@ -62,7 +34,7 @@ describe JenkinsPipelineBuilder::PullRequest do
|
|
62
34
|
end
|
63
35
|
it 'process pull_request' do
|
64
36
|
pull = pull_request_class.new(project, 2, jobs, pull_request)
|
65
|
-
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/
|
37
|
+
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/*:refs/remotes/origin/pr/*', changelog_to_branch: { remote: 'origin', branch: 'pr-{{pull_request_number}}' } } } }, '{{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/*:refs/remotes/origin/pr/*', changelog_to_branch: { remote: 'origin', branch: 'pr-{{pull_request_number}}' } } } } }
|
66
38
|
expect(pull.jobs).to eq(post_jobs)
|
67
39
|
end
|
68
40
|
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.10.
|
4
|
+
version: 0.10.6
|
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-02-
|
12
|
+
date: 2015-02-16 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -359,6 +359,7 @@ files:
|
|
359
359
|
- lib/jenkins_pipeline_builder/generator.rb
|
360
360
|
- lib/jenkins_pipeline_builder/module_registry.rb
|
361
361
|
- lib/jenkins_pipeline_builder/pull_request.rb
|
362
|
+
- lib/jenkins_pipeline_builder/pull_request_generator.rb
|
362
363
|
- lib/jenkins_pipeline_builder/utils.rb
|
363
364
|
- lib/jenkins_pipeline_builder/version.rb
|
364
365
|
- lib/jenkins_pipeline_builder/view.rb
|
@@ -366,6 +367,7 @@ files:
|
|
366
367
|
- out/xml/.keep
|
367
368
|
- pipeline/Jenkins-Pipeline-Builder.yaml
|
368
369
|
- pipeline/project.yaml
|
370
|
+
- spec/lib/jenkins_pipeline_builder/cli/helper_spec.rb
|
369
371
|
- spec/lib/jenkins_pipeline_builder/compiler_spec.rb
|
370
372
|
- spec/lib/jenkins_pipeline_builder/extensions/builders_spec.rb
|
371
373
|
- spec/lib/jenkins_pipeline_builder/extensions/job_attributes_spec.rb
|
@@ -395,11 +397,14 @@ files:
|
|
395
397
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_json_files/view.json
|
396
398
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_yaml_files/project.yaml
|
397
399
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_yaml_files/view.yaml
|
400
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/sample_creds.json
|
401
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/sample_creds.yaml
|
398
402
|
- spec/lib/jenkins_pipeline_builder/fixtures/view_test/duplicate_view.yaml
|
399
403
|
- spec/lib/jenkins_pipeline_builder/fixtures/view_test/parent_view.yaml
|
400
404
|
- spec/lib/jenkins_pipeline_builder/fixtures/view_test/regular_view.yaml
|
401
405
|
- spec/lib/jenkins_pipeline_builder/generator_spec.rb
|
402
406
|
- spec/lib/jenkins_pipeline_builder/module_registry_spec.rb
|
407
|
+
- spec/lib/jenkins_pipeline_builder/pull_request_generator_spec.rb
|
403
408
|
- spec/lib/jenkins_pipeline_builder/pull_request_spec.rb
|
404
409
|
- spec/lib/jenkins_pipeline_builder/spec_helper.rb
|
405
410
|
- spec/lib/jenkins_pipeline_builder/utils_spec.rb
|
@@ -430,6 +435,7 @@ signing_key:
|
|
430
435
|
specification_version: 4
|
431
436
|
summary: This gem is will boostrap your Jenkins pipelines
|
432
437
|
test_files:
|
438
|
+
- spec/lib/jenkins_pipeline_builder/cli/helper_spec.rb
|
433
439
|
- spec/lib/jenkins_pipeline_builder/compiler_spec.rb
|
434
440
|
- spec/lib/jenkins_pipeline_builder/extensions/builders_spec.rb
|
435
441
|
- spec/lib/jenkins_pipeline_builder/extensions/job_attributes_spec.rb
|
@@ -459,11 +465,14 @@ test_files:
|
|
459
465
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_json_files/view.json
|
460
466
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_yaml_files/project.yaml
|
461
467
|
- spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/test_yaml_files/view.yaml
|
468
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/sample_creds.json
|
469
|
+
- spec/lib/jenkins_pipeline_builder/fixtures/sample_creds.yaml
|
462
470
|
- spec/lib/jenkins_pipeline_builder/fixtures/view_test/duplicate_view.yaml
|
463
471
|
- spec/lib/jenkins_pipeline_builder/fixtures/view_test/parent_view.yaml
|
464
472
|
- spec/lib/jenkins_pipeline_builder/fixtures/view_test/regular_view.yaml
|
465
473
|
- spec/lib/jenkins_pipeline_builder/generator_spec.rb
|
466
474
|
- spec/lib/jenkins_pipeline_builder/module_registry_spec.rb
|
475
|
+
- spec/lib/jenkins_pipeline_builder/pull_request_generator_spec.rb
|
467
476
|
- spec/lib/jenkins_pipeline_builder/pull_request_spec.rb
|
468
477
|
- spec/lib/jenkins_pipeline_builder/spec_helper.rb
|
469
478
|
- spec/lib/jenkins_pipeline_builder/utils_spec.rb
|