jenkins_pipeline_builder 1.6.0 → 1.7.0
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 +4 -4
- data/lib/jenkins_pipeline_builder/cli/pipeline.rb +5 -4
- data/lib/jenkins_pipeline_builder/extensions/build_steps.rb +1 -1
- data/lib/jenkins_pipeline_builder/generator.rb +5 -2
- data/lib/jenkins_pipeline_builder/pull_request_generator.rb +11 -11
- data/lib/jenkins_pipeline_builder/version.rb +1 -1
- data/spec/lib/jenkins_pipeline_builder/extension_set_spec.rb +1 -1
- data/spec/lib/jenkins_pipeline_builder/fixtures/generator_tests/pullrequest_pipeline/project.yaml +1 -0
- data/spec/lib/jenkins_pipeline_builder/generator_spec.rb +28 -5
- data/spec/lib/jenkins_pipeline_builder/pull_request_generator_spec.rb +15 -15
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2b8dbf5bb5aecf737f7de86141b559cf74704d23ceaa754f4d9c19803401a37
|
4
|
+
data.tar.gz: a412dce1a03b09be9298c5d6381a0fe7c85f4b1f9d7bf2229292de1b845cad86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4c23fe8ad05dd27dd99a55c771a5b8a423f8b7af3e8069d70f9f6d2f4aa3d72c4a0348b5ffd487a98452190d6ff8c5fd8aad9b5d6d393f1d9ab9cd853cde4c5
|
7
|
+
data.tar.gz: d40e0eb1e3a388975bf324822c334dcc085bf0dc58657b14cef9cbf744e393b383cd882c01fdee438c7e17934a4ca5f5a7563a595912d2a4a239a24baaa7761a
|
@@ -31,7 +31,7 @@ module JenkinsPipelineBuilder
|
|
31
31
|
Helper.setup(parent_options).dump(job_name)
|
32
32
|
end
|
33
33
|
|
34
|
-
desc 'bootstrap Path', 'Generates pipeline from folder or a file'
|
34
|
+
desc 'bootstrap Path [ProjectName]', '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
|
exit(0) if failed.empty? # weird ordering, but rubocop decrees
|
@@ -39,12 +39,13 @@ module JenkinsPipelineBuilder
|
|
39
39
|
exit(1)
|
40
40
|
end
|
41
41
|
|
42
|
-
|
42
|
+
option :base_branch_only, type: :boolean
|
43
|
+
desc 'pull_request Path [ProjectName] [--base_branch_only]', 'Generates jenkins jobs based on a git pull request.'
|
43
44
|
def pull_request(path, project_name = nil)
|
44
|
-
Helper.setup(parent_options).pull_request(path, project_name)
|
45
|
+
Helper.setup(parent_options).pull_request(path, project_name, options[:base_branch_only])
|
45
46
|
end
|
46
47
|
|
47
|
-
desc 'file Path', 'Does the same thing as bootstrap but doesn\'t actually create jobs on the server'
|
48
|
+
desc 'file Path [ProjectName]', 'Does the same thing as bootstrap but doesn\'t actually create jobs on the server'
|
48
49
|
def file(path, project_name = nil)
|
49
50
|
Helper.setup(parent_options).file(path, project_name)
|
50
51
|
end
|
@@ -56,7 +56,8 @@ module JenkinsPipelineBuilder
|
|
56
56
|
publish(project_name || job_collection.projects.first[:name])
|
57
57
|
end
|
58
58
|
|
59
|
-
|
59
|
+
# rubocop:disable Metrics/AbcSize
|
60
|
+
def pull_request(path, project_name, base_branch_only = false)
|
60
61
|
logger.info "Pull Request Generator Running from path #{path}"
|
61
62
|
load_job_collection path unless job_collection.loaded?
|
62
63
|
defaults = job_collection.defaults[:value]
|
@@ -64,12 +65,14 @@ module JenkinsPipelineBuilder
|
|
64
65
|
pr_generator.delete_closed_prs
|
65
66
|
errors = []
|
66
67
|
pr_generator.open_prs.each do |pr|
|
67
|
-
|
68
|
+
next if base_branch_only && defaults[:git_branch] != pr[:base]
|
69
|
+
pr_generator.convert! job_collection, pr[:number]
|
68
70
|
error = publish(project_name)
|
69
71
|
errors << error unless error.empty?
|
70
72
|
end
|
71
73
|
errors.empty?
|
72
74
|
end
|
75
|
+
# rubocop:enable Metrics/AbcSize
|
73
76
|
|
74
77
|
def file(path, project_name)
|
75
78
|
logger.info "Generating files from path #{path}"
|
@@ -29,32 +29,32 @@ module JenkinsPipelineBuilder
|
|
29
29
|
@open_prs = active_prs defaults[:github_site], defaults[:git_org], defaults[:git_repo_name]
|
30
30
|
end
|
31
31
|
|
32
|
-
def convert!(job_collection,
|
33
|
-
job_collection.defaults[:value][:application_name] = "#{application_name}-PR#{
|
34
|
-
job_collection.defaults[:value][:pull_request_number] =
|
35
|
-
job_collection.jobs.each { |j| override j[:value],
|
32
|
+
def convert!(job_collection, pr_number)
|
33
|
+
job_collection.defaults[:value][:application_name] = "#{application_name}-PR#{pr_number}"
|
34
|
+
job_collection.defaults[:value][:pull_request_number] = pr_number.to_s
|
35
|
+
job_collection.jobs.each { |j| override j[:value], pr_number }
|
36
36
|
end
|
37
37
|
|
38
38
|
def delete_closed_prs
|
39
39
|
return if JenkinsPipelineBuilder.debug
|
40
40
|
jobs_to_delete = JenkinsPipelineBuilder.client.job.list "^#{application_name}-PR(\\d+)-(.*)$"
|
41
|
-
open_prs.each do |
|
42
|
-
jobs_to_delete.reject! { |j| j.start_with? "#{application_name}-PR#{
|
41
|
+
open_prs.each do |pr|
|
42
|
+
jobs_to_delete.reject! { |j| j.start_with? "#{application_name}-PR#{pr[:number]}" }
|
43
43
|
end
|
44
44
|
jobs_to_delete.each { |j| JenkinsPipelineBuilder.client.job.delete j }
|
45
45
|
end
|
46
46
|
|
47
47
|
private
|
48
48
|
|
49
|
-
def override(job,
|
49
|
+
def override(job, pr_number)
|
50
50
|
git_version = JenkinsPipelineBuilder.registry.registry[:job][:scm_params].installed_version
|
51
|
-
job[:scm_branch] = "origin/pr/#{
|
51
|
+
job[:scm_branch] = "origin/pr/#{pr_number}/head"
|
52
52
|
job[:scm_params] ||= {}
|
53
|
-
job[:scm_params][:refspec] = "refs/pull/#{
|
53
|
+
job[:scm_params][:refspec] = "refs/pull/#{pr_number}/head:refs/remotes/origin/pr/#{pr_number}/head"
|
54
54
|
job[:scm_params][:changelog_to_branch] ||= {}
|
55
55
|
if Gem::Version.new(2.0) < git_version
|
56
56
|
job[:scm_params][:changelog_to_branch]
|
57
|
-
.merge!(remote: 'origin', branch: "pr/#{
|
57
|
+
.merge!(remote: 'origin', branch: "pr/#{pr_number}/head")
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -66,7 +66,7 @@ module JenkinsPipelineBuilder
|
|
66
66
|
begin
|
67
67
|
resp = Net::HTTP.get_response(URI.parse(url))
|
68
68
|
pulls = JSON.parse(resp.body)
|
69
|
-
pulls.map { |p| p['number'] }
|
69
|
+
pulls.map { |p| { number: p['number'], base: p['base']['ref'] } }
|
70
70
|
rescue StandardError
|
71
71
|
raise 'Failed connecting to github!'
|
72
72
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
|
3
3
|
describe JenkinsPipelineBuilder::ExtensionSet do
|
4
|
-
subject(:set) { JenkinsPipelineBuilder::ExtensionSet.new('foo'){} }
|
4
|
+
subject(:set) { JenkinsPipelineBuilder::ExtensionSet.new('foo') {} }
|
5
5
|
|
6
6
|
before :each do
|
7
7
|
set.name 'example'
|
@@ -133,6 +133,9 @@ describe JenkinsPipelineBuilder::Generator do
|
|
133
133
|
JenkinsPipelineBuilder.registry.registry[:job][:scm_params].clear_installed_version
|
134
134
|
end
|
135
135
|
|
136
|
+
let(:pr_master) { { number: 1, base: 'master' } }
|
137
|
+
let(:pr_not_master) { { number: 2, base: 'not-master' } }
|
138
|
+
let(:open_prs) { [pr_master, pr_not_master] }
|
136
139
|
let(:path) { File.expand_path('../fixtures/generator_tests/pullrequest_pipeline', __FILE__) }
|
137
140
|
it 'produces no errors while creating pipeline PullRequest' do
|
138
141
|
job_name = 'PullRequest'
|
@@ -145,7 +148,7 @@ describe JenkinsPipelineBuilder::Generator do
|
|
145
148
|
.and_return(pr_generator)
|
146
149
|
expect(pr_generator).to receive(:delete_closed_prs)
|
147
150
|
expect(pr_generator).to receive(:convert!)
|
148
|
-
expect(pr_generator).to receive(:open_prs).and_return [
|
151
|
+
expect(pr_generator).to receive(:open_prs).and_return [pr_master]
|
149
152
|
success = @generator.pull_request(path, job_name)
|
150
153
|
expect(success).to be_truthy
|
151
154
|
end
|
@@ -161,7 +164,7 @@ describe JenkinsPipelineBuilder::Generator do
|
|
161
164
|
.and_return(pr_generator)
|
162
165
|
expect(pr_generator).to receive(:delete_closed_prs)
|
163
166
|
expect(pr_generator).to receive(:convert!).twice
|
164
|
-
expect(pr_generator).to receive(:open_prs).and_return
|
167
|
+
expect(pr_generator).to receive(:open_prs).and_return open_prs
|
165
168
|
expect(@generator.pull_request(path, job_name)).to be_truthy
|
166
169
|
end
|
167
170
|
|
@@ -175,13 +178,33 @@ describe JenkinsPipelineBuilder::Generator do
|
|
175
178
|
git_repo_name: 'generator_tests'))
|
176
179
|
.and_return(pr_generator)
|
177
180
|
expect(pr_generator).to receive(:delete_closed_prs)
|
178
|
-
allow(pr_generator).to receive(:convert!) do |job_collection,
|
179
|
-
job_collection.defaults[:value][:application_name] = "testapp-PR#{
|
181
|
+
allow(pr_generator).to receive(:convert!) do |job_collection, pr_number|
|
182
|
+
job_collection.defaults[:value][:application_name] = "testapp-PR#{pr_number}"
|
180
183
|
end
|
181
|
-
expect(pr_generator).to receive(:open_prs).and_return
|
184
|
+
expect(pr_generator).to receive(:open_prs).and_return open_prs
|
182
185
|
expect(@generator.pull_request(path, job_name)).to be_truthy
|
183
186
|
expect(@generator.job_collection.projects.first[:settings][:application_name]).to eq 'testapp-PR2'
|
184
187
|
end
|
188
|
+
|
189
|
+
it 'correctly creates jobs only for the base branch' do
|
190
|
+
job_name = 'PullRequest'
|
191
|
+
pr_generator = double('pr_generator')
|
192
|
+
expect(JenkinsPipelineBuilder::PullRequestGenerator).to receive(:new)
|
193
|
+
.with(hash_including(
|
194
|
+
application_name: 'testapp',
|
195
|
+
github_site: 'https://github.com',
|
196
|
+
git_org: 'testorg',
|
197
|
+
git_repo_name: 'generator_tests'
|
198
|
+
)).and_return(pr_generator)
|
199
|
+
|
200
|
+
expect(pr_generator).to receive(:open_prs).and_return open_prs
|
201
|
+
expect(pr_generator).to receive(:delete_closed_prs)
|
202
|
+
expect(pr_generator).to receive(:convert!)
|
203
|
+
.with(instance_of(JenkinsPipelineBuilder::JobCollection), pr_master[:number])
|
204
|
+
.once
|
205
|
+
|
206
|
+
expect(@generator.pull_request(path, job_name, true)).to be_truthy
|
207
|
+
end
|
185
208
|
# Things to check for
|
186
209
|
# Fail - no PR job type found
|
187
210
|
# Encounters failure during build process
|
@@ -8,7 +8,7 @@ describe JenkinsPipelineBuilder::PullRequestGenerator do
|
|
8
8
|
let(:git_repo_name) { 'git_repo' }
|
9
9
|
let(:prs) { (1..10).map { |n| "#{application_name}-PR#{n}" } }
|
10
10
|
let(:closed_prs) { (1..6).map { |n| "#{application_name}-PR#{n}" } }
|
11
|
-
let(:open_prs_json) { (7..10).map { |n| { number: n } }.to_json }
|
11
|
+
let(:open_prs_json) { (7..10).map { |n| { number: n, base: { ref: 'master' } } }.to_json }
|
12
12
|
let(:url) { "#{github_site}/api/v3/repos/#{git_org}/#{git_repo_name}/pulls" }
|
13
13
|
let(:params) do
|
14
14
|
{
|
@@ -91,41 +91,41 @@ describe JenkinsPipelineBuilder::PullRequestGenerator do
|
|
91
91
|
.to_return(status: 200, body: open_prs_json, headers: {})
|
92
92
|
end
|
93
93
|
|
94
|
+
let(:pr_number) { 8 }
|
95
|
+
|
94
96
|
it 'converts the job application name' do
|
95
97
|
collection = job_collection.clone
|
96
|
-
subject.convert! collection,
|
97
|
-
expect(collection.defaults[:value][:application_name]).to eq "#{application_name}-
|
98
|
+
subject.convert! collection, pr_number
|
99
|
+
expect(collection.defaults[:value][:application_name]).to eq "#{application_name}-PR#{pr_number}"
|
98
100
|
end
|
99
101
|
|
100
102
|
it 'provides the PR number to the job settings' do
|
101
103
|
collection = job_collection.clone
|
102
|
-
subject.convert! collection,
|
103
|
-
expect(collection.defaults[:value][:pull_request_number]).to eq
|
104
|
+
subject.convert! collection, pr_number
|
105
|
+
expect(collection.defaults[:value][:pull_request_number]).to eq pr_number.to_s
|
104
106
|
end
|
105
107
|
|
106
108
|
it 'overrides the git params' do
|
107
|
-
pr = 8
|
108
109
|
collection = job_collection.clone
|
109
|
-
subject.convert! collection,
|
110
|
+
subject.convert! collection, pr_number
|
110
111
|
expect(collection.jobs.first[:value]).to eq(
|
111
|
-
scm_branch: "origin/pr/#{
|
112
|
+
scm_branch: "origin/pr/#{pr_number}/head",
|
112
113
|
scm_params: {
|
113
|
-
refspec: "refs/pull/#{
|
114
|
-
changelog_to_branch: { remote: 'origin', branch: "pr/#{
|
114
|
+
refspec: "refs/pull/#{pr_number}/head:refs/remotes/origin/pr/#{pr_number}/head",
|
115
|
+
changelog_to_branch: { remote: 'origin', branch: "pr/#{pr_number}/head" },
|
115
116
|
random: 'foo'
|
116
117
|
}
|
117
118
|
)
|
118
119
|
end
|
119
120
|
|
120
121
|
it 'does not override extra params' do
|
121
|
-
pr = 8
|
122
122
|
collection = job_collection.clone
|
123
|
-
subject.convert! collection,
|
123
|
+
subject.convert! collection, pr_number
|
124
124
|
expect(collection.jobs.first[:value]).to eq(
|
125
|
-
scm_branch: "origin/pr/#{
|
125
|
+
scm_branch: "origin/pr/#{pr_number}/head",
|
126
126
|
scm_params: {
|
127
|
-
refspec: "refs/pull/#{
|
128
|
-
changelog_to_branch: { remote: 'origin', branch: "pr/#{
|
127
|
+
refspec: "refs/pull/#{pr_number}/head:refs/remotes/origin/pr/#{pr_number}/head",
|
128
|
+
changelog_to_branch: { remote: 'origin', branch: "pr/#{pr_number}/head" },
|
129
129
|
random: 'foo'
|
130
130
|
}
|
131
131
|
)
|
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: 1.
|
4
|
+
version: 1.7.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: 2018-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -485,7 +485,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
485
485
|
version: '0'
|
486
486
|
requirements: []
|
487
487
|
rubyforge_project:
|
488
|
-
rubygems_version: 2.7.
|
488
|
+
rubygems_version: 2.7.4
|
489
489
|
signing_key:
|
490
490
|
specification_version: 4
|
491
491
|
summary: This gem is will boostrap your Jenkins pipelines
|