kpm 0.9.0 → 0.10.3
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/README.adoc +23 -3
- data/docker/docker-compose.ci.mysql.yml +21 -0
- data/kpm.gemspec +1 -0
- data/lib/kpm/blob.rb +4 -0
- data/lib/kpm/inspector.rb +8 -1
- data/lib/kpm/killbill_server_artifact.rb +19 -10
- data/lib/kpm/nexus_helper/actions.rb +8 -1
- data/lib/kpm/nexus_helper/cloudsmith_api_calls.rb +85 -0
- data/lib/kpm/plugins_directory.yml +8 -4
- data/lib/kpm/plugins_manager.rb +12 -5
- data/lib/kpm/tasks.rb +20 -4
- data/lib/kpm/version.rb +1 -1
- data/pom.xml +211 -40
- data/spec/kpm/remote/cloudsmith_api_calls_spec.rb +109 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 23329bb4cce96a95cae38e312063f509233c86fbcf5a3068f9963afab8fed54d
|
4
|
+
data.tar.gz: 270d7e52554e8b17181cd21c545e3aa9895474add6665d5d2b13921d79615c8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0fd8e93c1bb2301566965c2878d4f127b5886e3e6f19949ab394f5c895b68d53d7ccd35209b3f9e758f6384f87d9ec968308c0c8947843747552fdc6a28fcad2
|
7
|
+
data.tar.gz: 3054c061d4041391c06f3f784c135f9af8367f1e6ce098b44c8f5e74e78c2b111ce720345fb7bbab8243d83c4b6b28513e4e099e45fd3871b28c0e6fcd8e66e5
|
data/.gitignore
CHANGED
data/README.adoc
CHANGED
@@ -14,8 +14,9 @@ toc::[]
|
|
14
14
|
|
15
15
|
[[pre-built-binaries-recommended]]
|
16
16
|
=== Pre-built binaries (recommended)
|
17
|
+
image:https://img.shields.io/maven-central/v/org.kill-bill.billing.installer/kpm?color=blue&label=kpm[kpm]
|
17
18
|
|
18
|
-
KPM self-contained builds are available on http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.kill-bill.billing.installer%22%20AND%20a%3A%22kpm%22[Maven Central] with coordinates `org.kill-bill.billing.installer:kpm`.
|
19
|
+
On Linux and MacOS, you can use the pre-built binaries. KPM self-contained builds are available on http://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.kill-bill.billing.installer%22%20AND%20a%3A%22kpm%22[Maven Central] with coordinates `org.kill-bill.billing.installer:kpm`.
|
19
20
|
|
20
21
|
Download the `.tar.gz` package matching your architecture (Linux and MacOS only).
|
21
22
|
|
@@ -23,8 +24,13 @@ Note that this installation method assumes `/bin/bash` to be available on your s
|
|
23
24
|
|
24
25
|
[[through-rubygems]]
|
25
26
|
=== Through Rubygems
|
27
|
+
image:https://img.shields.io/gem/v/kpm?color=blue&label=kpm[kpm]
|
28
|
+
|
29
|
+
On Windows, you can install KPM via https://rubygems.org/gems/kpm[RubyGems.org]. For this, you need to first install Ruby. Ruby can be installed via https://rubyinstaller.org/[RubyInstaller]. Once installed, you can run the following command to install KPM:
|
30
|
+
[source,bash]
|
31
|
+
gem install kpm
|
32
|
+
|
26
33
|
|
27
|
-
KPM is also available on https://rubygems.org/gems/kpm[RubyGems.org].
|
28
34
|
|
29
35
|
[[kpm-commands]]
|
30
36
|
== KPM Commands
|
@@ -249,7 +255,7 @@ Notes:
|
|
249
255
|
[[gh-packages]]
|
250
256
|
### GitHub Packages
|
251
257
|
|
252
|
-
|
258
|
+
Starting with version 0.9.0, experimental support for GitHub packages has been added:
|
253
259
|
|
254
260
|
....
|
255
261
|
kpm install_java_plugin acme:plugin \
|
@@ -260,3 +266,17 @@ kpm install_java_plugin acme:plugin \
|
|
260
266
|
....
|
261
267
|
|
262
268
|
Replace `TOKEN` with a GitHub personal access token.
|
269
|
+
|
270
|
+
[[cloudsmith]]
|
271
|
+
### Cloudsmith
|
272
|
+
|
273
|
+
Starting with version 0.10.0, experimental support for Cloudsmith has been added:
|
274
|
+
|
275
|
+
....
|
276
|
+
kpm pull_kb_server_war 0.22.21-SNAPSHOT \
|
277
|
+
--overrides url:https://dl.cloudsmith.io/<TOKEN>/<ORG>/<REPO>/maven \
|
278
|
+
--group-id org.kill-bill.billing \
|
279
|
+
--artifact-id killbill-profiles-killbill
|
280
|
+
....
|
281
|
+
|
282
|
+
Replace `TOKEN` with a Cloudsmith entitlement token, and specify the right `ORG` and `REPO`.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
version: '3.8'
|
2
|
+
|
3
|
+
services:
|
4
|
+
killbill:
|
5
|
+
network_mode: host
|
6
|
+
image: killbill/killbill:0.22.1
|
7
|
+
environment:
|
8
|
+
- KILLBILL_CATALOG_URI=SpyCarAdvanced.xml
|
9
|
+
- KILLBILL_DAO_URL=jdbc:mysql://0.0.0.0:3306/killbill
|
10
|
+
- KILLBILL_DAO_USER=root
|
11
|
+
- KILLBILL_DAO_PASSWORD=root
|
12
|
+
- KILLBILL_SERVER_TEST_MODE=true
|
13
|
+
- KILLBILL_INVOICE_SANITY_SAFETY_BOUND_ENABLED=false
|
14
|
+
- KILLBILL_INVOICE_MAX_DAILY_NUMBER_OF_ITEMS_SAFETY_BOUND=-1
|
15
|
+
depends_on:
|
16
|
+
- db
|
17
|
+
db:
|
18
|
+
network_mode: host
|
19
|
+
image: killbill/mariadb:0.22
|
20
|
+
environment:
|
21
|
+
- MYSQL_ROOT_PASSWORD=root
|
data/kpm.gemspec
CHANGED
@@ -46,6 +46,7 @@ Gem::Specification.new do |s|
|
|
46
46
|
s.add_dependency 'rubyzip', '~>1.2.0'
|
47
47
|
s.add_dependency 'thor', '~> 0.19.1'
|
48
48
|
|
49
|
+
s.add_development_dependency 'gem-release', '~> 2.2'
|
49
50
|
s.add_development_dependency 'rake', '~> 13.0'
|
50
51
|
s.add_development_dependency 'rspec', '~> 3.9'
|
51
52
|
s.add_development_dependency 'rubocop', '~> 0.88.0' if RUBY_VERSION >= '2.4'
|
data/lib/kpm/blob.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'fileutils'
|
4
|
+
|
3
5
|
module KPM
|
4
6
|
class Blob
|
5
7
|
def initialize(value, tmp_dir)
|
6
8
|
@tmp_dir = tmp_dir
|
7
9
|
@blob_file = @tmp_dir + File::SEPARATOR + rand.to_s
|
10
|
+
# Make sure directory is 'rx' for others to allow LOAD_FILE to work
|
11
|
+
FileUtils.chmod('a+rx', @tmp_dir)
|
8
12
|
store_value(value)
|
9
13
|
end
|
10
14
|
|
data/lib/kpm/inspector.rb
CHANGED
@@ -75,7 +75,14 @@ module KPM
|
|
75
75
|
plugin_map = { plugin_name: plugin_name, plugin_path: plugin_path.to_s, type: type }
|
76
76
|
entries = get_entries(plugin_path)
|
77
77
|
set_default = entries.select { |e| e == 'SET_DEFAULT' }[0]
|
78
|
-
default_version =
|
78
|
+
default_version = nil
|
79
|
+
if set_default
|
80
|
+
begin
|
81
|
+
default_version = File.basename(File.readlink(plugin_path.join(set_default)))
|
82
|
+
rescue StandardError
|
83
|
+
# On Windows, SET_DEFAULT is a directory, not a symbolic link
|
84
|
+
end
|
85
|
+
end
|
79
86
|
|
80
87
|
non_default = entries.reject do |e|
|
81
88
|
e == 'SET_DEFAULT'
|
@@ -41,10 +41,15 @@ module KPM
|
|
41
41
|
ssl_verify)
|
42
42
|
|
43
43
|
# Extract the killbill-oss-parent version
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
44
|
+
file = File.new(kb_pom_info[:file_path])
|
45
|
+
begin
|
46
|
+
pom = REXML::Document.new(file)
|
47
|
+
oss_parent_version = pom.root.elements['parent/version'].text
|
48
|
+
kb_version = pom.root.elements['version'].text
|
49
|
+
ensure
|
50
|
+
file.close
|
51
|
+
FileUtils.rm_f(kb_pom_info[:file_path])
|
52
|
+
end
|
48
53
|
versions['killbill'] = kb_version
|
49
54
|
versions['killbill-oss-parent'] = oss_parent_version
|
50
55
|
|
@@ -61,13 +66,17 @@ module KPM
|
|
61
66
|
verify_sha1,
|
62
67
|
overrides,
|
63
68
|
ssl_verify)
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
+
file = File.new(oss_pom_info[:file_path])
|
70
|
+
begin
|
71
|
+
pom = REXML::Document.new(file)
|
72
|
+
properties_element = pom.root.elements['properties']
|
73
|
+
%w[killbill-api killbill-plugin-api killbill-commons killbill-platform].each do |property|
|
74
|
+
versions[property] = properties_element.elements["#{property}.version"].text
|
75
|
+
end
|
76
|
+
ensure
|
77
|
+
file.close
|
78
|
+
FileUtils.rm_f(oss_pom_info[:file_path])
|
69
79
|
end
|
70
|
-
|
71
80
|
sha1_checker.cache_killbill_info(version, versions) if sha1_checker
|
72
81
|
end
|
73
82
|
versions
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative 'nexus_api_calls_v2'
|
4
4
|
require_relative 'github_api_calls'
|
5
|
+
require_relative 'cloudsmith_api_calls'
|
5
6
|
|
6
7
|
module KPM
|
7
8
|
module NexusFacade
|
@@ -29,7 +30,13 @@ module KPM
|
|
29
30
|
|
30
31
|
@logger = logger
|
31
32
|
|
32
|
-
@nexus_api_call = overrides[:url].start_with?('https://maven.pkg.github.com')
|
33
|
+
@nexus_api_call = if overrides[:url].start_with?('https://maven.pkg.github.com')
|
34
|
+
GithubApiCalls.new(overrides, ssl_verify, logger)
|
35
|
+
elsif overrides[:url].start_with?('https://dl.cloudsmith.io')
|
36
|
+
CloudsmithApiCalls.new(overrides, ssl_verify, logger)
|
37
|
+
else
|
38
|
+
NexusApiCallsV2.new(overrides, ssl_verify, logger)
|
39
|
+
end
|
33
40
|
end
|
34
41
|
|
35
42
|
def pull_artifact(coordinates, destination = nil)
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
require 'rexml/document'
|
6
|
+
require 'openssl'
|
7
|
+
|
8
|
+
module KPM
|
9
|
+
module NexusFacade
|
10
|
+
class CloudsmithApiCalls < NexusApiCallsV2
|
11
|
+
def pull_artifact_endpoint(coordinates)
|
12
|
+
version_artifact_details = begin
|
13
|
+
parent_get_artifact_info(coordinates)
|
14
|
+
rescue StandardError
|
15
|
+
''
|
16
|
+
end
|
17
|
+
|
18
|
+
# For SNAPSHOTs, we need to figure out the version used as part of the filename
|
19
|
+
filename_version = begin
|
20
|
+
REXML::Document.new(version_artifact_details).elements['//versioning/snapshotVersions/snapshotVersion[1]/value'].text
|
21
|
+
rescue StandardError
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
coords = parse_coordinates(coordinates)
|
25
|
+
coords[:version] = filename_version unless filename_version.nil?
|
26
|
+
new_coordinates = coords.values.compact.join(':')
|
27
|
+
|
28
|
+
base_path, versioned_artifact, = build_base_path_and_coords(new_coordinates)
|
29
|
+
"#{base_path}/#{versioned_artifact}"
|
30
|
+
end
|
31
|
+
|
32
|
+
alias parent_get_artifact_info get_artifact_info
|
33
|
+
def get_artifact_info(coordinates)
|
34
|
+
_, versioned_artifact, coords = build_base_path_and_coords(coordinates)
|
35
|
+
sha1 = get_sha1(coordinates)
|
36
|
+
"<artifact-resolution>
|
37
|
+
<data>
|
38
|
+
<presentLocally>true</presentLocally>
|
39
|
+
<groupId>#{coords[:group_id]}</groupId>
|
40
|
+
<artifactId>#{coords[:artifact_id]}</artifactId>
|
41
|
+
<version>#{coords[:version]}</version>
|
42
|
+
<extension>#{coords[:packaging]}</extension>
|
43
|
+
<snapshot>#{!(coords[:version] =~ /-SNAPSHOT$/).nil?}</snapshot>
|
44
|
+
<sha1>#{sha1}</sha1>
|
45
|
+
<repositoryPath>/#{coords[:group_id].gsub('.', '/')}/#{versioned_artifact}</repositoryPath>
|
46
|
+
</data>
|
47
|
+
</artifact-resolution>"
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_artifact_info_endpoint(coordinates)
|
51
|
+
base_path, _, coords = build_base_path_and_coords(coordinates)
|
52
|
+
# Note: we must retrieve the XML for the version, to support SNAPSHOTs
|
53
|
+
"#{base_path}/#{coords[:version]}/maven-metadata.xml"
|
54
|
+
end
|
55
|
+
|
56
|
+
def search_for_artifact_endpoint(_coordinates)
|
57
|
+
raise NoMethodError, 'Cloudsmith has no search support'
|
58
|
+
end
|
59
|
+
|
60
|
+
def build_query_params(_coordinates, _what_parameters = nil)
|
61
|
+
''
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def get_sha1(coordinates)
|
67
|
+
base_path, versioned_artifact, = build_base_path_and_coords(coordinates)
|
68
|
+
endpoint = "#{base_path}/#{versioned_artifact}.sha1"
|
69
|
+
get_response_with_retries(coordinates, endpoint, nil)
|
70
|
+
end
|
71
|
+
|
72
|
+
def build_base_path_and_coords(coordinates)
|
73
|
+
coords = parse_coordinates(coordinates)
|
74
|
+
|
75
|
+
token_org_and_repo = URI.parse(configuration[:url]).path
|
76
|
+
|
77
|
+
[
|
78
|
+
"#{token_org_and_repo}/#{coords[:group_id].gsub('.', '/')}/#{coords[:artifact_id]}",
|
79
|
+
"#{coords[:version]}/#{coords[:artifact_id]}-#{coords[:version]}.#{coords[:extension]}",
|
80
|
+
coords
|
81
|
+
]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -13,17 +13,21 @@
|
|
13
13
|
:versions:
|
14
14
|
:0.18: 4.2.5
|
15
15
|
:0.20: 6.0.1
|
16
|
-
:0.22: 7.
|
16
|
+
:0.22: 7.2.3
|
17
17
|
:avatax:
|
18
18
|
:type: :java
|
19
19
|
:versions:
|
20
20
|
:0.18: 0.4.1
|
21
21
|
:0.20: 0.6.1
|
22
|
-
:0.22: 0.
|
22
|
+
:0.22: 0.8.3
|
23
23
|
:cybersource:
|
24
24
|
:type: :ruby
|
25
25
|
:versions:
|
26
26
|
:0.18: 5.2.7
|
27
|
+
:deposit:
|
28
|
+
:type: :java
|
29
|
+
:versions:
|
30
|
+
:0.22: 0.0.2
|
27
31
|
:dwolla:
|
28
32
|
:type: :java
|
29
33
|
:versions:
|
@@ -34,7 +38,7 @@
|
|
34
38
|
:versions:
|
35
39
|
:0.18: 0.3.1
|
36
40
|
:0.20: 0.5.1
|
37
|
-
:0.22: 0.
|
41
|
+
:0.22: 0.7.2
|
38
42
|
:forte:
|
39
43
|
:type: :java
|
40
44
|
:versions:
|
@@ -76,4 +80,4 @@
|
|
76
80
|
:stripe:
|
77
81
|
:type: :java
|
78
82
|
:versions:
|
79
|
-
:0.22: 7.0
|
83
|
+
:0.22: 7.3.0
|
data/lib/kpm/plugins_manager.rb
CHANGED
@@ -10,6 +10,15 @@ module KPM
|
|
10
10
|
@logger = logger
|
11
11
|
end
|
12
12
|
|
13
|
+
def create_symbolic_link(path, link)
|
14
|
+
FileUtils.rm_f(link)
|
15
|
+
FileUtils.ln_s(path, link, force: true)
|
16
|
+
rescue Errno::EACCES
|
17
|
+
@logger.warn('Unable to create symbolic link LATEST, will copy the directory')
|
18
|
+
FileUtils.rm_rf(link)
|
19
|
+
FileUtils.cp_r(path, link)
|
20
|
+
end
|
21
|
+
|
13
22
|
def set_active(plugin_name_or_path, plugin_version = nil)
|
14
23
|
if plugin_name_or_path.nil?
|
15
24
|
@logger.warn('Unable to mark a plugin as active: no name or path specified')
|
@@ -19,8 +28,7 @@ module KPM
|
|
19
28
|
if plugin_version.nil?
|
20
29
|
# Full path specified, with version
|
21
30
|
link = Pathname.new(plugin_name_or_path).join('../SET_DEFAULT')
|
22
|
-
|
23
|
-
FileUtils.ln_s(plugin_name_or_path, link, force: true)
|
31
|
+
create_symbolic_link(plugin_name_or_path, link)
|
24
32
|
else
|
25
33
|
# Plugin name (fs directory) specified
|
26
34
|
plugin_dir_glob = @plugins_dir.join('*').join(plugin_name_or_path)
|
@@ -28,8 +36,7 @@ module KPM
|
|
28
36
|
Dir.glob(plugin_dir_glob).each do |plugin_dir_path|
|
29
37
|
plugin_dir = Pathname.new(plugin_dir_path)
|
30
38
|
link = plugin_dir.join('SET_DEFAULT')
|
31
|
-
|
32
|
-
FileUtils.ln_s(plugin_dir.join(plugin_version), link, force: true)
|
39
|
+
create_symbolic_link(plugin_dir.join(plugin_version), link)
|
33
40
|
end
|
34
41
|
end
|
35
42
|
|
@@ -179,7 +186,7 @@ module KPM
|
|
179
186
|
end
|
180
187
|
end
|
181
188
|
|
182
|
-
#
|
189
|
+
# NOTE: the plugin name here is the directory name on the filesystem
|
183
190
|
def update_fs(plugin_name_or_path, plugin_version = nil)
|
184
191
|
if plugin_name_or_path.nil?
|
185
192
|
@logger.warn('Unable to update the filesystem: no name or path specified')
|
data/lib/kpm/tasks.rb
CHANGED
@@ -72,6 +72,22 @@ module KPM
|
|
72
72
|
Uninstaller.new(options[:destination]).uninstall_non_default_plugins(options[:dry_run])
|
73
73
|
end
|
74
74
|
|
75
|
+
method_option :group_id,
|
76
|
+
type: :string,
|
77
|
+
default: KillbillServerArtifact::KILLBILL_GROUP_ID,
|
78
|
+
desc: 'The Kill Bill war artifact group-id'
|
79
|
+
method_option :artifact_id,
|
80
|
+
type: :string,
|
81
|
+
default: KillbillServerArtifact::KILLBILL_ARTIFACT_ID,
|
82
|
+
desc: 'The Kill Bill war artifact id'
|
83
|
+
method_option :packaging,
|
84
|
+
type: :string,
|
85
|
+
default: KillbillServerArtifact::KILLBILL_PACKAGING,
|
86
|
+
desc: 'The Kill Bill war packaging'
|
87
|
+
method_option :classifier,
|
88
|
+
type: :string,
|
89
|
+
default: KillbillServerArtifact::KILLBILL_CLASSIFIER,
|
90
|
+
desc: 'The Kill Bill war classifier'
|
75
91
|
method_option :destination,
|
76
92
|
type: :string,
|
77
93
|
default: nil,
|
@@ -93,10 +109,10 @@ module KPM
|
|
93
109
|
installer = BaseInstaller.new(logger,
|
94
110
|
options[:overrides],
|
95
111
|
options[:ssl_verify])
|
96
|
-
response = installer.install_killbill_server(
|
97
|
-
|
98
|
-
|
99
|
-
|
112
|
+
response = installer.install_killbill_server(options[:group_id],
|
113
|
+
options[:artifact_id],
|
114
|
+
options[:packaging],
|
115
|
+
options[:classifier],
|
100
116
|
version,
|
101
117
|
options[:destination],
|
102
118
|
options[:bundles_dir],
|
data/lib/kpm/version.rb
CHANGED
data/pom.xml
CHANGED
@@ -1,45 +1,216 @@
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
2
2
|
<!--
|
3
|
-
~ Copyright 2014
|
4
|
-
~
|
5
|
-
~
|
6
|
-
~
|
7
|
-
~
|
8
|
-
~
|
9
|
-
~
|
10
|
-
~
|
11
|
-
~
|
12
|
-
~
|
13
|
-
~
|
14
|
-
~
|
15
|
-
~
|
16
|
-
|
17
|
-
|
3
|
+
~ Copyright 2010-2014 Ning, Inc.
|
4
|
+
~ Copyright 2014-2020 Groupon, Inc
|
5
|
+
~ Copyright 2020-2020 Equinix, Inc
|
6
|
+
~ Copyright 2014-2020 The Billing Project, LLC
|
7
|
+
~
|
8
|
+
~ The Billing Project licenses this file to you under the Apache License, version 2.0
|
9
|
+
~ (the "License"); you may not use this file except in compliance with the
|
10
|
+
~ License. You may obtain a copy of the License at:
|
11
|
+
~
|
12
|
+
~ http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
~
|
14
|
+
~ Unless required by applicable law or agreed to in writing, software
|
15
|
+
~ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
16
|
+
~ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
17
|
+
~ License for the specific language governing permissions and limitations
|
18
|
+
~ under the License.
|
19
|
+
-->
|
18
20
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
19
21
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
20
|
-
|
21
|
-
<groupId>org.
|
22
|
-
<artifactId>
|
23
|
-
<version>
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
22
|
+
<modelVersion>4.0.0</modelVersion>
|
23
|
+
<groupId>org.kill-bill.billing.installer</groupId>
|
24
|
+
<artifactId>kpm</artifactId>
|
25
|
+
<version>0.10.3</version>
|
26
|
+
<packaging>pom</packaging>
|
27
|
+
<name>KPM</name>
|
28
|
+
<description>KPM: the Kill Bill Package Manager</description>
|
29
|
+
<url>http://github.com/killbill/killbill-cloud</url>
|
30
|
+
<inceptionYear>2010</inceptionYear>
|
31
|
+
<licenses>
|
32
|
+
<license>
|
33
|
+
<name>Apache License 2.0</name>
|
34
|
+
<url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
|
35
|
+
<distribution>repo</distribution>
|
36
|
+
</license>
|
37
|
+
</licenses>
|
38
|
+
<developers>
|
39
|
+
<developer>
|
40
|
+
<id>pierre</id>
|
41
|
+
<name>Pierre-Alexandre Meyer</name>
|
42
|
+
<email>pierre@mouraf.org</email>
|
43
|
+
</developer>
|
44
|
+
<developer>
|
45
|
+
<id>stephane</id>
|
46
|
+
<name>Stephane Brossier</name>
|
47
|
+
</developer>
|
48
|
+
</developers>
|
49
|
+
<mailingLists>
|
50
|
+
<mailingList>
|
51
|
+
<name>Kill Bill users</name>
|
52
|
+
<subscribe>killbilling-users+subscribe@googlegroups.com</subscribe>
|
53
|
+
<unsubscribe>killbilling-users+unsubscribe@googlegroups.com</unsubscribe>
|
54
|
+
<post>killbilling-users@googlegroups.com</post>
|
55
|
+
<archive>http://groups.google.com/group/killbilling-users</archive>
|
56
|
+
</mailingList>
|
57
|
+
</mailingLists>
|
58
|
+
<scm>
|
59
|
+
<connection>scm:git:git://github.com/killbill/killbill-cloud.git</connection>
|
60
|
+
<url>https://github.com/killbill/killbill-cloud/</url>
|
61
|
+
<developerConnection>scm:git:git@github.com:killbill/killbill-cloud.git</developerConnection>
|
62
|
+
</scm>
|
63
|
+
<issueManagement>
|
64
|
+
<system>Github</system>
|
65
|
+
<url>https://github.com/killbill/killbill-cloud/issues</url>
|
66
|
+
</issueManagement>
|
67
|
+
<distributionManagement>
|
68
|
+
<repository>
|
69
|
+
<id>${repository.release.id}</id>
|
70
|
+
<name>${repository.release.name}</name>
|
71
|
+
<url>${repository.release.url}</url>
|
72
|
+
</repository>
|
73
|
+
<snapshotRepository>
|
74
|
+
<id>${repository.snapshot.id}</id>
|
75
|
+
<name>${repository.snapshot.name}</name>
|
76
|
+
<url>${repository.snapshot.url}</url>
|
77
|
+
</snapshotRepository>
|
78
|
+
</distributionManagement>
|
79
|
+
<properties>
|
80
|
+
<repository.release.id>sonatype-nexus-staging</repository.release.id>
|
81
|
+
<repository.release.name>Nexus Release Repository</repository.release.name>
|
82
|
+
<repository.release.url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</repository.release.url>
|
83
|
+
<repository.snapshot.id>sonatype-nexus-snapshots</repository.snapshot.id>
|
84
|
+
<repository.snapshot.name>Sonatype Nexus Snapshots</repository.snapshot.name>
|
85
|
+
<repository.snapshot.url>https://oss.sonatype.org/content/repositories/snapshots/</repository.snapshot.url>
|
86
|
+
</properties>
|
87
|
+
<build>
|
88
|
+
<pluginManagement>
|
89
|
+
<plugins>
|
90
|
+
<plugin>
|
91
|
+
<artifactId>maven-compiler-plugin</artifactId>
|
92
|
+
<executions>
|
93
|
+
<execution>
|
94
|
+
<id>default-compile</id>
|
95
|
+
<phase>none</phase>
|
96
|
+
</execution>
|
97
|
+
<execution>
|
98
|
+
<id>default-testCompile</id>
|
99
|
+
<phase>none</phase>
|
100
|
+
</execution>
|
101
|
+
</executions>
|
102
|
+
</plugin>
|
103
|
+
<plugin>
|
104
|
+
<artifactId>maven-install-plugin</artifactId>
|
105
|
+
<executions>
|
106
|
+
<execution>
|
107
|
+
<id>default-install</id>
|
108
|
+
<phase>none</phase>
|
109
|
+
</execution>
|
110
|
+
</executions>
|
111
|
+
</plugin>
|
112
|
+
<plugin>
|
113
|
+
<artifactId>maven-resources-plugin</artifactId>
|
114
|
+
<executions>
|
115
|
+
<execution>
|
116
|
+
<id>default-resources</id>
|
117
|
+
<phase>none</phase>
|
118
|
+
</execution>
|
119
|
+
<execution>
|
120
|
+
<id>default-testResources</id>
|
121
|
+
<phase>none</phase>
|
122
|
+
</execution>
|
123
|
+
</executions>
|
124
|
+
</plugin>
|
125
|
+
<plugin>
|
126
|
+
<artifactId>maven-surefire-plugin</artifactId>
|
127
|
+
<executions>
|
128
|
+
<execution>
|
129
|
+
<id>default-test</id>
|
130
|
+
<phase>none</phase>
|
131
|
+
</execution>
|
132
|
+
</executions>
|
133
|
+
</plugin>
|
134
|
+
</plugins>
|
135
|
+
</pluginManagement>
|
136
|
+
<plugins>
|
137
|
+
<plugin>
|
138
|
+
<groupId>org.codehaus.mojo</groupId>
|
139
|
+
<artifactId>build-helper-maven-plugin</artifactId>
|
140
|
+
<version>3.2.0</version>
|
141
|
+
<executions>
|
142
|
+
<execution>
|
143
|
+
<id>attach-artifacts</id>
|
144
|
+
<phase>package</phase>
|
145
|
+
<goals>
|
146
|
+
<goal>attach-artifact</goal>
|
147
|
+
</goals>
|
148
|
+
<configuration>
|
149
|
+
<artifacts>
|
150
|
+
<artifact>
|
151
|
+
<file>kpm-${project.version}-linux-x86.tar.gz</file>
|
152
|
+
<type>tar.gz</type>
|
153
|
+
<classifier>linux-x86</classifier>
|
154
|
+
</artifact>
|
155
|
+
<artifact>
|
156
|
+
<file>kpm-${project.version}-linux-x86_64.tar.gz</file>
|
157
|
+
<type>tar.gz</type>
|
158
|
+
<classifier>linux-x86_64</classifier>
|
159
|
+
</artifact>
|
160
|
+
<artifact>
|
161
|
+
<file>kpm-${project.version}-osx.tar.gz</file>
|
162
|
+
<type>tar.gz</type>
|
163
|
+
<classifier>osx</classifier>
|
164
|
+
</artifact>
|
165
|
+
</artifacts>
|
166
|
+
</configuration>
|
167
|
+
</execution>
|
168
|
+
</executions>
|
169
|
+
</plugin>
|
170
|
+
</plugins>
|
171
|
+
</build>
|
172
|
+
<profiles>
|
173
|
+
<profile>
|
174
|
+
<id>sonatype-oss-release</id>
|
175
|
+
<build>
|
176
|
+
<plugins>
|
177
|
+
<plugin>
|
178
|
+
<groupId>org.apache.maven.plugins</groupId>
|
179
|
+
<artifactId>maven-gpg-plugin</artifactId>
|
180
|
+
<version>1.6</version>
|
181
|
+
<executions>
|
182
|
+
<execution>
|
183
|
+
<id>sign-artifacts</id>
|
184
|
+
<phase>verify</phase>
|
185
|
+
<goals>
|
186
|
+
<goal>sign</goal>
|
187
|
+
</goals>
|
188
|
+
<configuration>
|
189
|
+
<!-- Prevent `gpg` from using pinentry programs -->
|
190
|
+
<gpgArguments>
|
191
|
+
<arg>--pinentry-mode</arg>
|
192
|
+
<arg>loopback</arg>
|
193
|
+
</gpgArguments>
|
194
|
+
</configuration>
|
195
|
+
</execution>
|
196
|
+
</executions>
|
197
|
+
</plugin>
|
198
|
+
<plugin>
|
199
|
+
<groupId>org.sonatype.plugins</groupId>
|
200
|
+
<artifactId>nexus-staging-maven-plugin</artifactId>
|
201
|
+
<version>1.6.8</version>
|
202
|
+
<extensions>true</extensions>
|
203
|
+
<configuration>
|
204
|
+
<serverId>ossrh-releases</serverId>
|
205
|
+
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
206
|
+
<keepStagingRepositoryOnFailure>true</keepStagingRepositoryOnFailure>
|
207
|
+
<keepStagingRepositoryOnCloseRuleFailure>true</keepStagingRepositoryOnCloseRuleFailure>
|
208
|
+
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
209
|
+
<stagingProgressTimeoutMinutes>10</stagingProgressTimeoutMinutes>
|
210
|
+
</configuration>
|
211
|
+
</plugin>
|
212
|
+
</plugins>
|
213
|
+
</build>
|
214
|
+
</profile>
|
215
|
+
</profiles>
|
45
216
|
</project>
|
@@ -0,0 +1,109 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'rexml/document'
|
5
|
+
|
6
|
+
describe KPM::NexusFacade, skip_me_if_nil: ENV['CLOUDSMITH_TOKEN'].nil? do
|
7
|
+
let(:logger) do
|
8
|
+
logger = ::Logger.new(STDOUT)
|
9
|
+
logger.level = Logger::INFO
|
10
|
+
logger
|
11
|
+
end
|
12
|
+
let(:coordinates_map) do
|
13
|
+
{ version: '0.22.21-20210319.010242-1',
|
14
|
+
group_id: 'org.kill-bill.billing',
|
15
|
+
artifact_id: 'killbill',
|
16
|
+
packaging: 'pom',
|
17
|
+
classifier: nil }
|
18
|
+
end
|
19
|
+
let(:coordinates) { KPM::Coordinates.build_coordinates(coordinates_map) }
|
20
|
+
let(:nexus_remote) { described_class::CloudsmithApiCalls.new({ :url => "https://dl.cloudsmith.io/#{ENV['CLOUDSMITH_TOKEN']}/#{ENV['CLOUDSMITH_ORG']}/#{ENV['CLOUDSMITH_REPO']}/maven" }, true, logger) }
|
21
|
+
|
22
|
+
it {
|
23
|
+
# Not implemented
|
24
|
+
expect { nexus_remote.search_for_artifacts(coordinates) }.to raise_exception(NoMethodError, 'Cloudsmith has no search support')
|
25
|
+
}
|
26
|
+
|
27
|
+
# Upload as: cloudsmith push maven -v --group-id com.mycompany.app --artifact-id my-app --packaging pom --version 1.2.3 org/repo my-app-1.2.3.pom
|
28
|
+
# <project>
|
29
|
+
# <modelVersion>4.0.0</modelVersion>
|
30
|
+
# <groupId>com.mycompany.app</groupId>
|
31
|
+
# <artifactId>my-app</artifactId>
|
32
|
+
# <version>1.2.3</version>
|
33
|
+
# <packaging>pom</packaging>
|
34
|
+
# </project>
|
35
|
+
context 'when pulling release artifact' do
|
36
|
+
let(:coordinates_map) do
|
37
|
+
{ version: '1.2.3',
|
38
|
+
group_id: 'com.mycompany.app',
|
39
|
+
artifact_id: 'my-app',
|
40
|
+
packaging: 'pom',
|
41
|
+
classifier: nil }
|
42
|
+
end
|
43
|
+
let(:coordinates) { KPM::Coordinates.build_coordinates(coordinates_map) }
|
44
|
+
|
45
|
+
it {
|
46
|
+
response = nil
|
47
|
+
expect { response = nexus_remote.get_artifact_info(coordinates) }.not_to raise_exception
|
48
|
+
parsed_doc = REXML::Document.new(response)
|
49
|
+
expect(parsed_doc.elements['//version'].text).to eq('1.2.3')
|
50
|
+
expect(parsed_doc.elements['//repositoryPath'].text).to eq('/com/mycompany/app/1.2.3/my-app-1.2.3.pom')
|
51
|
+
expect(parsed_doc.elements['//snapshot'].text).to eq('false')
|
52
|
+
}
|
53
|
+
|
54
|
+
it {
|
55
|
+
response = nil
|
56
|
+
destination = Dir.mktmpdir('artifact')
|
57
|
+
expect { response = nexus_remote.pull_artifact(coordinates, destination) }.not_to raise_exception
|
58
|
+
destination = File.join(File.expand_path(destination), response[:file_name])
|
59
|
+
parsed_pom = REXML::Document.new(File.read(destination))
|
60
|
+
expect(parsed_pom.elements['//groupId'].text).to eq('com.mycompany.app')
|
61
|
+
expect(parsed_pom.elements['//artifactId'].text).to eq('my-app')
|
62
|
+
expect(parsed_pom.elements['//version'].text).to eq('1.2.3')
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
# File uploaded twice (the first doesn't have any <properties>)
|
67
|
+
# <project>
|
68
|
+
# <modelVersion>4.0.0</modelVersion>
|
69
|
+
# <groupId>com.mycompany.app</groupId>
|
70
|
+
# <artifactId>my-app</artifactId>
|
71
|
+
# <version>1.2.4-SNAPSHOT</version>
|
72
|
+
# <packaging>pom</packaging>
|
73
|
+
# <properties>
|
74
|
+
# <for-kpm>true</for-kpm>
|
75
|
+
# </properties>
|
76
|
+
# </project>
|
77
|
+
context 'when pulling SNAPSHOT artifact' do
|
78
|
+
let(:coordinates_map) do
|
79
|
+
{ version: '1.2.4-SNAPSHOT',
|
80
|
+
group_id: 'com.mycompany.app',
|
81
|
+
artifact_id: 'my-app',
|
82
|
+
packaging: 'pom',
|
83
|
+
classifier: nil }
|
84
|
+
end
|
85
|
+
let(:coordinates) { KPM::Coordinates.build_coordinates(coordinates_map) }
|
86
|
+
|
87
|
+
it {
|
88
|
+
response = nil
|
89
|
+
expect { response = nexus_remote.get_artifact_info(coordinates) }.not_to raise_exception
|
90
|
+
parsed_doc = REXML::Document.new(response)
|
91
|
+
expect(parsed_doc.elements['//version'].text).to eq('1.2.4-SNAPSHOT')
|
92
|
+
expect(parsed_doc.elements['//repositoryPath'].text).to eq('/com/mycompany/app/1.2.4-SNAPSHOT/my-app-1.2.4-SNAPSHOT.pom')
|
93
|
+
expect(parsed_doc.elements['//snapshot'].text).to eq('true')
|
94
|
+
}
|
95
|
+
|
96
|
+
it {
|
97
|
+
response = nil
|
98
|
+
destination = Dir.mktmpdir('artifact')
|
99
|
+
expect { response = nexus_remote.pull_artifact(coordinates, destination) }.not_to raise_exception
|
100
|
+
destination = File.join(File.expand_path(destination), response[:file_name])
|
101
|
+
parsed_pom = REXML::Document.new(File.read(destination))
|
102
|
+
expect(parsed_pom.elements['//groupId'].text).to eq('com.mycompany.app')
|
103
|
+
expect(parsed_pom.elements['//artifactId'].text).to eq('my-app')
|
104
|
+
expect(parsed_pom.elements['//version'].text).to eq('1.2.4-SNAPSHOT')
|
105
|
+
# Verify that if multiple SNAPSHOTs are uploaded, the last one is downloaded (the first one doesn't have <properties>)
|
106
|
+
expect(parsed_pom.elements['//properties/for-kpm'].text).to eq('true')
|
107
|
+
}
|
108
|
+
end
|
109
|
+
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.
|
4
|
+
version: 0.10.3
|
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:
|
11
|
+
date: 2021-07-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 0.19.1
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: gem-release
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '2.2'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '2.2'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +122,7 @@ files:
|
|
108
122
|
- README.adoc
|
109
123
|
- Rakefile
|
110
124
|
- bin/kpm
|
125
|
+
- docker/docker-compose.ci.mysql.yml
|
111
126
|
- install_example.yml
|
112
127
|
- kpm.gemspec
|
113
128
|
- lib/kpm.rb
|
@@ -127,6 +142,7 @@ files:
|
|
127
142
|
- lib/kpm/killbill_server_artifact.rb
|
128
143
|
- lib/kpm/migrations.rb
|
129
144
|
- lib/kpm/nexus_helper/actions.rb
|
145
|
+
- lib/kpm/nexus_helper/cloudsmith_api_calls.rb
|
130
146
|
- lib/kpm/nexus_helper/github_api_calls.rb
|
131
147
|
- lib/kpm/nexus_helper/nexus_api_calls_v2.rb
|
132
148
|
- lib/kpm/nexus_helper/nexus_facade.rb
|
@@ -155,6 +171,7 @@ files:
|
|
155
171
|
- release.sh
|
156
172
|
- spec/kpm/remote/base_artifact_spec.rb
|
157
173
|
- spec/kpm/remote/base_installer_spec.rb
|
174
|
+
- spec/kpm/remote/cloudsmith_api_calls_spec.rb
|
158
175
|
- spec/kpm/remote/github_api_calls_spec.rb
|
159
176
|
- spec/kpm/remote/installer_spec.rb
|
160
177
|
- spec/kpm/remote/kaui_artifact_spec.rb
|