pdksync 0.2.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +26 -15
- data/.travis.yml +17 -16
- data/CHANGELOG.md +65 -2
- data/CODEOWNERS +2 -0
- data/Gemfile +6 -3
- data/README.md +441 -25
- data/Rakefile +14 -50
- data/lib/pdksync.rb +317 -300
- data/lib/pdksync/conf/puppet_abs_supported_platforms.yaml +41 -0
- data/lib/pdksync/configuration.rb +155 -0
- data/lib/pdksync/githubclient.rb +77 -0
- data/lib/pdksync/gitlabclient.rb +91 -0
- data/lib/pdksync/gitplatformclient.rb +109 -0
- data/lib/pdksync/jenkinsclient.rb +50 -0
- data/lib/pdksync/logger.rb +116 -0
- data/lib/pdksync/pullrequest.rb +35 -0
- data/lib/pdksync/rake_tasks.rb +157 -0
- data/lib/pdksync/utils.rb +1293 -0
- data/managed_modules.yml +24 -28
- data/pdksync.gemspec +21 -16
- data/spec/configuration_spec.rb +56 -0
- data/spec/fixtures/fake_managed_modules.yaml +2 -0
- data/spec/fixtures/pdksync.yml +2 -0
- data/spec/logger_spec.rb +44 -0
- data/spec/pdksync_spec.rb +185 -0
- data/spec/spec_helper.rb +74 -0
- data/spec/utils_spec.rb +131 -0
- metadata +121 -16
- data/lib/pdksync/constants.rb +0 -12
- data/spec/lib/pdksync_spec.rb +0 -54
data/Rakefile
CHANGED
@@ -1,59 +1,23 @@
|
|
1
|
-
|
2
|
-
require
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
PdkSync::main(steps: [:use_pdk_ref, :clone, :pdk_update, :create_commit, :push_and_create_pr], args: args)
|
1
|
+
require "pdksync/rake_tasks"
|
2
|
+
require "github_changelog_generator/task"
|
3
|
+
require "rubocop/rake_task"
|
4
|
+
require "rspec/core/rake_task"
|
5
|
+
require "bundler/gem_tasks"
|
6
|
+
|
7
|
+
RuboCop::RakeTask.new(:rubocop) do |t|
|
8
|
+
t.options = ["--display-cop-names"]
|
10
9
|
end
|
11
10
|
|
12
|
-
|
13
|
-
desc 'Runs PDK convert against modules'
|
14
|
-
task :pdk_convert do
|
15
|
-
PdkSync::main(steps: [:pdk_convert])
|
16
|
-
end
|
17
|
-
|
18
|
-
desc 'Runs PDK validate against modules'
|
19
|
-
task :pdk_validate do
|
20
|
-
PdkSync::main(steps: [:pdk_validate])
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
namespace :git do
|
25
|
-
desc 'Clone managed modules'
|
26
|
-
task :clone_managed_modules do
|
27
|
-
PdkSync::main(steps: [:clone])
|
28
|
-
end
|
29
|
-
|
30
|
-
desc "Stage commits for modules, branchname and commit message eg rake 'git:create_commit[flippity, commit messagez]'"
|
31
|
-
task :create_commit, [:branch_name, :commit_message] do |task, args|
|
32
|
-
PdkSync::main(steps: [:create_commit], args: args)
|
33
|
-
end
|
11
|
+
RSpec::Core::RakeTask.new(:spec)
|
34
12
|
|
35
|
-
|
36
|
-
task :push_and_create_pr, [:pr_title] do |task, args|
|
37
|
-
PdkSync::main(steps: [:push_and_create_pr], args: args)
|
38
|
-
end
|
39
|
-
|
40
|
-
desc "Clean up origin branches, (branches must include pdksync in their name) eg rake 'git:clean[pdksync_origin_branch]'"
|
41
|
-
task :clean_branches, [:branch_name] do |task, args|
|
42
|
-
PdkSync::main(steps: [:clean_branches], args: args)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
desc "Run a command against modules eg rake 'run_a_command[complex command here -f -gx]'"
|
47
|
-
task :run_a_command, [:command] do |task, args|
|
48
|
-
PdkSync::main(steps: [:run_a_command], args: args[:command])
|
49
|
-
end
|
13
|
+
task :default => :spec
|
50
14
|
|
51
15
|
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
52
|
-
config.user =
|
53
|
-
config.project =
|
16
|
+
config.user = "puppetlabs"
|
17
|
+
config.project = "pdksync"
|
54
18
|
# config.since_tag = '1.1.1'
|
55
|
-
config.future_release =
|
56
|
-
config.exclude_labels = [
|
19
|
+
config.future_release = "0.6.0"
|
20
|
+
config.exclude_labels = ["maintenance"]
|
57
21
|
config.header = "# Change log\n\nAll notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org)."
|
58
22
|
config.add_pr_wo_labels = true
|
59
23
|
config.issues = false
|
data/lib/pdksync.rb
CHANGED
@@ -4,359 +4,376 @@ require 'open3'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'rake'
|
6
6
|
require 'pdk'
|
7
|
-
require '
|
8
|
-
require 'pdksync/
|
7
|
+
require 'pdksync/configuration'
|
8
|
+
require 'pdksync/gitplatformclient'
|
9
|
+
|
9
10
|
require 'json'
|
10
11
|
require 'yaml'
|
11
12
|
require 'colorize'
|
13
|
+
require 'bundler'
|
14
|
+
require 'octokit'
|
15
|
+
require 'pdk/util/template_uri'
|
16
|
+
require 'pdksync/logger'
|
17
|
+
require 'pdksync/utils'
|
18
|
+
require 'terminal-table'
|
12
19
|
|
13
20
|
# @summary
|
14
21
|
# This module set's out and controls the pdksync process
|
15
|
-
# @param [String] @access_token
|
16
|
-
# The token used to access github, must be exported locally.
|
17
|
-
# @param [String] @namspace
|
18
|
-
# The namespace of the repositories we are updating.
|
19
|
-
# @param [String] @pdksync_dir
|
20
|
-
# The local directory the repositories are to be copied to.
|
21
|
-
# @param [String] @push_file_destination
|
22
|
-
# The remote that the pull requests are to be made against.
|
23
|
-
# @param [String] @create_pr_against
|
24
|
-
# The branch the the pull requests are to be made against.
|
25
|
-
# @param [String] @managed_modules
|
26
|
-
# The file that the array of managed modules is to be retrieved from.
|
27
22
|
module PdkSync
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
@
|
33
|
-
|
34
|
-
|
23
|
+
def self.configuration
|
24
|
+
@configuration ||= PdkSync::Configuration.new
|
25
|
+
end
|
26
|
+
|
27
|
+
@main_path = Dir.pwd
|
28
|
+
|
29
|
+
def self.client
|
30
|
+
@client ||= Utils.setup_client
|
31
|
+
end
|
35
32
|
|
36
33
|
def self.main(steps: [:clone], args: nil)
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
Utils.check_pdk_version if ENV['PDKSYNC_VERSION_CHECK'].eql?('true')
|
35
|
+
Utils.create_filespace
|
36
|
+
Utils.create_filespace_gem
|
37
|
+
module_names = Utils.return_modules
|
38
|
+
|
39
|
+
unless steps.include?(:clone_gem) || steps.include?(:multi_gem_testing)
|
40
|
+
raise "No modules found in '#{Utils.configuration.managed_modules}'" if module_names.nil?
|
41
|
+
end
|
42
|
+
|
40
43
|
pr_list = []
|
44
|
+
report_rows = []
|
45
|
+
table = Terminal::Table.new
|
46
|
+
|
41
47
|
# The current directory is saved for cleanup purposes
|
42
48
|
main_path = Dir.pwd
|
43
49
|
|
44
50
|
# validation run_a_command
|
45
51
|
if steps.include?(:run_a_command)
|
46
52
|
raise '"run_a_command" requires an argument to run.' if args.nil?
|
47
|
-
|
53
|
+
PdkSync::Logger.info "Command '#{args}'"
|
48
54
|
end
|
49
55
|
# validation create_commit
|
50
56
|
if steps.include?(:create_commit)
|
51
57
|
raise 'Needs a branch_name and commit_message' if args.nil? || args[:commit_message].nil? || args[:branch_name].nil?
|
52
|
-
|
58
|
+
PdkSync::Logger.info "Commit branch_name=#{args[:branch_name]} commit_message=#{args[:commit_message]}"
|
53
59
|
end
|
54
|
-
# validation
|
55
|
-
if steps.include?(:
|
60
|
+
# validation create_pr
|
61
|
+
if steps.include?(:create_pr)
|
56
62
|
raise 'Needs a pr_title' if args.nil? || args[:pr_title].nil?
|
57
|
-
|
63
|
+
PdkSync::Logger.info "PR title =#{args[:additional_title]} #{args[:pr_title]}"
|
58
64
|
end
|
59
65
|
# validation clean_branches
|
60
66
|
if steps.include?(:clean_branches)
|
61
67
|
raise 'Needs a branch_name, and the branch name contains the string pdksync' if args.nil? || args[:branch_name].nil? || !args[:branch_name].include?('pdksync')
|
62
|
-
|
68
|
+
PdkSync::Logger.info "Removing branch_name =#{args[:branch_name]}"
|
69
|
+
end
|
70
|
+
# validation clone_gem
|
71
|
+
if steps.include?(:clone_gem)
|
72
|
+
raise 'Needs a gem_name' if args.nil? || args[:gem_name].nil?
|
73
|
+
PdkSync::Logger.info "Command '#{args}'"
|
74
|
+
end
|
75
|
+
# validation multi_gem_testing
|
76
|
+
if steps.include?(:multi_gem_testing)
|
77
|
+
raise '"multi_gem_testing" requires arguments to run version_file and build_gem.' if args.nil? || args[:version_file].nil? || args[:build_gem].nil?
|
78
|
+
puts "Command '#{args}'"
|
79
|
+
end
|
80
|
+
# validation multi_gem_file_update
|
81
|
+
if steps.include?(:multigem_file_update)
|
82
|
+
raise 'multigem_file_update requires arguments gem_to_test, gemfury_username to run.' if args[:gem_name].nil? || args[:gemfury_username].nil?
|
83
|
+
puts "Command '#{args}'"
|
84
|
+
end
|
85
|
+
# validation gem_file_update
|
86
|
+
if steps.include?(:gem_file_update)
|
87
|
+
raise '"gem_file_update" requires arguments (gem_to_test) to run.' if args[:gem_to_test].nil?
|
88
|
+
puts "Command '#{args}'"
|
89
|
+
end
|
90
|
+
# validation run_tests_locally
|
91
|
+
if steps.include?(:run_tests_locally)
|
92
|
+
puts "Command '#{args}'"
|
93
|
+
end
|
94
|
+
# validation fetch_test_results_locally
|
95
|
+
if steps.include?(:fetch_test_results_locally)
|
96
|
+
puts "Command '#{args}'"
|
97
|
+
end
|
98
|
+
# validation run_tests_jenkins
|
99
|
+
if steps.include?(:run_tests_jenkins)
|
100
|
+
raise 'run_tests_jenkins requires arguments (jenkins_server_url, github_branch) to run.' if args[:github_branch].nil? || args[:jenkins_server_url].nil?
|
101
|
+
puts "Command '#{args}'"
|
102
|
+
end
|
103
|
+
# validation test_results_jenkins
|
104
|
+
if steps.include?(:test_results_jenkins)
|
105
|
+
raise 'test_results_jenkins requires argument jenkins_server_url to run.' if args[:jenkins_server_url].nil?
|
106
|
+
puts "Command '#{args}'"
|
107
|
+
end
|
108
|
+
|
109
|
+
unless steps.include?(:clone_gem) || steps.include?(:multi_gem_testing)
|
110
|
+
abort "No modules listed in #{Utils.configuration.managed_modules}" if module_names.nil?
|
63
111
|
end
|
64
112
|
|
65
|
-
|
66
|
-
|
113
|
+
if steps.include?(:clone_gem) || steps.include?(:multi_gem_testing)
|
114
|
+
gem_args = args.clone
|
67
115
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
puts "(WARNING) Unable to clone repo for #{module_name}".red if @git_repo.nil?
|
116
|
+
PdkSync::Logger.info "#{gem_args[:gem_name]}, "
|
117
|
+
output_path = File.join(Utils.configuration.pdksync_gem_dir, gem_args[:gem_name])
|
118
|
+
if steps.include?(:clone_gem)
|
119
|
+
Utils.clean_env(output_path) if Dir.exist?(output_path)
|
120
|
+
PdkSync::Logger.info 'delete gem directory, '
|
121
|
+
@git_repo = Utils.clone_directory(Utils.configuration.namespace, gem_args[:gem_name], output_path)
|
122
|
+
PdkSync::Logger.info 'cloned'
|
123
|
+
PdkSync::Logger.error "Unable to clone repo for #{gem_args[:gem_name]}".red if @git_repo.nil?
|
77
124
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
78
|
-
next if @git_repo.nil?
|
79
125
|
end
|
80
|
-
puts '(WARNING) @output_path does not exist,
|
81
|
-
|
82
|
-
if steps.include?(:pdk_convert)
|
83
|
-
exit_status = run_command(output_path, "#{return_pdk_path} convert --force --template-url https://github.com/puppetlabs/pdk-templates")
|
84
|
-
print 'converted, '
|
85
|
-
next unless exit_status.zero?
|
86
|
-
end
|
87
|
-
if steps.include?(:pdk_validate)
|
126
|
+
puts '(WARNING) @output_path does not exist, gem'.red unless File.directory?(output_path)
|
127
|
+
if steps.include?(:multi_gem_testing)
|
88
128
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
129
|
+
PdkSync::Logger.info 'Multi Gem Testing, '
|
130
|
+
current_gem_version = Utils.check_gem_latest_version(gem_args[:gem_name])
|
131
|
+
PdkSync::Logger.info current_gem_version
|
132
|
+
new_gem_version = Utils.update_gem_latest_version_by_one(current_gem_version)
|
133
|
+
PdkSync::Logger.info new_gem_version
|
94
134
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
95
|
-
|
96
|
-
|
97
|
-
next unless exit_status.zero?
|
98
|
-
end
|
99
|
-
if steps.include?(:pdk_update)
|
135
|
+
exit_status = Utils.run_command(output_path, "sed s/#{current_gem_version}/#{new_gem_version}/g #{gem_args[:version_file]} >> test.yml", nil)
|
136
|
+
PdkSync::Logger.info 'Updated the version'
|
100
137
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
101
|
-
|
102
|
-
if steps.include?(:use_pdk_ref)
|
103
|
-
ref = return_template_ref
|
104
|
-
args = { branch_name: "pdksync_#{ref}",
|
105
|
-
commit_message: "pdksync_#{ref}",
|
106
|
-
pr_title: "pdksync_#{ref}" }
|
107
|
-
end
|
108
|
-
print 'pdk update, '
|
109
|
-
end
|
110
|
-
if steps.include?(:create_commit)
|
138
|
+
exit_status = Utils.run_command(output_path, "cp test.yml #{gem_args[:version_file]}", nil)
|
111
139
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
112
|
-
|
113
|
-
|
114
|
-
print 'commit created, '
|
115
|
-
end
|
116
|
-
if steps.include?(:push_and_create_pr)
|
140
|
+
exit_status = Utils.run_command(output_path, 'rm -rf test.yml', nil)
|
141
|
+
PdkSync::Logger.info 'bundle install'
|
117
142
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
pr_list.push(pr.html_url)
|
124
|
-
print 'created pr, '
|
125
|
-
end
|
126
|
-
if steps.include?(:clean_branches)
|
143
|
+
exit_status = Utils.run_command(output_path, 'bundle install', nil)
|
144
|
+
PdkSync::Logger.info 'building gem'
|
145
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
146
|
+
exit_status = Utils.run_command(output_path, "bundle exec #{gem_args[:build_gem]}", nil)
|
147
|
+
PdkSync::Logger.info 'uploading packages'
|
127
148
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
128
|
-
|
129
|
-
|
149
|
+
Dir.chdir("#{output_path}/#{gem_args[:gem_path]}") unless Dir.pwd == output_path
|
150
|
+
gemfury_token = Utils.configuration.gemfury_access_settings
|
151
|
+
Dir.glob('*.gem') do |filename|
|
152
|
+
PdkSync::Logger.info filename
|
153
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
154
|
+
exit_status = Utils.run_command("#{output_path}/#{gem_args[:gem_path]}", "curl -F package=@#{filename} https://" + gemfury_token + "@push.fury.io/#{gem_args[:gemfury_username]}/", nil)
|
155
|
+
end
|
130
156
|
end
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
157
|
+
else
|
158
|
+
module_names.each do |module_name|
|
159
|
+
module_args = args.clone
|
160
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
161
|
+
PdkSync::Logger.info "#{module_name}, "
|
162
|
+
repo_name = File.join(Utils.configuration.namespace, module_name)
|
163
|
+
output_path = File.join(Utils.configuration.pdksync_dir, module_name)
|
164
|
+
if steps.include?(:clone)
|
165
|
+
Utils.validate_modules_exist(client, module_names)
|
166
|
+
Utils.clean_env(output_path) if Dir.exist?(output_path)
|
167
|
+
PdkSync::Logger.info 'delete module directory'
|
168
|
+
@git_repo = Utils.clone_directory(Utils.configuration.namespace, module_name, output_path)
|
169
|
+
PdkSync::Logger.info 'cloned'
|
170
|
+
PdkSync::Logger.error "Unable to clone repo for #{module_name}" if @git_repo.nil?
|
171
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
172
|
+
next if @git_repo.nil?
|
173
|
+
end
|
174
|
+
PdkSync::Logger.warn "#{output_path} does not exist, skipping module" unless File.directory?(output_path)
|
175
|
+
next unless File.directory?(output_path)
|
176
|
+
if steps.include?(:pdk_convert)
|
177
|
+
exit_status = Utils.run_command(output_path, "#{Utils.return_pdk_path} convert --force #{configuration.templates}", nil)
|
178
|
+
PdkSync::Logger.info 'converted'
|
179
|
+
next unless exit_status.zero?
|
180
|
+
end
|
181
|
+
if steps.include?(:pdk_validate)
|
182
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
183
|
+
exit_status = Utils.run_command(output_path, "#{Utils.return_pdk_path} validate -a", nil)
|
184
|
+
PdkSync::Logger.info 'validated' if exit_status.zero?
|
185
|
+
next unless exit_status.zero?
|
186
|
+
end
|
187
|
+
if steps.include?(:run_a_command)
|
188
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
189
|
+
PdkSync::Logger.info 'run command'
|
190
|
+
if module_args[:option].nil?
|
191
|
+
pid = Utils.run_command(output_path, module_args[:command], module_args[:option])
|
192
|
+
next unless pid != 0 # rubocop:disable Metrics/BlockNesting
|
193
|
+
else
|
194
|
+
exit_status = Utils.run_command(output_path, module_args[:command], nil)
|
195
|
+
next unless exit_status.zero? # rubocop:disable Metrics/BlockNesting
|
196
|
+
end
|
197
|
+
end
|
198
|
+
if steps.include?(:gem_file_update)
|
199
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
200
|
+
print 'gem file update, '
|
201
|
+
Utils.gem_file_update(output_path, module_args[:gem_to_test], module_args[:gem_line], module_args[:gem_sha_finder], module_args[:gem_sha_replacer], module_args[:gem_version_finder], module_args[:gem_version_replacer], module_args[:gem_branch_finder], module_args[:gem_branch_replacer], main_path) # rubocop:disable Metrics/LineLength
|
202
|
+
print 'gem file updated, '
|
203
|
+
end
|
204
|
+
if steps.include?(:run_tests_locally)
|
205
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
206
|
+
PdkSync::Logger.info 'Run tests '
|
207
|
+
module_type = Utils.module_type(output_path, module_name)
|
208
|
+
Utils.run_tests_locally(output_path, module_type, module_args[:provision_type], module_name, module_args[:puppet_collection])
|
209
|
+
end
|
210
|
+
if steps.include?(:fetch_test_results_locally)
|
211
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
212
|
+
PdkSync::Logger.info 'Fetch test results for local run '
|
213
|
+
module_type = Utils.module_type(output_path, module_name)
|
214
|
+
table = Utils.fetch_test_results_locally(output_path, module_type, module_name, report_rows)
|
215
|
+
end
|
216
|
+
if steps.include?(:pdk_update)
|
217
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
218
|
+
next unless Utils.pdk_update(output_path).zero?
|
219
|
+
if steps.include?(:use_pdk_ref)
|
220
|
+
ref = Utils.return_template_ref(File.join(output_path, 'metadata.json'))
|
221
|
+
pr_title = module_args[:additional_title] ? "#{module_args[:additional_title]} - pdksync_#{ref}" : "pdksync_#{ref}" # rubocop:disable Metrics/BlockNesting
|
222
|
+
module_args = module_args.merge(branch_name: "pdksync_#{ref}",
|
223
|
+
commit_message: pr_title,
|
224
|
+
pr_title: pr_title,
|
225
|
+
pdksync_label: Utils.configuration.default_pdksync_label)
|
226
|
+
end
|
227
|
+
PdkSync::Logger.info 'pdk update'
|
228
|
+
end
|
229
|
+
if steps.include?(:use_gem_ref)
|
230
|
+
pr_title = module_args[:additional_title] ? "#{module_args[:additional_title]} - pdksync_gem_testing" : 'pdksync_gem_testing'
|
231
|
+
module_args = module_args.merge(branch_name: "gem_testing_#{module_args[:gem_to_test]}",
|
232
|
+
commit_message: pr_title,
|
233
|
+
pr_title: pr_title,
|
234
|
+
pdksync_label: Utils.configuration.default_pdksync_label)
|
235
|
+
end
|
236
|
+
if steps.include?(:create_commit)
|
237
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
238
|
+
git_instance = Git.open(output_path)
|
239
|
+
Utils.create_commit(git_instance, module_args[:branch_name], module_args[:commit_message])
|
240
|
+
PdkSync::Logger.info 'commit created'
|
241
|
+
end
|
242
|
+
if steps.include?(:push)
|
243
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
244
|
+
git_instance = Git.open(output_path)
|
245
|
+
if git_instance.diff(git_instance.current_branch, "#{Utils.configuration.push_file_destination}/#{Utils.configuration.create_pr_against}").size != 0 # Git::Diff doesn't have empty? # rubocop:disable Style/ZeroLengthPredicate
|
246
|
+
PdkSync::Logger.info 'push'
|
247
|
+
Utils.push_staged_files(git_instance, git_instance.current_branch, repo_name)
|
248
|
+
else
|
249
|
+
PdkSync::Logger.info 'skipped push'
|
250
|
+
end
|
251
|
+
end
|
252
|
+
if steps.include?(:create_pr)
|
253
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
254
|
+
git_instance = Git.open(output_path)
|
255
|
+
if git_instance.diff(git_instance.current_branch, "#{Utils.configuration.push_file_destination}/#{Utils.configuration.create_pr_against}").size != 0 # Git::Diff doesn't have empty? # rubocop:disable Style/ZeroLengthPredicate
|
256
|
+
pdk_version = Utils.return_pdk_version("#{output_path}/metadata.json")
|
145
257
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
# The octokit client that has been created.
|
150
|
-
def self.setup_client
|
151
|
-
client = Octokit::Client.new(access_token: @access_token.to_s)
|
152
|
-
client.user.login
|
153
|
-
client
|
154
|
-
rescue ArgumentError, Octokit::Unauthorized
|
155
|
-
raise "Access Token not set up correctly - Use export 'GITHUB_TOKEN=<put your token here>' to set it."
|
156
|
-
end
|
258
|
+
# If a label is supplied, verify that it is available in the repo
|
259
|
+
label = module_args[:pdksync_label] ? module_args[:pdksync_label] : module_args[:label] # rubocop:disable Metrics/BlockNesting
|
260
|
+
label_valid = (label.is_a?(String) && !label.to_str.empty?) ? Utils.check_for_label(client, repo_name, label) : nil # rubocop:disable Metrics/BlockNesting
|
157
261
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
def self.return_modules
|
163
|
-
YAML.safe_load(File.open(@managed_modules))
|
164
|
-
end
|
262
|
+
# Exit current iteration if an error occured retrieving a label
|
263
|
+
if label_valid == false # rubocop:disable Metrics/BlockNesting
|
264
|
+
raise 'Ensure label is valid'
|
265
|
+
end
|
165
266
|
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
# Path to the pdk executable
|
170
|
-
def self.return_pdk_path
|
171
|
-
full_path = '/opt/puppetlabs/pdk/bin/pdk'
|
172
|
-
path = if File.executable?(full_path)
|
173
|
-
full_path
|
174
|
-
else
|
175
|
-
puts "(WARNING) Using pdk on PATH not '#{full_path}'".red
|
176
|
-
'pdk'
|
177
|
-
end
|
178
|
-
path
|
179
|
-
end
|
267
|
+
# Create the PR and add link to pr list
|
268
|
+
pr = Utils.create_pr(client, repo_name, git_instance.current_branch, pdk_version, module_args[:pr_title])
|
269
|
+
break if pr.nil? # rubocop:disable Metrics/BlockNesting
|
180
270
|
|
181
|
-
|
182
|
-
|
183
|
-
add_staged_files(git_repo)
|
184
|
-
commit_staged_files(git_repo, branch_name, commit_message)
|
185
|
-
end
|
271
|
+
pr_list.push(pr.html_url)
|
272
|
+
PdkSync::Logger.info 'created pr'
|
186
273
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
274
|
+
# If a valid label is supplied, add this to the PR
|
275
|
+
if label_valid == true # rubocop:disable Metrics/BlockNesting
|
276
|
+
Utils.add_label(client, repo_name, pr.number, label)
|
277
|
+
PdkSync::Logger.info "added label '#{label}' "
|
278
|
+
end
|
279
|
+
else
|
280
|
+
PdkSync::Logger.info 'skipped pr'
|
281
|
+
end
|
282
|
+
end
|
283
|
+
if steps.include?(:clean_branches)
|
284
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
285
|
+
Utils.delete_branch(client, repo_name, module_args[:branch_name])
|
286
|
+
PdkSync::Logger.info 'branch deleted'
|
287
|
+
end
|
288
|
+
if steps.include?(:run_tests_jenkins)
|
289
|
+
jenkins_client = Utils.setup_jenkins_client(module_args[:jenkins_server_url])
|
290
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
291
|
+
PdkSync::Logger.info 'Run tests in jenkins '
|
292
|
+
module_type = Utils.module_type(output_path, module_name)
|
293
|
+
if module_type == 'traditional'
|
294
|
+
github_user = 'puppetlabs' if module_args[:test_framework].nil? # rubocop:disable Metrics/BlockNesting
|
295
|
+
github_user = module_args[:github_user] unless module_args[:github_user].nil? # rubocop:disable Metrics/BlockNesting
|
296
|
+
if module_args[:test_framework] == 'jenkins' || module_args[:test_framework].nil? # rubocop:disable Metrics/BlockNesting
|
297
|
+
module_name = "puppetlabs-#{module_name}" if %w[cisco_ios device_manager].include?(module_name) # rubocop:disable Metrics/BlockNesting
|
298
|
+
job_name = "forge-module_#{module_name}_init-manual-parameters_adhoc"
|
299
|
+
job_name = "forge-windows_#{module_name}_init-manual-parameters_adhoc" if ['puppetlabs-reboot', 'puppetlabs-iis', 'puppetlabs-powershell', 'sqlserver'].include?(module_name) # rubocop:disable Metrics/BlockNesting, Metrics/LineLength
|
300
|
+
build_id = Utils.run_tests_jenkins(jenkins_client, module_name, module_args[:github_branch], github_user, job_name)
|
301
|
+
next if build_id.nil? # rubocop:disable Metrics/BlockNesting
|
302
|
+
PdkSync::Logger.info "New adhoc TEST EXECUTION has started. \nYou can check progress here: #{configuration['jenkins_server_url']}/job/#{job_name}/#{build_id}"
|
303
|
+
Utils.test_results_jenkins(module_args[:jenkins_server_url], build_id, job_name, module_name)
|
304
|
+
end
|
305
|
+
end
|
306
|
+
if module_type == 'litmus'
|
307
|
+
PdkSync::Logger.info '(Error) Module Type is Litmus please use the rake task run_tests_locally to run'.red
|
308
|
+
end
|
309
|
+
end
|
310
|
+
if steps.include?(:test_results_jenkins)
|
311
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
312
|
+
PdkSync::Logger.info 'Fetch test results from jenkins, '
|
313
|
+
module_type = Utils.module_type(output_path, module_name)
|
314
|
+
if module_type == 'litmus'
|
315
|
+
PdkSync::Logger.info '(Error) Module Type is Litmus please use the rake task run_tests_locally to run'.red
|
316
|
+
next
|
317
|
+
end
|
195
318
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
# A git object representing the local repository.
|
206
|
-
def self.clone_directory(namespace, module_name, output_path)
|
207
|
-
Git.clone("https://github.com/#{namespace}/#{module_name}.git", output_path.to_s) # is returned
|
208
|
-
rescue Git::GitExecuteError => error
|
209
|
-
puts "(FAILURE) Cloning #{module_name} has failed. #{error}".red
|
210
|
-
end
|
319
|
+
module_name = "puppetlabs-#{module_name}" if %w[cisco_ios device_manager].include?(module_name)
|
320
|
+
File.open("results_#{module_name}.out", 'r') do |f|
|
321
|
+
f.each_line do |line|
|
322
|
+
if line.include?('BUILD_ID')
|
323
|
+
build_id = line.split('=')[1].strip
|
324
|
+
elsif line.include?('MODULE_NAME')
|
325
|
+
module_name = line.split('=')[1].strip
|
326
|
+
end
|
327
|
+
end
|
211
328
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
puts "\n#{stdout}\n".yellow
|
224
|
-
puts "(FAILURE) Unable to run command '#{command}': #{stderr}".red unless status.exitstatus.zero?
|
225
|
-
status.exitstatus
|
226
|
-
end
|
329
|
+
job_name = "forge-module_#{module_name}_init-manual-parameters_adhoc" if module_args[:job_name].nil?
|
330
|
+
job_name = "forge-windows_#{module_name}_init-manual-parameters_adhoc" if ['puppetlabs-reboot', 'puppetlabs-iis', 'puppetlabs-powershell', 'sqlserver'].include?(module_name)
|
331
|
+
Utils.test_results_jenkins(module_args[:jenkins_server_url], build_id, job_name, module_name)
|
332
|
+
end
|
333
|
+
end
|
334
|
+
if steps.include?(:multigem_file_update)
|
335
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
336
|
+
gemfury_readonly_token = Utils.configuration.gemfury_access_settings
|
337
|
+
Utils.update_gemfile_multigem(output_path, module_args[:gem_name], gemfury_readonly_token, module_args[:gemfury_username])
|
338
|
+
PdkSync::Logger.info 'Updated with multigem, '
|
339
|
+
end
|
227
340
|
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
# @return [Integer]
|
233
|
-
# The status code of the pdk update run.
|
234
|
-
def self.pdk_update(output_path)
|
235
|
-
# Runs the pdk update command
|
236
|
-
Dir.chdir(output_path) unless Dir.pwd == output_path
|
237
|
-
_stdout, stderr, status = Open3.capture3("#{return_pdk_path} update --force")
|
238
|
-
puts "(FAILURE) Unable to run `pdk update`: #{stderr}".red unless status.exitstatus.zero?
|
239
|
-
status.exitstatus
|
240
|
-
end
|
341
|
+
if steps.include?(:add_provision_list)
|
342
|
+
result = Utils.add_provision_list(output_path, module_args[:key], module_args[:provisioner], [module_args[:images], module_args.extras].flatten)
|
343
|
+
raise "#{output_path}/provision.yaml does not exist" unless result
|
344
|
+
end
|
241
345
|
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
# An optional input that can be used to set the location of the metadata file.
|
246
|
-
# @return [String]
|
247
|
-
# A string value that represents the current pdk template.
|
248
|
-
def self.return_template_ref(metadata_file = 'metadata.json')
|
249
|
-
file = File.read(metadata_file)
|
250
|
-
data_hash = JSON.parse(file)
|
251
|
-
data_hash['template-ref']
|
252
|
-
end
|
346
|
+
if steps.include?(:generate_vmpooler_release_checks)
|
347
|
+
Utils.generate_vmpooler_release_checks(output_path, module_args[:puppet_version].to_i)
|
348
|
+
end
|
253
349
|
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
# A git object representing the local repository to be branched.
|
258
|
-
# @param [String] branch_suffix
|
259
|
-
# The string that is appended on the branch name. eg template_ref or a friendly name
|
260
|
-
def self.checkout_branch(git_repo, branch_suffix)
|
261
|
-
git_repo.branch("pdksync_#{branch_suffix}").checkout
|
262
|
-
end
|
350
|
+
if steps.include?(:update_os_support)
|
351
|
+
Utils.update_os_support(output_path)
|
352
|
+
end
|
263
353
|
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
# An optional input that can be used to set the location of the metadata file.
|
268
|
-
# @return [String]
|
269
|
-
# A string value that represents the current pdk version.
|
270
|
-
def self.return_pdk_version(metadata_file = 'metadata.json')
|
271
|
-
file = File.read(metadata_file)
|
272
|
-
data_hash = JSON.parse(file)
|
273
|
-
data_hash['pdk-version']
|
274
|
-
end
|
354
|
+
if steps.include?(:remove_platform_from_metadata)
|
355
|
+
Utils.remove_platform_from_metadata(output_path, module_args[:os], module_args[:version])
|
356
|
+
end
|
275
357
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
# A git object representing the local repository to be staged.
|
280
|
-
def self.add_staged_files(git_repo)
|
281
|
-
if git_repo.status.changed != {}
|
282
|
-
git_repo.add(all: true)
|
283
|
-
puts 'All files have been staged.'
|
284
|
-
else
|
285
|
-
puts 'Nothing to commit.'
|
286
|
-
end
|
287
|
-
end
|
358
|
+
if steps.include?(:add_platform_to_metadata)
|
359
|
+
Utils.add_platform_to_metadata(output_path, module_args[:os], module_args[:version])
|
360
|
+
end
|
288
361
|
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
# A git object representing the local repository against which the commit is to be made.
|
293
|
-
# @param [String] template_ref
|
294
|
-
# The unique template_ref that is used as part of the commit name.
|
295
|
-
# @param [String] commit_message
|
296
|
-
# If sepecified it will be the message for the commit.
|
297
|
-
def self.commit_staged_files(git_repo, template_ref, commit_message = nil)
|
298
|
-
message = if commit_message.nil?
|
299
|
-
"pdksync_#{template_ref}"
|
300
|
-
else
|
301
|
-
commit_message
|
302
|
-
end
|
303
|
-
git_repo.commit(message)
|
304
|
-
end
|
362
|
+
if steps.include?(:update_requirements)
|
363
|
+
Utils.update_requirements(output_path, module_args[:name], module_args[:key], module_args[:value])
|
364
|
+
end
|
305
365
|
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
# A git object representing the local repository againt which the push is to be made.
|
310
|
-
# @param [String] template_ref
|
311
|
-
# The unique reference that that represents the template the update has ran against.
|
312
|
-
# @param [String] repo_name
|
313
|
-
# The name of the repository on which the commit is to be made.
|
314
|
-
def self.push_staged_files(git_repo, current_branch, repo_name)
|
315
|
-
git_repo.push(@push_file_destination, current_branch)
|
316
|
-
rescue StandardError => error
|
317
|
-
puts "(FAILURE) Pushing to #{@push_file_destination} for #{repo_name} has failed. #{error}".red
|
318
|
-
end
|
366
|
+
if steps.include?(:normalize_metadata_supported_platforms)
|
367
|
+
Utils.normalize_metadata_supported_platforms(output_path)
|
368
|
+
end
|
319
369
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
# The unique reference that that represents the template the update has ran against.
|
328
|
-
# @param [String] pdk_version
|
329
|
-
# The current version of the pdk on which the update is run.
|
330
|
-
def self.create_pr(client, repo_name, template_ref, pdk_version, pr_title = nil)
|
331
|
-
if pr_title.nil?
|
332
|
-
title = "pdksync - Update using #{pdk_version}"
|
333
|
-
message = "pdk version: `#{pdk_version}` \n pdk template ref: `#{template_ref}`"
|
334
|
-
head = "pdksync_#{template_ref}"
|
335
|
-
else
|
336
|
-
title = "pdksync - #{pr_title}"
|
337
|
-
message = "#{pr_title}\npdk version: `#{pdk_version}` \n"
|
338
|
-
head = template_ref
|
370
|
+
PdkSync::Logger.info 'done'
|
371
|
+
end
|
372
|
+
table = Terminal::Table.new title: 'Module Test Results', headings: %w[Module Status Result From], rows: report_rows
|
373
|
+
puts table if steps.include?(:fetch_test_results_locally)
|
374
|
+
return if pr_list.size.zero?
|
375
|
+
PdkSync::Logger.info "\nPRs created:\n"
|
376
|
+
puts pr_list.join("\n")
|
339
377
|
end
|
340
|
-
pr = client.create_pull_request(repo_name, @create_pr_against,
|
341
|
-
head,
|
342
|
-
title,
|
343
|
-
message)
|
344
|
-
pr
|
345
|
-
rescue StandardError => error
|
346
|
-
puts "(FAILURE) PR creation for #{repo_name} has failed. #{error}".red
|
347
|
-
end
|
348
|
-
|
349
|
-
# @summary
|
350
|
-
# This method when called will delete any preexisting branch on the given repository that matches the given name.
|
351
|
-
# @param [Octokit::Client] client
|
352
|
-
# The octokit client used to gain access to and manipulate the repository.
|
353
|
-
# @param [String] repo_name
|
354
|
-
# The name of the repository from which the branch is to be deleted.
|
355
|
-
# @param [String] branch_name
|
356
|
-
# The name of the branch that is to be deleted.
|
357
|
-
def self.delete_branch(client, repo_name, branch_name)
|
358
|
-
client.delete_branch(repo_name, branch_name)
|
359
|
-
rescue StandardError => error
|
360
|
-
puts "(FAILURE) Deleting #{branch_name} in #{repo_name} failed. #{error}".red
|
361
378
|
end
|
362
379
|
end
|