pdksync 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +15 -2
- data/README.md +14 -0
- data/Rakefile +9 -8
- data/lib/pdksync.rb +108 -2
- data/lib/pdksync/constants.rb +2 -0
- data/pdksync.gemspec +1 -1
- data/spec/lib/pdksync_spec.rb +3 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dcb6ea51b43a295e28ab7a3bb90ccf3d398ccdbd
|
4
|
+
data.tar.gz: f214afd41acd5fc6bba7557e3ce79230a8e1dde8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69ee152722be2fa9a862727de092981c1c9855a44c36e5b1033b22a4883585a0ef8596fa666ca8d65443ae2fec3244c16b590e7d034a479ba83e30baf3773ee5
|
7
|
+
data.tar.gz: 542e70e07027ad294e99d5d0933b36e586feed3bd55c3036edef2eb26832eea3cb8324d7ff50297be69eb01e78dd7dabd376679097e4a0686a83f45696c194d8
|
data/CHANGELOG.md
CHANGED
@@ -2,9 +2,22 @@
|
|
2
2
|
|
3
3
|
All 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).
|
4
4
|
|
5
|
-
## [0.
|
5
|
+
## [0.3.0](https://github.com/puppetlabs/pdksync/tree/0.3.0) (2018-11-15)
|
6
6
|
|
7
|
-
[Full Changelog](https://github.com/puppetlabs/pdksync/compare/0.
|
7
|
+
[Full Changelog](https://github.com/puppetlabs/pdksync/compare/0.2.0...0.3.0)
|
8
|
+
|
9
|
+
### Added
|
10
|
+
|
11
|
+
- \(MODULES-8231\) - Add additional title info for pdksync runs [\#76](https://github.com/puppetlabs/pdksync/pull/76) ([eimlav](https://github.com/eimlav))
|
12
|
+
- \(MODULES-7695\) - Add maintenance labels for PRs [\#75](https://github.com/puppetlabs/pdksync/pull/75) ([eimlav](https://github.com/eimlav))
|
13
|
+
|
14
|
+
### Fixed
|
15
|
+
|
16
|
+
- \(MODULES-8002\) - Fix bundle commands not running in correct dir [\#79](https://github.com/puppetlabs/pdksync/pull/79) ([eimlav](https://github.com/eimlav))
|
17
|
+
|
18
|
+
## [0.2.0](https://github.com/puppetlabs/pdksync/tree/0.2.0) (2018-11-02)
|
19
|
+
|
20
|
+
[Full Changelog](https://github.com/puppetlabs/pdksync/compare/0.1.0...0.2.0)
|
8
21
|
|
9
22
|
### Added
|
10
23
|
|
data/README.md
CHANGED
@@ -41,6 +41,20 @@ Pdksync is a gem that works to clone, update, and push module repositories. It i
|
|
41
41
|
|
42
42
|
The gem takes in a file, `managed_modules.yml`, stored within the gem that lists all the repositories that need to be updated. It then clones them, one after another, so that a local copy exists. The update command is ran against this local copy, with the subsequent changes being added into a commit on a unique branch. It is then pushed back to the remote master — where the local copy was originally cloned. The commit is merged to the master via a pull request, causing the gem to begin to clone the next repository.
|
43
43
|
|
44
|
+
By default, pdksync will supply a label to a PR (default is 'maintenance'). This can be changed by opening `lib/pdksync/constants.rb` and modifying the `PDKSYNC_LABEL` constant. You must ensure that the label selected exists on the modules that you are applying pdksync to. Should you wish to disable this feature, simply change `PDKSYNC_LABEL` to an empty string i.e. ''. Similarly, when supplying a label using the `git:push_and_create_pr` rake task, the label must exist on each of the managed modules to run successfully.
|
45
|
+
|
46
|
+
The following rake tasks are available with pdksync:
|
47
|
+
- `git:clone_managed_modules` Clone managed modules.
|
48
|
+
- `git:create_commit[:branch_name, :commit_message]` Stage commits for modules, branchname and commit message eg rake 'git:create_commit[flippity, commit messagez]'.
|
49
|
+
- `git:push_and_create_pr[:pr_title, :label]` Push commit, and create PR for modules. Label is optional eg rake 'git:push_and_create_pr[pr title goes here, optional label right here]'.
|
50
|
+
- `git:clean[:branch_name]` Clean up origin branches, (branches must include pdksync in their name) eg rake 'git:clean[pdksync_origin_branch]'.
|
51
|
+
- `pdk:pdk_convert` Runs PDK convert against modules.
|
52
|
+
- `pdk:pdk_validate` Runs PDK validate against modules.
|
53
|
+
- `pdksync[:additional_title]` Run full pdksync process, clone repository, pdk update, create pr. Additional information can be added to the title, which will be appended before the reference section.
|
54
|
+
- `rake pdksync` PR title outputs as `pdksync - pdksync_heads/master-0-gabccfb1`
|
55
|
+
- `rake 'pdksync[MODULES-8231]'` PR title outputs as `pdksync - MODULES-8231 - pdksync_heads/master-0-gabccfb1`
|
56
|
+
- `run_a_command[:command]` Run a command against modules eg rake 'run_a_command[complex command here -f -gx]'
|
57
|
+
|
44
58
|
### Workflow
|
45
59
|
--------
|
46
60
|
|
data/Rakefile
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require_relative 'lib/pdksync'
|
2
2
|
require 'github_changelog_generator/task'
|
3
3
|
|
4
|
-
desc 'Run full pdksync process, clone repository, pdk update, create pr.'
|
5
|
-
task :pdksync do
|
6
|
-
args = {:branch_name
|
7
|
-
|
8
|
-
|
4
|
+
desc 'Run full pdksync process, clone repository, pdk update, create pr. Additional title information can be added to the title, which will be appended before the reference section.'
|
5
|
+
task :pdksync, [:additional_title] do |task, args|
|
6
|
+
args = {:branch_name => "pdksync_{ref}",
|
7
|
+
:commit_message => "pdksync_{ref}",
|
8
|
+
:pr_title => "pdksync_{ref}",
|
9
|
+
:additional_title => args[:additional_title]}
|
9
10
|
PdkSync::main(steps: [:use_pdk_ref, :clone, :pdk_update, :create_commit, :push_and_create_pr], args: args)
|
10
11
|
end
|
11
12
|
|
@@ -32,8 +33,8 @@ namespace :git do
|
|
32
33
|
PdkSync::main(steps: [:create_commit], args: args)
|
33
34
|
end
|
34
35
|
|
35
|
-
desc "Push commit, and create PR for modules eg rake 'git:push_and_create_pr[pr title goes here]'"
|
36
|
-
task :push_and_create_pr, [:pr_title] do |task, args|
|
36
|
+
desc "Push commit, and create PR for modules eg rake 'git:push_and_create_pr[pr title goes here, optional label right here]'"
|
37
|
+
task :push_and_create_pr, [:pr_title, :label] do |task, args|
|
37
38
|
PdkSync::main(steps: [:push_and_create_pr], args: args)
|
38
39
|
end
|
39
40
|
|
@@ -52,7 +53,7 @@ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
|
|
52
53
|
config.user = 'puppetlabs'
|
53
54
|
config.project = 'pdksync'
|
54
55
|
# config.since_tag = '1.1.1'
|
55
|
-
config.future_release = '0.
|
56
|
+
config.future_release = '0.3.0'
|
56
57
|
config.exclude_labels = ['maintenance']
|
57
58
|
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
59
|
config.add_pr_wo_labels = true
|
data/lib/pdksync.rb
CHANGED
@@ -9,6 +9,7 @@ require 'pdksync/constants'
|
|
9
9
|
require 'json'
|
10
10
|
require 'yaml'
|
11
11
|
require 'colorize'
|
12
|
+
require 'bundler'
|
12
13
|
|
13
14
|
# @summary
|
14
15
|
# This module set's out and controls the pdksync process
|
@@ -32,12 +33,16 @@ module PdkSync
|
|
32
33
|
@push_file_destination = Constants::PUSH_FILE_DESTINATION
|
33
34
|
@create_pr_against = Constants::CREATE_PR_AGAINST
|
34
35
|
@managed_modules = Constants::MANAGED_MODULES
|
36
|
+
@default_pdksync_label = Constants::PDKSYNC_LABEL
|
35
37
|
|
36
38
|
def self.main(steps: [:clone], args: nil)
|
37
39
|
create_filespace
|
38
40
|
client = setup_client
|
39
41
|
module_names = return_modules
|
42
|
+
raise "No modules found in '#{@managed_modules}'" if module_names.nil?
|
43
|
+
validate_modules_exist(module_names)
|
40
44
|
pr_list = []
|
45
|
+
|
41
46
|
# The current directory is saved for cleanup purposes
|
42
47
|
main_path = Dir.pwd
|
43
48
|
|
@@ -101,9 +106,11 @@ module PdkSync
|
|
101
106
|
next unless pdk_update(output_path).zero?
|
102
107
|
if steps.include?(:use_pdk_ref)
|
103
108
|
ref = return_template_ref
|
109
|
+
pr_title = args[:additional_title] ? "#{args[:additional_title]} - pdksync_#{ref}" : "pdksync_#{ref}"
|
104
110
|
args = { branch_name: "pdksync_#{ref}",
|
105
111
|
commit_message: "pdksync_#{ref}",
|
106
|
-
pr_title:
|
112
|
+
pr_title: pr_title,
|
113
|
+
pdksync_label: @default_pdksync_label }
|
107
114
|
end
|
108
115
|
print 'pdk update, '
|
109
116
|
end
|
@@ -119,9 +126,30 @@ module PdkSync
|
|
119
126
|
push_staged_files(git_instance, git_instance.current_branch, repo_name)
|
120
127
|
print 'push, '
|
121
128
|
pdk_version = return_pdk_version("#{output_path}/metadata.json")
|
129
|
+
|
130
|
+
# If a label is supplied, verify that it is available in the repo
|
131
|
+
label = args[:pdksync_label] ? args[:pdksync_label] : args[:label]
|
132
|
+
label_valid = (label.is_a?(String) && !label.to_str.empty?) ? check_for_label(client, repo_name, label) : nil
|
133
|
+
|
134
|
+
# Exit current iteration if an error occured retrieving a label
|
135
|
+
if label_valid == false
|
136
|
+
raise 'Ensure label is valid'
|
137
|
+
end
|
138
|
+
|
139
|
+
# Create the PR and add link to pr list
|
122
140
|
pr = create_pr(client, repo_name, git_instance.current_branch, pdk_version, args[:pr_title])
|
141
|
+
if pr.nil?
|
142
|
+
break
|
143
|
+
end
|
144
|
+
|
123
145
|
pr_list.push(pr.html_url)
|
124
146
|
print 'created pr, '
|
147
|
+
|
148
|
+
# If a valid label is supplied, add this to the PR
|
149
|
+
if label_valid == true
|
150
|
+
add_label(client, repo_name, pr.number, label)
|
151
|
+
print "added label '#{label}' "
|
152
|
+
end
|
125
153
|
end
|
126
154
|
if steps.include?(:clean_branches)
|
127
155
|
Dir.chdir(main_path) unless Dir.pwd == main_path
|
@@ -160,9 +188,27 @@ module PdkSync
|
|
160
188
|
# @return [Array]
|
161
189
|
# An array of different module names.
|
162
190
|
def self.return_modules
|
191
|
+
raise "File '#{@managed_modules}' is empty/does not exist" if File.size?(@managed_modules).nil?
|
163
192
|
YAML.safe_load(File.open(@managed_modules))
|
164
193
|
end
|
165
194
|
|
195
|
+
# @summary
|
196
|
+
# This method when called will parse an array of module names and verify whether they are valid GitHub repo names
|
197
|
+
# @param [Array] module_names
|
198
|
+
# String array of the names of GitHub repos
|
199
|
+
def self.validate_modules_exist(module_names)
|
200
|
+
invalid_names = []
|
201
|
+
module_names.each do |module_name|
|
202
|
+
# If module name is invalid, push it to invalid names array
|
203
|
+
unless Octokit.repository?("#{@namespace}/#{module_name}")
|
204
|
+
invalid_names.push(module_name)
|
205
|
+
next
|
206
|
+
end
|
207
|
+
end
|
208
|
+
# Raise error if any invalid matches were found
|
209
|
+
raise "Could not find the following repositories: #{invalid_names}" unless invalid_names.empty?
|
210
|
+
end
|
211
|
+
|
166
212
|
# @summary
|
167
213
|
# Try to use a fully installed pdk, otherwise fall back to the bundled pdk gem.
|
168
214
|
# @return String
|
@@ -218,8 +264,21 @@ module PdkSync
|
|
218
264
|
# @return [Integer]
|
219
265
|
# The status code of the command run.
|
220
266
|
def self.run_command(output_path, command)
|
267
|
+
stdout = ''
|
268
|
+
stderr = ''
|
269
|
+
status = Process::Status
|
270
|
+
|
221
271
|
Dir.chdir(output_path) unless Dir.pwd == output_path
|
222
|
-
|
272
|
+
|
273
|
+
# Environment cleanup required due to Ruby subshells using current Bundler environment
|
274
|
+
if command =~ %r{^bundle}
|
275
|
+
Bundler.with_clean_env do
|
276
|
+
stdout, stderr, status = Open3.capture3(command)
|
277
|
+
end
|
278
|
+
else
|
279
|
+
stdout, stderr, status = Open3.capture3(command)
|
280
|
+
end
|
281
|
+
|
223
282
|
puts "\n#{stdout}\n".yellow
|
224
283
|
puts "(FAILURE) Unable to run command '#{command}': #{stderr}".red unless status.exitstatus.zero?
|
225
284
|
status.exitstatus
|
@@ -346,6 +405,53 @@ module PdkSync
|
|
346
405
|
puts "(FAILURE) PR creation for #{repo_name} has failed. #{error}".red
|
347
406
|
end
|
348
407
|
|
408
|
+
# @summary
|
409
|
+
# This method when called will check on the given repository for the existence of the supplied label
|
410
|
+
# @param [Octokit::Client] client
|
411
|
+
# The octokit client used to gain access to and manipulate the repository.
|
412
|
+
# @param [String] repo_name
|
413
|
+
# The name of the repository on which the commit is to be made.
|
414
|
+
# @param [String] label
|
415
|
+
# The label to check for.
|
416
|
+
# @return [Boolean]
|
417
|
+
# A boolean stating whether the label was found.
|
418
|
+
def self.check_for_label(client, repo_name, label)
|
419
|
+
# Get labels from repository
|
420
|
+
repo_labels = client.labels(repo_name)
|
421
|
+
|
422
|
+
# Look for label in the repository's labels
|
423
|
+
match = false
|
424
|
+
repo_labels.each do |repo_label|
|
425
|
+
if repo_label.name == label
|
426
|
+
match = true
|
427
|
+
break
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
# Raise error if a match was not found else return true
|
432
|
+
(match == false) ? (raise StandardError, "Label '#{label}' not found in #{repo_name}") : (return true)
|
433
|
+
rescue StandardError => error
|
434
|
+
puts "(FAILURE) Retrieving labels for #{repo_name} has failed. #{error}".red
|
435
|
+
return false
|
436
|
+
end
|
437
|
+
|
438
|
+
# @summary
|
439
|
+
# This method when called will add a given label to a given repository
|
440
|
+
# @param [Octokit::Client] client
|
441
|
+
# The octokit client used to gain access to and manipulate the repository.
|
442
|
+
# @param [String] repo_name
|
443
|
+
# The name of the repository on which the commit is to be made.
|
444
|
+
# @param [Integer] issue_number
|
445
|
+
# The id of the issue (i.e. pull request) to add the label to.
|
446
|
+
# @param [String] label
|
447
|
+
# The label to add.
|
448
|
+
def self.add_label(client, repo_name, issue_number, label)
|
449
|
+
client.update_issue(repo_name, issue_number, labels: [label])
|
450
|
+
rescue StandardError => error
|
451
|
+
puts "(FAILURE) Adding label to #{repo_name} issue #{issue_number} has failed. #{error}".red
|
452
|
+
return false
|
453
|
+
end
|
454
|
+
|
349
455
|
# @summary
|
350
456
|
# This method when called will delete any preexisting branch on the given repository that matches the given name.
|
351
457
|
# @param [Octokit::Client] client
|
data/lib/pdksync/constants.rb
CHANGED
@@ -8,5 +8,7 @@ module PdkSync # rubocop:disable Style/ClassAndModuleChildren
|
|
8
8
|
PUSH_FILE_DESTINATION = 'origin'.freeze
|
9
9
|
CREATE_PR_AGAINST = 'master'.freeze
|
10
10
|
MANAGED_MODULES = 'managed_modules.yml'.freeze
|
11
|
+
# Set PDKSYNC_LABEL to '' to disable adding a label during pdksync runs
|
12
|
+
PDKSYNC_LABEL = 'maintenance'.freeze
|
11
13
|
end
|
12
14
|
end
|
data/pdksync.gemspec
CHANGED
data/spec/lib/pdksync_spec.rb
CHANGED
@@ -47,6 +47,9 @@ describe PdkSync do
|
|
47
47
|
it 'raise when push_and_create_pr with no arguments' do
|
48
48
|
expect { PdkSync.main(steps: [:push_and_create_pr]) }.to raise_error(RuntimeError, %r{Needs a pr_title})
|
49
49
|
end
|
50
|
+
it 'raise when push_and_create_pr with invalid label' do
|
51
|
+
expect { PdkSync.main(steps: [:push_and_create_pr], args: { pr_title: 'My amazing PR', label: 'doot doot' }) }.to raise_error(RuntimeError, %r{Ensure label is valid})
|
52
|
+
end
|
50
53
|
it 'raise when clean_branches with no arguments' do
|
51
54
|
expect { PdkSync.main(steps: [:clean_branches]) }.to raise_error(RuntimeError, %r{Needs a branch_name, and the branch name contains the string pdksync})
|
52
55
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdksync
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Puppet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -164,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
164
164
|
version: '0'
|
165
165
|
requirements: []
|
166
166
|
rubyforge_project:
|
167
|
-
rubygems_version: 2.
|
167
|
+
rubygems_version: 2.6.11
|
168
168
|
signing_key:
|
169
169
|
specification_version: 4
|
170
170
|
summary: Puppet Module PDK Synchronizer
|