pdksync 0.5.0 → 0.6.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/.gitignore +1 -0
- data/.rubocop.yml +26 -15
- data/.travis.yml +17 -16
- data/CHANGELOG.md +23 -0
- data/CODEOWNERS +2 -0
- data/Gemfile +6 -2
- data/README.md +295 -17
- data/Rakefile +14 -8
- data/lib/pdksync.rb +310 -449
- data/lib/pdksync/conf/puppet_abs_supported_platforms.yaml +41 -0
- data/lib/pdksync/configuration.rb +155 -0
- data/lib/pdksync/githubclient.rb +3 -1
- data/lib/pdksync/gitplatformclient.rb +2 -2
- data/lib/pdksync/jenkinsclient.rb +50 -0
- data/lib/pdksync/logger.rb +116 -0
- data/lib/pdksync/rake_tasks.rb +99 -15
- data/lib/pdksync/utils.rb +1293 -0
- data/managed_modules.yml +21 -26
- data/pdksync.gemspec +18 -15
- 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 +94 -21
- data/lib/pdksync/constants.rb +0 -78
- data/spec/lib/pdksync_spec.rb +0 -58
data/Rakefile
CHANGED
@@ -1,17 +1,23 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
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"
|
4
6
|
|
5
7
|
RuboCop::RakeTask.new(:rubocop) do |t|
|
6
|
-
t.options = [
|
8
|
+
t.options = ["--display-cop-names"]
|
7
9
|
end
|
8
10
|
|
11
|
+
RSpec::Core::RakeTask.new(:spec)
|
12
|
+
|
13
|
+
task :default => :spec
|
14
|
+
|
9
15
|
GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
10
|
-
config.user =
|
11
|
-
config.project =
|
16
|
+
config.user = "puppetlabs"
|
17
|
+
config.project = "pdksync"
|
12
18
|
# config.since_tag = '1.1.1'
|
13
|
-
config.future_release =
|
14
|
-
config.exclude_labels = [
|
19
|
+
config.future_release = "0.6.0"
|
20
|
+
config.exclude_labels = ["maintenance"]
|
15
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)."
|
16
22
|
config.add_pr_wo_labels = true
|
17
23
|
config.issues = false
|
data/lib/pdksync.rb
CHANGED
@@ -4,59 +4,45 @@ require 'open3'
|
|
4
4
|
require 'fileutils'
|
5
5
|
require 'rake'
|
6
6
|
require 'pdk'
|
7
|
-
require 'pdksync/
|
7
|
+
require 'pdksync/configuration'
|
8
8
|
require 'pdksync/gitplatformclient'
|
9
|
+
|
9
10
|
require 'json'
|
10
11
|
require 'yaml'
|
11
12
|
require 'colorize'
|
12
13
|
require 'bundler'
|
13
14
|
require 'octokit'
|
15
|
+
require 'pdk/util/template_uri'
|
16
|
+
require 'pdksync/logger'
|
17
|
+
require 'pdksync/utils'
|
18
|
+
require 'terminal-table'
|
14
19
|
|
15
20
|
# @summary
|
16
21
|
# This module set's out and controls the pdksync process
|
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
|
-
# @param [Symbol] @git_platform
|
28
|
-
# The Git hosting platform to use for pull requests
|
29
|
-
# @param [String] @git_base_uri
|
30
|
-
# The base URI for Git repository access, for example 'https://github.com' or
|
31
|
-
# 'ssh://git@repo.example.com:2222'
|
32
|
-
# @param [Hash] @git_platform_access_settings
|
33
|
-
# Hash of access settings required to access the configured Git hosting
|
34
|
-
# platform API. Must always contain the key :access_token set to the exported
|
35
|
-
# GITHUB_TOKEN or GITLAB_TOKEN. In case of Gitlab it also must contain the
|
36
|
-
# key :gitlab_api_endpoint with an appropriate value.
|
37
22
|
module PdkSync
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
@
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
@git_platform_access_settings = {
|
48
|
-
access_token: Constants::ACCESS_TOKEN,
|
49
|
-
gitlab_api_endpoint: Constants::GITLAB_API_ENDPOINT
|
50
|
-
}
|
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
|
51
32
|
|
52
33
|
def self.main(steps: [:clone], args: nil)
|
53
|
-
check_pdk_version
|
54
|
-
create_filespace
|
55
|
-
|
56
|
-
module_names = return_modules
|
57
|
-
|
58
|
-
|
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
|
+
|
59
43
|
pr_list = []
|
44
|
+
report_rows = []
|
45
|
+
table = Terminal::Table.new
|
60
46
|
|
61
47
|
# The current directory is saved for cleanup purposes
|
62
48
|
main_path = Dir.pwd
|
@@ -64,455 +50,330 @@ module PdkSync
|
|
64
50
|
# validation run_a_command
|
65
51
|
if steps.include?(:run_a_command)
|
66
52
|
raise '"run_a_command" requires an argument to run.' if args.nil?
|
67
|
-
|
53
|
+
PdkSync::Logger.info "Command '#{args}'"
|
68
54
|
end
|
69
55
|
# validation create_commit
|
70
56
|
if steps.include?(:create_commit)
|
71
57
|
raise 'Needs a branch_name and commit_message' if args.nil? || args[:commit_message].nil? || args[:branch_name].nil?
|
72
|
-
|
58
|
+
PdkSync::Logger.info "Commit branch_name=#{args[:branch_name]} commit_message=#{args[:commit_message]}"
|
73
59
|
end
|
74
60
|
# validation create_pr
|
75
61
|
if steps.include?(:create_pr)
|
76
62
|
raise 'Needs a pr_title' if args.nil? || args[:pr_title].nil?
|
77
|
-
|
63
|
+
PdkSync::Logger.info "PR title =#{args[:additional_title]} #{args[:pr_title]}"
|
78
64
|
end
|
79
65
|
# validation clean_branches
|
80
66
|
if steps.include?(:clean_branches)
|
81
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')
|
82
|
-
|
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}'"
|
83
107
|
end
|
84
108
|
|
85
|
-
|
86
|
-
|
87
|
-
|
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?
|
111
|
+
end
|
112
|
+
|
113
|
+
if steps.include?(:clone_gem) || steps.include?(:multi_gem_testing)
|
114
|
+
gem_args = args.clone
|
88
115
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
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?
|
98
124
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
99
|
-
next if @git_repo.nil?
|
100
125
|
end
|
101
|
-
puts '(WARNING) @output_path does not exist,
|
102
|
-
|
103
|
-
if steps.include?(:pdk_convert)
|
104
|
-
exit_status = run_command(output_path, "#{return_pdk_path} convert --force --template-url https://github.com/puppetlabs/pdk-templates")
|
105
|
-
print 'converted, '
|
106
|
-
next unless exit_status.zero?
|
107
|
-
end
|
108
|
-
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)
|
109
128
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
115
134
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
116
|
-
|
117
|
-
|
118
|
-
next unless exit_status.zero?
|
119
|
-
end
|
120
|
-
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'
|
121
137
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
122
|
-
|
123
|
-
if steps.include?(:use_pdk_ref)
|
124
|
-
ref = return_template_ref
|
125
|
-
pr_title = module_args[:additional_title] ? "#{module_args[:additional_title]} - pdksync_#{ref}" : "pdksync_#{ref}"
|
126
|
-
module_args = module_args.merge(branch_name: "pdksync_#{ref}",
|
127
|
-
commit_message: pr_title,
|
128
|
-
pr_title: pr_title,
|
129
|
-
pdksync_label: @default_pdksync_label)
|
130
|
-
end
|
131
|
-
print 'pdk update, '
|
132
|
-
end
|
133
|
-
if steps.include?(:create_commit)
|
138
|
+
exit_status = Utils.run_command(output_path, "cp test.yml #{gem_args[:version_file]}", nil)
|
134
139
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
+
exit_status = Utils.run_command(output_path, 'rm -rf test.yml', nil)
|
141
|
+
PdkSync::Logger.info 'bundle install'
|
142
|
+
Dir.chdir(main_path) unless Dir.pwd == main_path
|
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'
|
140
148
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
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)
|
147
155
|
end
|
148
156
|
end
|
149
|
-
|
157
|
+
else
|
158
|
+
module_names.each do |module_name|
|
159
|
+
module_args = args.clone
|
150
160
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
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
|
162
196
|
end
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
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)
|
168
226
|
end
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
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'
|
177
250
|
end
|
178
|
-
else
|
179
|
-
print 'skipped pr, '
|
180
251
|
end
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
raise "Error reading in modules. Check syntax of '#{@managed_modules}'." unless !module_names.nil? && module_names.is_a?(Array)
|
248
|
-
module_names.each do |module_name|
|
249
|
-
# If module name is invalid, push it to invalid names array
|
250
|
-
unless client.repository?("#{@namespace}/#{module_name}")
|
251
|
-
invalid_names.push(module_name)
|
252
|
-
next
|
253
|
-
end
|
254
|
-
end
|
255
|
-
# Raise error if any invalid matches were found
|
256
|
-
raise "Could not find the following repositories: #{invalid_names}" unless invalid_names.empty?
|
257
|
-
end
|
258
|
-
|
259
|
-
# @summary
|
260
|
-
# Try to use a fully installed pdk, otherwise fall back to the bundled pdk gem.
|
261
|
-
# @return String
|
262
|
-
# Path to the pdk executable
|
263
|
-
def self.return_pdk_path
|
264
|
-
full_path = '/opt/puppetlabs/pdk/bin/pdk'
|
265
|
-
path = if File.executable?(full_path)
|
266
|
-
full_path
|
267
|
-
else
|
268
|
-
puts "(WARNING) Using pdk on PATH not '#{full_path}'".red
|
269
|
-
'pdk'
|
270
|
-
end
|
271
|
-
path
|
272
|
-
end
|
273
|
-
|
274
|
-
def self.create_commit(git_repo, branch_name, commit_message)
|
275
|
-
checkout_branch(git_repo, branch_name)
|
276
|
-
if add_staged_files(git_repo) # ignore rubocop for clarity on side effect ordering # rubocop:disable Style/GuardClause
|
277
|
-
commit_staged_files(git_repo, branch_name, commit_message)
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
# @summary
|
282
|
-
# This method when called will call the delete function against the given repository if it exists.
|
283
|
-
# @param [String] output_path
|
284
|
-
# The repository that is to be deleted.
|
285
|
-
def self.clean_env(output_path)
|
286
|
-
# If a local copy already exists it is removed
|
287
|
-
FileUtils.rm_rf(output_path)
|
288
|
-
end
|
289
|
-
|
290
|
-
# @summary
|
291
|
-
# This method when called will clone a given repository into a local location that has also been set.
|
292
|
-
# @param [String] namespace
|
293
|
-
# The namespace the repository is located in.
|
294
|
-
# @param [String] module_name
|
295
|
-
# The name of the repository.
|
296
|
-
# @param [String] output_path
|
297
|
-
# The location the repository is to be cloned to.
|
298
|
-
# @return [Git::Base]
|
299
|
-
# A git object representing the local repository.
|
300
|
-
def self.clone_directory(namespace, module_name, output_path)
|
301
|
-
Git.clone("#{@git_base_uri}/#{namespace}/#{module_name}.git", output_path.to_s) # is returned
|
302
|
-
rescue Git::GitExecuteError => error
|
303
|
-
puts "(FAILURE) Cloning #{module_name} has failed. #{error}".red
|
304
|
-
end
|
305
|
-
|
306
|
-
# @summary
|
307
|
-
# This method when called will run a command command at the given location, with an error message being thrown if it is not successful.
|
308
|
-
# @param [String] output_path
|
309
|
-
# The location that the command is to be run from.
|
310
|
-
# @param [String] command
|
311
|
-
# The command to be run.
|
312
|
-
# @return [Integer]
|
313
|
-
# The status code of the command run.
|
314
|
-
def self.run_command(output_path, command)
|
315
|
-
stdout = ''
|
316
|
-
stderr = ''
|
317
|
-
status = Process::Status
|
318
|
-
|
319
|
-
Dir.chdir(output_path) unless Dir.pwd == output_path
|
320
|
-
|
321
|
-
# Environment cleanup required due to Ruby subshells using current Bundler environment
|
322
|
-
if command =~ %r{^bundle}
|
323
|
-
Bundler.with_clean_env do
|
324
|
-
stdout, stderr, status = Open3.capture3(command)
|
325
|
-
end
|
326
|
-
else
|
327
|
-
stdout, stderr, status = Open3.capture3(command)
|
328
|
-
end
|
329
|
-
|
330
|
-
puts "\n#{stdout}\n".yellow
|
331
|
-
puts "(FAILURE) Unable to run command '#{command}': #{stderr}".red unless status.exitstatus.zero?
|
332
|
-
status.exitstatus
|
333
|
-
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")
|
257
|
+
|
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
|
261
|
+
|
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
|
266
|
+
|
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
|
270
|
+
|
271
|
+
pr_list.push(pr.html_url)
|
272
|
+
PdkSync::Logger.info 'created pr'
|
273
|
+
|
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
|
334
318
|
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
_stdout, stderr, status = Open3.capture3("#{return_pdk_path} update --force")
|
345
|
-
puts "(FAILURE) Unable to run `pdk update`: #{stderr}".red unless status.exitstatus.zero?
|
346
|
-
status.exitstatus
|
347
|
-
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
|
348
328
|
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
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
|
360
340
|
|
361
|
-
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
# @param [String] branch_suffix
|
366
|
-
# The string that is appended on the branch name. eg template_ref or a friendly name
|
367
|
-
def self.checkout_branch(git_repo, branch_suffix)
|
368
|
-
git_repo.branch("pdksync_#{branch_suffix}").checkout
|
369
|
-
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
|
370
345
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
# An optional input that can be used to set the location of the metadata file.
|
375
|
-
# @return [String]
|
376
|
-
# A string value that represents the current pdk version.
|
377
|
-
def self.return_pdk_version(metadata_file = 'metadata.json')
|
378
|
-
file = File.read(metadata_file)
|
379
|
-
data_hash = JSON.parse(file)
|
380
|
-
data_hash['pdk-version']
|
381
|
-
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
|
382
349
|
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
# A git object representing the local repository to be staged.
|
387
|
-
def self.add_staged_files(git_repo)
|
388
|
-
if git_repo.status.changed != {}
|
389
|
-
git_repo.add(all: true)
|
390
|
-
puts 'All files have been staged.'
|
391
|
-
true
|
392
|
-
else
|
393
|
-
puts 'Nothing to commit.'
|
394
|
-
false
|
395
|
-
end
|
396
|
-
end
|
350
|
+
if steps.include?(:update_os_support)
|
351
|
+
Utils.update_os_support(output_path)
|
352
|
+
end
|
397
353
|
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
# A git object representing the local repository against which the commit is to be made.
|
402
|
-
# @param [String] template_ref
|
403
|
-
# The unique template_ref that is used as part of the commit name.
|
404
|
-
# @param [String] commit_message
|
405
|
-
# If specified it will be the message for the commit.
|
406
|
-
def self.commit_staged_files(git_repo, template_ref, commit_message = nil)
|
407
|
-
message = if commit_message.nil?
|
408
|
-
"pdksync_#{template_ref}"
|
409
|
-
else
|
410
|
-
commit_message
|
411
|
-
end
|
412
|
-
git_repo.commit(message)
|
413
|
-
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
|
414
357
|
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
# A git object representing the local repository againt which the push is to be made.
|
419
|
-
# @param [String] template_ref
|
420
|
-
# The unique reference that that represents the template the update has ran against.
|
421
|
-
# @param [String] repo_name
|
422
|
-
# The name of the repository on which the commit is to be made.
|
423
|
-
def self.push_staged_files(git_repo, current_branch, repo_name)
|
424
|
-
git_repo.push(@push_file_destination, current_branch)
|
425
|
-
rescue StandardError => error
|
426
|
-
puts "(FAILURE) Pushing to #{@push_file_destination} for #{repo_name} has failed. #{error}".red
|
427
|
-
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
|
428
361
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
# The Git platform client used to gain access to and manipulate the repository.
|
433
|
-
# @param [String] repo_name
|
434
|
-
# The name of the repository on which the commit is to be made.
|
435
|
-
# @param [String] template_ref
|
436
|
-
# The unique reference that that represents the template the update has ran against.
|
437
|
-
# @param [String] pdk_version
|
438
|
-
# The current version of the pdk on which the update is run.
|
439
|
-
def self.create_pr(client, repo_name, template_ref, pdk_version, pr_title = nil)
|
440
|
-
if pr_title.nil?
|
441
|
-
title = "pdksync - Update using #{pdk_version}"
|
442
|
-
message = "pdk version: `#{pdk_version}` \n pdk template ref: `#{template_ref}`"
|
443
|
-
head = "pdksync_#{template_ref}"
|
444
|
-
else
|
445
|
-
title = "pdksync - #{pr_title}"
|
446
|
-
message = "#{pr_title}\npdk version: `#{pdk_version}` \n"
|
447
|
-
head = template_ref
|
448
|
-
end
|
449
|
-
pr = client.create_pull_request(repo_name, @create_pr_against,
|
450
|
-
head,
|
451
|
-
title,
|
452
|
-
message)
|
453
|
-
pr
|
454
|
-
rescue StandardError => error
|
455
|
-
puts "(FAILURE) PR creation for #{repo_name} has failed. #{error}".red
|
456
|
-
end
|
362
|
+
if steps.include?(:update_requirements)
|
363
|
+
Utils.update_requirements(output_path, module_args[:name], module_args[:key], module_args[:value])
|
364
|
+
end
|
457
365
|
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
# The Git platform client used to gain access to and manipulate the repository.
|
462
|
-
# @param [String] repo_name
|
463
|
-
# The name of the repository on which the commit is to be made.
|
464
|
-
# @param [String] label
|
465
|
-
# The label to check for.
|
466
|
-
# @return [Boolean]
|
467
|
-
# A boolean stating whether the label was found.
|
468
|
-
def self.check_for_label(client, repo_name, label)
|
469
|
-
# Get labels from repository
|
470
|
-
repo_labels = client.labels(repo_name)
|
366
|
+
if steps.include?(:normalize_metadata_supported_platforms)
|
367
|
+
Utils.normalize_metadata_supported_platforms(output_path)
|
368
|
+
end
|
471
369
|
|
472
|
-
|
473
|
-
match = false
|
474
|
-
repo_labels.each do |repo_label|
|
475
|
-
if repo_label.name == label
|
476
|
-
match = true
|
477
|
-
break
|
370
|
+
PdkSync::Logger.info 'done'
|
478
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")
|
479
377
|
end
|
480
|
-
|
481
|
-
# Raise error if a match was not found else return true
|
482
|
-
(match == false) ? (raise StandardError, "Label '#{label}' not found in #{repo_name}") : (return true)
|
483
|
-
rescue StandardError => error
|
484
|
-
puts "(FAILURE) Retrieving labels for #{repo_name} has failed. #{error}".red
|
485
|
-
return false
|
486
|
-
end
|
487
|
-
|
488
|
-
# @summary
|
489
|
-
# This method when called will add a given label to a given repository
|
490
|
-
# @param [PdkSync::GitPlatformClient] client
|
491
|
-
# The Git Platform client used to gain access to and manipulate the repository.
|
492
|
-
# @param [String] repo_name
|
493
|
-
# The name of the repository on which the commit is to be made.
|
494
|
-
# @param [Integer] issue_number
|
495
|
-
# The id of the issue (i.e. pull request) to add the label to.
|
496
|
-
# @param [String] label
|
497
|
-
# The label to add.
|
498
|
-
def self.add_label(client, repo_name, issue_number, label)
|
499
|
-
client.update_issue(repo_name, issue_number, labels: [label])
|
500
|
-
rescue StandardError => error
|
501
|
-
puts "(FAILURE) Adding label to #{repo_name} issue #{issue_number} has failed. #{error}".red
|
502
|
-
return false
|
503
|
-
end
|
504
|
-
|
505
|
-
# @summary
|
506
|
-
# This method when called will delete any preexisting branch on the given repository that matches the given name.
|
507
|
-
# @param [PdkSync::GitPlatformClient] client
|
508
|
-
# The Git platform client used to gain access to and manipulate the repository.
|
509
|
-
# @param [String] repo_name
|
510
|
-
# The name of the repository from which the branch is to be deleted.
|
511
|
-
# @param [String] branch_name
|
512
|
-
# The name of the branch that is to be deleted.
|
513
|
-
def self.delete_branch(client, repo_name, branch_name)
|
514
|
-
client.delete_branch(repo_name, branch_name)
|
515
|
-
rescue StandardError => error
|
516
|
-
puts "(FAILURE) Deleting #{branch_name} in #{repo_name} failed. #{error}".red
|
517
378
|
end
|
518
379
|
end
|