kpm 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +50 -0
- data/lib/kpm.rb +1 -0
- data/lib/kpm/base_artifact.rb +78 -35
- data/lib/kpm/installer.rb +10 -7
- data/lib/kpm/plugins_directory.yml +2 -2
- data/lib/kpm/sha1_checker.rb +61 -0
- data/lib/kpm/tasks.rb +48 -1
- data/lib/kpm/version.rb +1 -1
- data/spec/kpm/remote/base_artifact_spec.rb +19 -5
- data/spec/kpm/unit/sha1_checker_spec.rb +86 -0
- data/spec/kpm/unit/sha1_test.yml +4 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bd75221bd8f34ed62f708280f0daf46b888d9c4
|
4
|
+
data.tar.gz: 524193c742b657dd1df0a613327746a920b66303
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bca02c62a3a8eaa29d2633515d5e0fe8155e48d743981437ee069333b06db82018862eba5d4845aad89a7f0dc849533393908a7de717b5bd3559287baa0d52cc
|
7
|
+
data.tar.gz: a476e9358742d977dcdcd1f5e878ad2e0806274ac9548f48372859432c82e1bc90bb8f8cce73532f5eae29200e812634d5b7e28a362fb3dbf94b93594e30e1a9
|
data/README.md
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
KPM: the Kill Bill Package Manager
|
2
|
+
==================================
|
3
|
+
|
4
|
+
The goal of KPM is to facilitate the installation of Kill Bill and its plugins.
|
5
|
+
|
6
|
+
kpm can be used interactively to search and download individual artifacts (Kill Bill war, plugins, etc.) or to perform an automatic Kill Bill installation using a configuration file.
|
7
|
+
|
8
|
+
Installation
|
9
|
+
------------
|
10
|
+
|
11
|
+
gem install kpm
|
12
|
+
|
13
|
+
Ruby 2.1+ or JRuby 1.7.11+ is recommended.
|
14
|
+
|
15
|
+
Quick start
|
16
|
+
-----------
|
17
|
+
|
18
|
+
Create a kpm.yml file as follows:
|
19
|
+
|
20
|
+
killbill:
|
21
|
+
version: 0.12.1
|
22
|
+
webapp_path: /opt/tomcat/webapps/ROOT
|
23
|
+
plugins_dir: /var/tmp/bundles
|
24
|
+
plugins:
|
25
|
+
java:
|
26
|
+
- name: analytics-plugin
|
27
|
+
version: 0.7.2
|
28
|
+
ruby:
|
29
|
+
- name: stripe-plugin
|
30
|
+
version: 0.2.1
|
31
|
+
kaui:
|
32
|
+
version: LATEST
|
33
|
+
webapp_path: /opt/tomcat/webapps/kaui
|
34
|
+
|
35
|
+
This instructs kpm to:
|
36
|
+
* Download the Kill Bill war (version 0.12.1) and install it as `/opt/tomcat/webapps/ROOT`
|
37
|
+
* Setup the Analytics (Java) plugin (version 0.7.2) and the Stripe (Ruby) plugin (version 0.2.1) under `/var/tmp/bundles`
|
38
|
+
* Download the latest Kaui war and install it as `/opt/tomcat/webapps/kaui`
|
39
|
+
|
40
|
+
To start the installation:
|
41
|
+
|
42
|
+
kpm install kpm.yml
|
43
|
+
|
44
|
+
To help you with discovery of plugins, you can run
|
45
|
+
|
46
|
+
kpm search_for_plugins
|
47
|
+
|
48
|
+
This will list available (official) plugins. We maintain a list of recommended versions to use at https://github.com/killbill/killbill-cloud/blob/master/kpm/lib/kpm/plugins_directory.yml.
|
49
|
+
|
50
|
+
There are more advanced commands and options available, just run `kpm --help` for details.
|
data/lib/kpm.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module KPM
|
2
2
|
autoload :Utils, 'kpm/utils'
|
3
3
|
autoload :BaseArtifact, 'kpm/base_artifact'
|
4
|
+
autoload :Sha1Checker, 'kpm/sha1_checker'
|
4
5
|
autoload :KillbillServerArtifact, 'kpm/killbill_server_artifact'
|
5
6
|
autoload :KillbillPluginArtifact, 'kpm/killbill_plugin_artifact'
|
6
7
|
autoload :KauiArtifact, 'kpm/kaui_artifact'
|
data/lib/kpm/base_artifact.rb
CHANGED
@@ -35,9 +35,9 @@ module KPM
|
|
35
35
|
KAUI_CLASSIFIER = nil
|
36
36
|
|
37
37
|
class << self
|
38
|
-
def pull(logger, group_id, artifact_id, packaging='jar', classifier=nil, version='LATEST', destination_path=nil, overrides={}, ssl_verify=true)
|
38
|
+
def pull(logger, group_id, artifact_id, packaging='jar', classifier=nil, version='LATEST', destination_path=nil, sha1_file=nil, force_download=false, overrides={}, ssl_verify=true)
|
39
39
|
coordinates = build_coordinates(group_id, artifact_id, packaging, classifier, version)
|
40
|
-
pull_and_put_in_place(logger, coordinates, destination_path, is_ruby_plugin_and_should_skip_top_dir(group_id, artifact_id), overrides, ssl_verify)
|
40
|
+
pull_and_put_in_place(logger, coordinates, destination_path, is_ruby_plugin_and_should_skip_top_dir(group_id, artifact_id), sha1_file, force_download, overrides, ssl_verify)
|
41
41
|
end
|
42
42
|
|
43
43
|
def nexus_remote(overrides={}, ssl_verify=true)
|
@@ -53,7 +53,7 @@ module KPM
|
|
53
53
|
|
54
54
|
protected
|
55
55
|
|
56
|
-
def pull_and_put_in_place(logger, coordinates, destination_path=nil, skip_top_dir=true, overrides={}, ssl_verify=true)
|
56
|
+
def pull_and_put_in_place(logger, coordinates, destination_path=nil, skip_top_dir=true, sha1_file=nil, force_download=false, overrides={}, ssl_verify=true)
|
57
57
|
destination_path = KPM::root if destination_path.nil?
|
58
58
|
|
59
59
|
# Create the destination directory
|
@@ -64,60 +64,103 @@ module KPM
|
|
64
64
|
end
|
65
65
|
FileUtils.mkdir_p(destination_dir)
|
66
66
|
|
67
|
+
# Build artifact info
|
68
|
+
artifact_info = artifact_info(coordinates, destination_path, overrides, ssl_verify)
|
69
|
+
if !force_download && skip_if_exists(artifact_info, coordinates, sha1_file)
|
70
|
+
logger.info "Skipping installation of #{coordinates} to #{artifact_info[:file_path]}, file already exists"
|
71
|
+
artifact_info[:skipped] = true
|
72
|
+
return artifact_info
|
73
|
+
end
|
74
|
+
|
67
75
|
# Download the artifact in a temporary directory in case of failures
|
68
|
-
info = {}
|
69
76
|
Dir.mktmpdir do |tmp_destination_dir|
|
70
77
|
logger.info " Starting download of #{coordinates} to #{tmp_destination_dir}"
|
71
78
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
if is_tgz
|
77
|
-
Utils.unpack_tgz(info[:file_path], destination_path, skip_top_dir)
|
78
|
-
FileUtils.rm info[:file_path]
|
79
|
+
downloaded_artifact_info = pull_and_verify(logger, artifact_info[:sha1], coordinates, tmp_destination_dir, sha1_file, overrides, ssl_verify)
|
80
|
+
if artifact_info[:is_tgz]
|
81
|
+
Utils.unpack_tgz(downloaded_artifact_info[:file_path], destination_path, skip_top_dir)
|
82
|
+
FileUtils.rm downloaded_artifact_info[:file_path]
|
79
83
|
else
|
80
|
-
FileUtils.mv
|
84
|
+
FileUtils.mv downloaded_artifact_info[:file_path], destination_path
|
85
|
+
artifact_info[:size] = downloaded_artifact_info[:size]
|
81
86
|
end
|
87
|
+
logger.info "Successful installation of #{coordinates} to #{artifact_info[:file_path]}"
|
88
|
+
end
|
89
|
+
artifact_info
|
90
|
+
end
|
82
91
|
|
83
|
-
|
84
|
-
if File.directory?(destination_path) && !is_tgz
|
85
|
-
destination = File.join(File.expand_path(destination_path), info[:file_name])
|
86
|
-
else
|
87
|
-
destination = destination_path
|
88
|
-
end
|
89
|
-
info[:file_path] = File.expand_path(destination)
|
92
|
+
def skip_if_exists(artifact_info, coordinates, sha1_file)
|
90
93
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
94
|
+
# Unclear if this is even possible
|
95
|
+
return false if artifact_info[:sha1].nil?
|
96
|
+
|
97
|
+
# Check entry in sha1_file if exists
|
98
|
+
if sha1_file && File.exists?(sha1_file)
|
99
|
+
sha1_checker = Sha1Checker.from_file(sha1_file)
|
100
|
+
local_sha1 = sha1_checker.sha1(coordinates)
|
101
|
+
return true if local_sha1 == artifact_info[:sha1]
|
102
|
+
end
|
97
103
|
|
98
|
-
|
104
|
+
# If not using sha1_file mechanism, exit early if file_path odes not exist or is a directory
|
105
|
+
if !File.exists?(artifact_info[:file_path]) ||
|
106
|
+
File.directory?(artifact_info[:file_path])
|
107
|
+
return false
|
99
108
|
end
|
109
|
+
|
110
|
+
# Finally check if remote_sha1 matches what we have locally
|
111
|
+
local_sha1 = Digest::SHA1.file(artifact_info[:file_path]).hexdigest
|
112
|
+
local_sha1 == artifact_info[:sha1]
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
def artifact_info(coordinates, destination_path, overrides={}, ssl_verify=true)
|
117
|
+
|
118
|
+
info = {}
|
119
|
+
nexus_info = nexus_remote(overrides, ssl_verify).get_artifact_info(coordinates)
|
120
|
+
|
121
|
+
xml = REXML::Document.new(nexus_info)
|
122
|
+
repository_path = xml.elements['//repositoryPath'].text unless xml.elements['//repositoryPath'].nil?
|
123
|
+
sha1 = xml.elements['//sha1'].text unless xml.elements['//sha1'].nil?
|
124
|
+
version = xml.elements['//version'].text unless xml.elements['//version'].nil?
|
125
|
+
|
126
|
+
info[:sha1] = sha1
|
127
|
+
info[:version] = version
|
128
|
+
info[:is_tgz] = repository_path.end_with?('.tar.gz') || repository_path.end_with?('.tgz')
|
129
|
+
if File.directory?(destination_path) && !info[:is_tgz]
|
130
|
+
destination = File.join(File.expand_path(destination_path), File.basename(repository_path))
|
131
|
+
info[:file_name] = File.basename(repository_path)
|
132
|
+
else
|
133
|
+
# The destination was a fully specified path or this is an archive and we keep the directory
|
134
|
+
destination = destination_path
|
135
|
+
info[:file_name] = File.basename(destination_path) if !info[:is_tgz]
|
136
|
+
end
|
137
|
+
info[:file_path] = File.expand_path(destination)
|
138
|
+
info[:skipped] = false
|
100
139
|
info
|
101
140
|
end
|
102
141
|
|
103
|
-
|
142
|
+
|
143
|
+
def pull_and_verify(logger, remote_sha1, coordinates, destination_dir, sha1_file, overrides={}, ssl_verify=true)
|
104
144
|
info = nexus_remote(overrides, ssl_verify).pull_artifact(coordinates, destination_dir)
|
105
|
-
raise ArtifactCorruptedException unless verify(logger,
|
145
|
+
raise ArtifactCorruptedException unless verify(logger, info[:file_path], remote_sha1)
|
146
|
+
|
147
|
+
if sha1_file
|
148
|
+
sha1_checker = Sha1Checker.from_file(sha1_file)
|
149
|
+
sha1_checker.add_or_modify_entry!(coordinates, remote_sha1)
|
150
|
+
end
|
151
|
+
|
106
152
|
info
|
107
153
|
end
|
108
154
|
|
109
|
-
def verify(logger,
|
110
|
-
artifact_info = nexus_remote(overrides, ssl_verify).get_artifact_info(coordinates)
|
111
|
-
sha1_element = REXML::Document.new(artifact_info).elements['//sha1']
|
155
|
+
def verify(logger, file_path, remote_sha1)
|
112
156
|
# Can't check :(
|
113
|
-
if
|
114
|
-
logger.warn("Unable to
|
157
|
+
if remote_sha1.nil?
|
158
|
+
logger.warn("Unable to verify sha1 for #{coordinates}. Artifact info: #{artifact_info.inspect}")
|
115
159
|
return true
|
116
160
|
end
|
117
161
|
|
118
162
|
local_sha1 = Digest::SHA1.file(file_path).hexdigest
|
119
|
-
|
120
|
-
local_sha1 == sha1
|
163
|
+
local_sha1 == remote_sha1
|
121
164
|
end
|
122
165
|
|
123
166
|
def build_coordinates(group_id, artifact_id, packaging, classifier, version=nil)
|
data/lib/kpm/installer.rb
CHANGED
@@ -4,6 +4,7 @@ require 'yaml'
|
|
4
4
|
module KPM
|
5
5
|
class Installer
|
6
6
|
LATEST_VERSION = 'LATEST'
|
7
|
+
SHA1_FILENAME = 'sha1.yml'
|
7
8
|
|
8
9
|
def self.from_file(config_path, logger=nil)
|
9
10
|
Installer.new(YAML::load_file(config_path), logger)
|
@@ -25,7 +26,7 @@ module KPM
|
|
25
26
|
@nexus_ssl_verify = !@nexus_config.nil? ? @nexus_config['ssl_verify'] : true
|
26
27
|
end
|
27
28
|
|
28
|
-
def install
|
29
|
+
def install(force_download=false)
|
29
30
|
unless @config.nil?
|
30
31
|
install_killbill_server
|
31
32
|
install_plugins
|
@@ -34,6 +35,7 @@ module KPM
|
|
34
35
|
unless @kaui_config.nil?
|
35
36
|
install_kaui
|
36
37
|
end
|
38
|
+
@force_download = force_download
|
37
39
|
end
|
38
40
|
|
39
41
|
private
|
@@ -46,12 +48,11 @@ module KPM
|
|
46
48
|
version = @config['version'] || LATEST_VERSION
|
47
49
|
webapp_path = @config['webapp_path'] || KPM::root
|
48
50
|
|
49
|
-
KPM::KillbillServerArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, webapp_path, @nexus_config, @nexus_ssl_verify)
|
51
|
+
KPM::KillbillServerArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, webapp_path, nil, @force_download, @nexus_config, @nexus_ssl_verify)
|
50
52
|
end
|
51
53
|
|
52
54
|
def install_plugins
|
53
55
|
bundles_dir = @config['plugins_dir']
|
54
|
-
|
55
56
|
install_java_plugins(bundles_dir)
|
56
57
|
install_ruby_plugins(bundles_dir)
|
57
58
|
end
|
@@ -67,8 +68,9 @@ module KPM
|
|
67
68
|
classifier = plugin['classifier'] || KPM::BaseArtifact::KILLBILL_JAVA_PLUGIN_CLASSIFIER
|
68
69
|
version = plugin['version'] || LATEST_VERSION
|
69
70
|
destination = "#{bundles_dir}/plugins/java/#{artifact_id}/#{version}"
|
71
|
+
sha1_file = "#{bundles_dir}/#{SHA1_FILENAME}"
|
70
72
|
|
71
|
-
infos << KPM::KillbillPluginArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, destination, @nexus_config, @nexus_ssl_verify)
|
73
|
+
infos << KPM::KillbillPluginArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, destination, sha1_file, @force_download, @nexus_config, @nexus_ssl_verify)
|
72
74
|
end
|
73
75
|
|
74
76
|
infos
|
@@ -85,8 +87,9 @@ module KPM
|
|
85
87
|
classifier = plugin['classifier'] || KPM::BaseArtifact::KILLBILL_RUBY_PLUGIN_CLASSIFIER
|
86
88
|
version = plugin['version'] || LATEST_VERSION
|
87
89
|
destination = "#{bundles_dir}/plugins/ruby"
|
90
|
+
sha1_file = "#{bundles_dir}/#{SHA1_FILENAME}"
|
88
91
|
|
89
|
-
infos << KPM::KillbillPluginArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, destination, @nexus_config, @nexus_ssl_verify)
|
92
|
+
infos << KPM::KillbillPluginArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, destination, sha1_file, @force_download, @nexus_config, @nexus_ssl_verify)
|
90
93
|
end
|
91
94
|
|
92
95
|
infos
|
@@ -102,7 +105,7 @@ module KPM
|
|
102
105
|
version = @config['default_bundles_version'] || LATEST_VERSION
|
103
106
|
destination = "#{@config['plugins_dir']}/platform"
|
104
107
|
|
105
|
-
info = KPM::BaseArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, destination, @nexus_config, @nexus_ssl_verify)
|
108
|
+
info = KPM::BaseArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, destination, nil, @force_download, @nexus_config, @nexus_ssl_verify)
|
106
109
|
|
107
110
|
# The special JRuby bundle needs to be called jruby.jar
|
108
111
|
# TODO .first - code smell
|
@@ -119,7 +122,7 @@ module KPM
|
|
119
122
|
version = @kaui_config['version'] || LATEST_VERSION
|
120
123
|
webapp_path = @kaui_config['webapp_path'] || KPM::root
|
121
124
|
|
122
|
-
KPM::KauiArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, webapp_path, @nexus_config, @nexus_ssl_verify)
|
125
|
+
KPM::KauiArtifact.pull(@logger, group_id, artifact_id, packaging, classifier, version, webapp_path, nil, @force_download, @nexus_config, @nexus_ssl_verify)
|
123
126
|
end
|
124
127
|
end
|
125
128
|
end
|
@@ -21,7 +21,7 @@
|
|
21
21
|
:paypal:
|
22
22
|
:type: :ruby
|
23
23
|
:artifact_id: paypal-express-plugin
|
24
|
-
:stable_version: 1.
|
24
|
+
:stable_version: 1.8.1
|
25
25
|
:require:
|
26
26
|
- :signature
|
27
27
|
- :login
|
@@ -29,6 +29,6 @@
|
|
29
29
|
:stripe:
|
30
30
|
:type: :ruby
|
31
31
|
:artifact_id: stripe-plugin
|
32
|
-
:stable_version: 0.2.
|
32
|
+
:stable_version: 0.2.1
|
33
33
|
:require:
|
34
34
|
- :api_secret_key
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'logger'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module KPM
|
5
|
+
class Sha1Checker
|
6
|
+
|
7
|
+
def self.from_file(sha1_file, logger=nil)
|
8
|
+
Sha1Checker.new(sha1_file, logger)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(sha1_file, logger=nil)
|
12
|
+
@sha1_file = sha1_file
|
13
|
+
init!
|
14
|
+
|
15
|
+
if logger.nil?
|
16
|
+
@logger = Logger.new(STDOUT)
|
17
|
+
@logger.level = Logger::INFO
|
18
|
+
else
|
19
|
+
@logger = logger
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def sha1(coordinates)
|
24
|
+
@sha1_config['sha1'][coordinates]
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_or_modify_entry!(coordinates, sha1)
|
28
|
+
@sha1_config['sha1'][coordinates] = sha1
|
29
|
+
save!
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def save!
|
35
|
+
Dir.mktmpdir do |tmp_destination_dir|
|
36
|
+
tmp_file = File.join(tmp_destination_dir, File.basename(@sha1_file))
|
37
|
+
File.open(tmp_file, 'w') do |file|
|
38
|
+
file.write(@sha1_config.to_yaml)
|
39
|
+
end
|
40
|
+
FileUtils.copy(tmp_file, @sha1_file)
|
41
|
+
end
|
42
|
+
reload!
|
43
|
+
end
|
44
|
+
|
45
|
+
def init!
|
46
|
+
if !File.exists?(@sha1_file)
|
47
|
+
init_config = {}
|
48
|
+
init_config['sha1'] = {}
|
49
|
+
File.open(@sha1_file, 'w') do |file|
|
50
|
+
file.write(init_config.to_yaml)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
reload!
|
54
|
+
end
|
55
|
+
|
56
|
+
def reload!
|
57
|
+
@sha1_config = YAML::load_file(@sha1_file)
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
data/lib/kpm/tasks.rb
CHANGED
@@ -18,15 +18,24 @@ module KPM
|
|
18
18
|
:default => true,
|
19
19
|
:desc => 'Set to false to disable SSL Verification.'
|
20
20
|
|
21
|
+
|
21
22
|
desc 'install config_file', 'Install Kill Bill server and plugins according to the specified YAML configuration file.'
|
23
|
+
method_option :force_download,
|
24
|
+
:type => :boolean,
|
25
|
+
:default => false,
|
26
|
+
:desc => 'Force download of the artifact even if it exists'
|
22
27
|
def install(config_file)
|
23
|
-
Installer.from_file(config_file).install
|
28
|
+
Installer.from_file(config_file).install(options[:force_download])
|
24
29
|
end
|
25
30
|
|
26
31
|
method_option :destination,
|
27
32
|
:type => :string,
|
28
33
|
:default => nil,
|
29
34
|
:desc => 'A different folder other than the current working directory.'
|
35
|
+
method_option :force_download,
|
36
|
+
:type => :boolean,
|
37
|
+
:default => false,
|
38
|
+
:desc => 'Force download of the artifact even if it exists'
|
30
39
|
desc 'pull_kb_server_war version', 'Pulls Kill Bill server war from Sonatype and places it on your machine.'
|
31
40
|
def pull_kb_server_war(version='LATEST')
|
32
41
|
response = KillbillServerArtifact.pull(logger,
|
@@ -36,6 +45,8 @@ module KPM
|
|
36
45
|
KillbillServerArtifact::KILLBILL_CLASSIFIER,
|
37
46
|
version,
|
38
47
|
options[:destination],
|
48
|
+
nil,
|
49
|
+
options[:force_download],
|
39
50
|
options[:overrides],
|
40
51
|
options[:ssl_verify])
|
41
52
|
say "Artifact has been retrieved and can be found at path: #{response[:file_path]}", :green
|
@@ -54,6 +65,10 @@ module KPM
|
|
54
65
|
:type => :string,
|
55
66
|
:default => nil,
|
56
67
|
:desc => 'A different folder other than the current working directory.'
|
68
|
+
method_option :force_download,
|
69
|
+
:type => :boolean,
|
70
|
+
:default => false,
|
71
|
+
:desc => 'Force download of the artifact even if it exists'
|
57
72
|
desc 'pull_kp_server_war version', 'Pulls Kill Pay server war from Sonatype and places it on your machine.'
|
58
73
|
def pull_kp_server_war(version='LATEST')
|
59
74
|
response = KillbillServerArtifact.pull(logger,
|
@@ -63,6 +78,8 @@ module KPM
|
|
63
78
|
KillbillServerArtifact::KILLPAY_CLASSIFIER,
|
64
79
|
version,
|
65
80
|
options[:destination],
|
81
|
+
nil,
|
82
|
+
options[:force_download],
|
66
83
|
options[:overrides],
|
67
84
|
options[:ssl_verify])
|
68
85
|
say "Artifact has been retrieved and can be found at path: #{response[:file_path]}", :green
|
@@ -81,6 +98,14 @@ module KPM
|
|
81
98
|
:type => :string,
|
82
99
|
:default => nil,
|
83
100
|
:desc => 'A different folder other than the current working directory.'
|
101
|
+
method_option :force_download,
|
102
|
+
:type => :boolean,
|
103
|
+
:default => false,
|
104
|
+
:desc => 'Force download of the artifact even if it exists'
|
105
|
+
method_option :sha1_file,
|
106
|
+
:type => :string,
|
107
|
+
:default => nil,
|
108
|
+
:desc => 'Location of the sha1 file'
|
84
109
|
desc 'pull_java_plugin artifact_id', 'Pulls a java plugin from Sonatype and places it on your machine.'
|
85
110
|
def pull_java_plugin(artifact_id, version='LATEST')
|
86
111
|
response = KillbillPluginArtifact.pull(logger,
|
@@ -90,6 +115,8 @@ module KPM
|
|
90
115
|
KillbillPluginArtifact::KILLBILL_JAVA_PLUGIN_CLASSIFIER,
|
91
116
|
version,
|
92
117
|
options[:destination],
|
118
|
+
options[:sha1_file],
|
119
|
+
options[:force_download],
|
93
120
|
options[:overrides],
|
94
121
|
options[:ssl_verify])
|
95
122
|
say "Artifact has been retrieved and can be found at path: #{response[:file_path]}", :green
|
@@ -99,6 +126,14 @@ module KPM
|
|
99
126
|
:type => :string,
|
100
127
|
:default => nil,
|
101
128
|
:desc => 'A different folder other than the current working directory.'
|
129
|
+
method_option :force_download,
|
130
|
+
:type => :boolean,
|
131
|
+
:default => false,
|
132
|
+
:desc => 'Force download of the artifact even if it exists'
|
133
|
+
method_option :sha1_file,
|
134
|
+
:type => :string,
|
135
|
+
:default => nil,
|
136
|
+
:desc => 'Location of the sha1 file'
|
102
137
|
desc 'pull_ruby_plugin artifact_id', 'Pulls a ruby plugin from Sonatype and places it on your machine.'
|
103
138
|
def pull_ruby_plugin(artifact_id, version='LATEST')
|
104
139
|
response = KillbillPluginArtifact.pull(logger,
|
@@ -108,6 +143,8 @@ module KPM
|
|
108
143
|
KillbillPluginArtifact::KILLBILL_RUBY_PLUGIN_CLASSIFIER,
|
109
144
|
version,
|
110
145
|
options[:destination],
|
146
|
+
options[:sha1_file],
|
147
|
+
options[:force_download],
|
111
148
|
options[:overrides],
|
112
149
|
options[:ssl_verify])
|
113
150
|
say "Artifact has been retrieved and can be found at path: #{response[:file_path]}", :green
|
@@ -132,6 +169,14 @@ module KPM
|
|
132
169
|
:type => :string,
|
133
170
|
:default => nil,
|
134
171
|
:desc => 'A different folder other than the current working directory.'
|
172
|
+
method_option :force_download,
|
173
|
+
:type => :boolean,
|
174
|
+
:default => false,
|
175
|
+
:desc => 'Force download of the artifact even if it exists'
|
176
|
+
method_option :sha1_file,
|
177
|
+
:type => :string,
|
178
|
+
:default => nil,
|
179
|
+
:desc => 'Location of the sha1 file'
|
135
180
|
desc 'pull_kaui_war version', 'Pulls Kaui war from Sonatype and places it on your machine.'
|
136
181
|
def pull_kaui_war(version='LATEST')
|
137
182
|
response = KauiArtifact.pull(logger,
|
@@ -141,6 +186,8 @@ module KPM
|
|
141
186
|
KauiArtifact::KAUI_CLASSIFIER,
|
142
187
|
version,
|
143
188
|
options[:destination],
|
189
|
+
options[:sha1_file],
|
190
|
+
options[:force_download],
|
144
191
|
options[:overrides],
|
145
192
|
options[:ssl_verify])
|
146
193
|
say "Artifact has been retrieved and can be found at path: #{response[:file_path]}", :green
|
data/lib/kpm/version.rb
CHANGED
@@ -10,14 +10,24 @@ describe KPM::BaseArtifact do
|
|
10
10
|
it 'should be able to download and verify regular artifacts' do
|
11
11
|
Dir.mktmpdir do |dir|
|
12
12
|
test_download dir, 'foo-oss.pom.xml'
|
13
|
+
# Verify we skip the second time
|
14
|
+
test_download dir, 'foo-oss.pom.xml', true
|
15
|
+
# Verify the download happens when we set force_download
|
16
|
+
test_download dir, 'foo-oss.pom.xml', false, true
|
13
17
|
end
|
14
18
|
|
15
19
|
Dir.mktmpdir do |dir|
|
16
|
-
test_download dir
|
20
|
+
test_download dir, nil
|
21
|
+
# Verify we skip the second time
|
22
|
+
test_download dir, nil, true
|
23
|
+
# Verify the download happens when we set force_download
|
24
|
+
test_download dir, nil, false, true
|
17
25
|
end
|
26
|
+
|
27
|
+
|
18
28
|
end
|
19
29
|
|
20
|
-
# This test makes sure the top level directory is correctly
|
30
|
+
# This test makes sure the top level directory is correctly verify_is_skipped
|
21
31
|
it 'should be able to download and verify .tar.gz ruby artifacts' do
|
22
32
|
# Use the payment-test-plugin as a test, as it is fairly small (2.5M)
|
23
33
|
group_id = 'org.kill-bill.billing.plugin.ruby'
|
@@ -57,10 +67,14 @@ describe KPM::BaseArtifact do
|
|
57
67
|
end
|
58
68
|
end
|
59
69
|
|
60
|
-
|
70
|
+
|
71
|
+
def test_download(dir, filename=nil, verify_is_skipped=false, force_download=false)
|
61
72
|
path = filename.nil? ? dir : dir + '/' + filename
|
62
|
-
info = KPM::BaseArtifact.pull(@logger, 'org.kill-bill.billing', 'killbill-oss-parent', 'pom', nil, 'LATEST', path)
|
73
|
+
info = KPM::BaseArtifact.pull(@logger, 'org.kill-bill.billing', 'killbill-oss-parent', 'pom', nil, 'LATEST', path, nil, force_download, {}, true)
|
63
74
|
info[:file_name].should == (filename.nil? ? "killbill-oss-parent-#{info[:version]}.pom" : filename)
|
64
|
-
info[:
|
75
|
+
info[:skipped].should == verify_is_skipped
|
76
|
+
if !info[:skipped]
|
77
|
+
info[:size].should == File.size(info[:file_path])
|
78
|
+
end
|
65
79
|
end
|
66
80
|
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe KPM::Sha1Checker do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@logger = Logger.new(STDOUT)
|
7
|
+
@logger.level = Logger::INFO
|
8
|
+
|
9
|
+
tmp_destination_dir = Dir.tmpdir()
|
10
|
+
init_config = File.join(File.dirname(__FILE__), 'sha1_test.yml')
|
11
|
+
FileUtils.copy(init_config, tmp_destination_dir)
|
12
|
+
@tmp_config = File.join(tmp_destination_dir, 'sha1_test.yml')
|
13
|
+
puts "tmp config = #{@tmp_config}"
|
14
|
+
@sha1_checker = KPM::Sha1Checker.from_file(@tmp_config)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should find matching sha1' do
|
18
|
+
existing = @sha1_checker.sha1('killbill-plugin-match-1.0.0.tar.gz')
|
19
|
+
existing.should_not be_nil
|
20
|
+
existing.should == 'fce068c3fd5f95646ce0d09852f43ff67f06f0b9'
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should NOT find sha1' do
|
24
|
+
existing = @sha1_checker.sha1('killbill-plugin-nomatch-1.0.0.tar.gz')
|
25
|
+
existing.should_not be_nil
|
26
|
+
existing.should_not == 'fce068c3fd5f95646ce0d09852f43ff67f06f0b9'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should NOT find matching sha1' do
|
30
|
+
existing = @sha1_checker.sha1('killbill-plugin-foo-1.0.0.tar.gz')
|
31
|
+
existing.should be_nil
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should add an entry and find them all' do
|
35
|
+
@sha1_checker.add_or_modify_entry!('killbill-plugin-new-1.1.0.0.tar.gz', 'abc068c3fd5f95646ce0d09852f43ff67f06f111')
|
36
|
+
|
37
|
+
existing = @sha1_checker.sha1('killbill-plugin-match-1.0.0.tar.gz')
|
38
|
+
existing.should_not be_nil
|
39
|
+
existing.should == 'fce068c3fd5f95646ce0d09852f43ff67f06f0b9'
|
40
|
+
|
41
|
+
existing = @sha1_checker.sha1('killbill-plugin-new-1.1.0.0.tar.gz')
|
42
|
+
existing.should_not be_nil
|
43
|
+
existing.should == 'abc068c3fd5f95646ce0d09852f43ff67f06f111'
|
44
|
+
|
45
|
+
|
46
|
+
existing = @sha1_checker.sha1('killbill-plugin-other-1.0.0.tar.gz')
|
47
|
+
existing.should_not be_nil
|
48
|
+
existing.should == 'bbb068c3fd5f95646ce0d09852f43ff67f06fccc'
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should add allow to modify an entry and find them all' do
|
52
|
+
|
53
|
+
existing = @sha1_checker.sha1('killbill-plugin-match-1.0.0.tar.gz')
|
54
|
+
existing.should_not be_nil
|
55
|
+
existing.should == 'fce068c3fd5f95646ce0d09852f43ff67f06f0b9'
|
56
|
+
|
57
|
+
@sha1_checker.add_or_modify_entry!('killbill-plugin-match-1.0.0.tar.gz', 'dde068c3fd5f95646ce0d09852f43ff67f06f0aa')
|
58
|
+
|
59
|
+
|
60
|
+
existing = @sha1_checker.sha1('killbill-plugin-match-1.0.0.tar.gz')
|
61
|
+
existing.should_not be_nil
|
62
|
+
existing.should == 'dde068c3fd5f95646ce0d09852f43ff67f06f0aa'
|
63
|
+
|
64
|
+
existing = @sha1_checker.sha1('killbill-plugin-other-1.0.0.tar.gz')
|
65
|
+
existing.should_not be_nil
|
66
|
+
existing.should == 'bbb068c3fd5f95646ce0d09852f43ff67f06fccc'
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'should work with empty config' do
|
70
|
+
|
71
|
+
tmp_destination_dir = Dir.tmpdir()
|
72
|
+
empty_config = File.join(tmp_destination_dir, 'sha1_test.yml')
|
73
|
+
if File.exists?(empty_config)
|
74
|
+
# Just to be sure
|
75
|
+
File.delete(empty_config)
|
76
|
+
end
|
77
|
+
@sha1_checker = KPM::Sha1Checker.from_file(empty_config)
|
78
|
+
|
79
|
+
@sha1_checker.add_or_modify_entry!('killbill-plugin-new-1.1.0.0.tar.gz', 'abc068c3fd5f95646ce0d09852f43ff67f06f111')
|
80
|
+
existing = @sha1_checker.sha1('killbill-plugin-new-1.1.0.0.tar.gz')
|
81
|
+
existing.should_not be_nil
|
82
|
+
existing.should == 'abc068c3fd5f95646ce0d09852f43ff67f06f111'
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kpm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kill Bill core team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- ".gemrelease"
|
91
91
|
- ".gitignore"
|
92
92
|
- Gemfile
|
93
|
+
- README.md
|
93
94
|
- Rakefile
|
94
95
|
- bin/kpm
|
95
96
|
- install_example.yml
|
@@ -103,6 +104,7 @@ files:
|
|
103
104
|
- lib/kpm/killbill_server_artifact.rb
|
104
105
|
- lib/kpm/plugins_directory.rb
|
105
106
|
- lib/kpm/plugins_directory.yml
|
107
|
+
- lib/kpm/sha1_checker.rb
|
106
108
|
- lib/kpm/tasks.rb
|
107
109
|
- lib/kpm/utils.rb
|
108
110
|
- lib/kpm/version.rb
|
@@ -111,6 +113,8 @@ files:
|
|
111
113
|
- spec/kpm/remote/kaui_artifact_spec.rb
|
112
114
|
- spec/kpm/remote/killbill_plugin_artifact_spec.rb
|
113
115
|
- spec/kpm/remote/killbill_server_artifact_spec.rb
|
116
|
+
- spec/kpm/unit/sha1_checker_spec.rb
|
117
|
+
- spec/kpm/unit/sha1_test.yml
|
114
118
|
- spec/spec_helper.rb
|
115
119
|
homepage: http://kill-bill.org
|
116
120
|
licenses:
|
@@ -144,4 +148,6 @@ test_files:
|
|
144
148
|
- spec/kpm/remote/kaui_artifact_spec.rb
|
145
149
|
- spec/kpm/remote/killbill_plugin_artifact_spec.rb
|
146
150
|
- spec/kpm/remote/killbill_server_artifact_spec.rb
|
151
|
+
- spec/kpm/unit/sha1_checker_spec.rb
|
152
|
+
- spec/kpm/unit/sha1_test.yml
|
147
153
|
- spec/spec_helper.rb
|