kpm 0.9.0 → 0.10.3
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/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
|