nexus_cli 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -1
- data/VERSION +1 -1
- data/bin/nexus-cli +6 -1
- data/features/nexus_oss.feature +102 -0
- data/features/step_definitions/cli_steps.rb +19 -4
- data/features/support/env.rb +21 -1
- data/lib/nexus_cli.rb +5 -0
- data/lib/nexus_cli/configuration.rb +24 -0
- data/lib/nexus_cli/errors.rb +15 -0
- data/lib/nexus_cli/nexus_oss_remote.rb +62 -32
- data/lib/nexus_cli/nexus_pro_remote.rb +1 -1
- data/lib/nexus_cli/nexus_remote_factory.rb +1 -20
- data/lib/nexus_cli/tasks.rb +50 -75
- data/nexus_cli.gemspec +2 -0
- data/spec/configuration_spec.rb +23 -0
- data/spec/oss_remote_spec.rb +23 -0
- metadata +43 -8
- data/features/cli/nexus_oss.feature +0 -49
- data/spec/remote_spec.rb +0 -43
data/.gitignore
CHANGED
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.4.0
|
data/bin/nexus-cli
CHANGED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
Feature: Use the Nexus CLI
|
|
2
|
+
As a CLI user
|
|
3
|
+
I need commands to get Nexus status, push, pull
|
|
4
|
+
|
|
5
|
+
Scenario: Get Nexus Status
|
|
6
|
+
When I call the nexus "status" command
|
|
7
|
+
Then the output should contain:
|
|
8
|
+
"""
|
|
9
|
+
Application Name: Sonatype Nexus
|
|
10
|
+
"""
|
|
11
|
+
And the exit status should be 0
|
|
12
|
+
|
|
13
|
+
@push
|
|
14
|
+
Scenario: Push an Artifact
|
|
15
|
+
When I push an artifact with the GAV of "com.test:mytest:1.0.0:tgz"
|
|
16
|
+
Then the output should contain:
|
|
17
|
+
"""
|
|
18
|
+
Artifact com.test:mytest:1.0.0:tgz has been successfully pushed to Nexus.
|
|
19
|
+
"""
|
|
20
|
+
And the exit status should be 0
|
|
21
|
+
|
|
22
|
+
Scenario: Pull an artifact
|
|
23
|
+
When I call the nexus "pull com.test:mytest:1.0.0:tgz" command
|
|
24
|
+
Then the output should contain:
|
|
25
|
+
"""
|
|
26
|
+
Artifact has been retrived and can be found at path:
|
|
27
|
+
"""
|
|
28
|
+
And the exit status should be 0
|
|
29
|
+
|
|
30
|
+
Scenario: Pull the LATEST of an artifact
|
|
31
|
+
When I pull an artifact with the GAV of "com.test:mytest:latest:tgz" to a temp directory
|
|
32
|
+
Then I should have a copy of the "mytest-1.0.0.tgz" artifact in a temp directory
|
|
33
|
+
And the exit status should be 0
|
|
34
|
+
|
|
35
|
+
Scenario: Pull an artifact to a specific place
|
|
36
|
+
When I pull an artifact with the GAV of "com.test:mytest:1.0.0:tgz" to a temp directory
|
|
37
|
+
Then I should have a copy of the "mytest-1.0.0.tgz" artifact in a temp directory
|
|
38
|
+
And the exit status should be 0
|
|
39
|
+
|
|
40
|
+
Scenario: Get an artifact's info
|
|
41
|
+
When I call the nexus "info com.test:mytest:1.0.0:tgz" command
|
|
42
|
+
Then the output should contain:
|
|
43
|
+
"""
|
|
44
|
+
<groupId>com.test</groupId>
|
|
45
|
+
"""
|
|
46
|
+
And the exit status should be 0
|
|
47
|
+
|
|
48
|
+
Scenario: Search for artifacts
|
|
49
|
+
When I call the nexus "search_for_artifacts com.test:mytest" command
|
|
50
|
+
Then the output should contain:
|
|
51
|
+
"""
|
|
52
|
+
Found Versions:
|
|
53
|
+
1.0.0: `nexus-cli pull com.test:mytest:1.0.0:tgz`
|
|
54
|
+
"""
|
|
55
|
+
And the exit status should be 0
|
|
56
|
+
|
|
57
|
+
@delete
|
|
58
|
+
Scenario: Attempt to delete an artifact
|
|
59
|
+
When I delete an artifact with the GAV of "com.test:mytest:1.0.0:tgz"
|
|
60
|
+
And I call the nexus "info com.test:mytest:1.0.0:tgz" command
|
|
61
|
+
Then the output should contain:
|
|
62
|
+
"""
|
|
63
|
+
The artifact you requested information for could not be found. Please ensure it exists inside the Nexus.
|
|
64
|
+
"""
|
|
65
|
+
And the exit status should be 101
|
|
66
|
+
|
|
67
|
+
Scenario: Get the current global settings of Nexus
|
|
68
|
+
When I call the nexus "get_global_settings" command
|
|
69
|
+
Then the output should contain:
|
|
70
|
+
"""
|
|
71
|
+
Your current Nexus global settings have been written to the file: global_settings.json
|
|
72
|
+
"""
|
|
73
|
+
And a file named "global_settings.json" should exist
|
|
74
|
+
And the exit status should be 0
|
|
75
|
+
|
|
76
|
+
Scenario: Update the global settings of Nexus
|
|
77
|
+
When I call the nexus "get_global_settings" command
|
|
78
|
+
And I edit the "global_settings.json" files "forceBaseUrl" field to true
|
|
79
|
+
And I call the nexus "upload_global_settings" command
|
|
80
|
+
Then the output should contain:
|
|
81
|
+
"""
|
|
82
|
+
Your global_settings.json file has been uploaded to Nexus
|
|
83
|
+
"""
|
|
84
|
+
When I call the nexus "get_global_settings" command
|
|
85
|
+
Then the file "global_settings.json" should contain:
|
|
86
|
+
"""
|
|
87
|
+
"forceBaseUrl": true
|
|
88
|
+
"""
|
|
89
|
+
And the exit status should be 0
|
|
90
|
+
|
|
91
|
+
Scenario: Reset the global settings of Nexus
|
|
92
|
+
When I call the nexus "reset_global_settings" command
|
|
93
|
+
Then the output should contain:
|
|
94
|
+
"""
|
|
95
|
+
Your Nexus global settings have been reset to their default values
|
|
96
|
+
"""
|
|
97
|
+
When I call the nexus "get_global_settings" command
|
|
98
|
+
Then the file "global_settings.json" should contain:
|
|
99
|
+
"""
|
|
100
|
+
"forceBaseUrl": false
|
|
101
|
+
"""
|
|
102
|
+
And the exit status should be 0
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
require 'aruba/api'
|
|
2
|
+
require 'json'
|
|
2
3
|
World(Aruba::Api)
|
|
3
4
|
|
|
4
5
|
When /^I call the nexus "(.*?)" command$/ do |command|
|
|
5
|
-
step "I run `nexus-cli #{command} --overrides=#{
|
|
6
|
+
step "I run `nexus-cli #{command} --overrides=#{get_overrides_string}`"
|
|
6
7
|
end
|
|
7
8
|
|
|
8
9
|
When /^I push an artifact with the GAV of "(.*)"$/ do |gav|
|
|
@@ -10,11 +11,11 @@ When /^I push an artifact with the GAV of "(.*)"$/ do |gav|
|
|
|
10
11
|
file = File.new(File.join(temp_dir, "#{artifactId}-#{version}.#{extension}"), 'w')
|
|
11
12
|
file.puts "some data"
|
|
12
13
|
file.close
|
|
13
|
-
step "I run `nexus-cli push #{gav} #{file.path}`"
|
|
14
|
+
step "I run `nexus-cli push #{gav} #{file.path} --overrides=#{get_overrides_string}`"
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
When /^I pull an artifact with the GAV of "(.*?)" to a temp directory$/ do |gav|
|
|
17
|
-
step "I run `nexus-cli pull #{gav} --destination #{temp_dir}`"
|
|
18
|
+
step "I run `nexus-cli pull #{gav} --destination #{temp_dir} --overrides=#{get_overrides_string}`"
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
Then /^I should have a copy of the "(.*?)" artifact in a temp directory$/ do |fileName|
|
|
@@ -23,4 +24,18 @@ end
|
|
|
23
24
|
|
|
24
25
|
When /^I delete an artifact with the GAV of "(.*)"$/ do |gav|
|
|
25
26
|
nexus_remote.delete_artifact(gav)
|
|
26
|
-
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
When /^I edit the "(.*?)" files "(.*?)" field to true$/ do |file, field|
|
|
30
|
+
Dir.chdir('tmp/aruba') do
|
|
31
|
+
json = JSON.parse(File.read(File.join(File.expand_path("."), file)))
|
|
32
|
+
File.open(File.join(File.expand_path("."), file), "w+") do |opened|
|
|
33
|
+
json["data"]["globalRestApiSettings"][field] = true
|
|
34
|
+
opened.write(JSON.pretty_generate(json))
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
Then /^the file "([^"]*)" should contain:$/ do |file, partial_content|
|
|
40
|
+
check_file_content(file, partial_content, true)
|
|
41
|
+
end
|
data/features/support/env.rb
CHANGED
|
@@ -3,8 +3,28 @@ $:.push "#{File.dirname(__FILE__)}/../../lib/"
|
|
|
3
3
|
require 'nexus_cli'
|
|
4
4
|
require 'rspec'
|
|
5
5
|
|
|
6
|
+
module ArubaOverrides
|
|
7
|
+
def detect_ruby(cmd)
|
|
8
|
+
processor, platform, *rest = RUBY_PLATFORM.split("-")
|
|
9
|
+
if platform =~ /w32$/ && cmd =~ /^nexus-cli /
|
|
10
|
+
"ruby -I../../lib -S ../../bin/#{cmd}"
|
|
11
|
+
else
|
|
12
|
+
"#{cmd}"
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
World(ArubaOverrides)
|
|
18
|
+
|
|
19
|
+
Before do
|
|
20
|
+
@aruba_timeout_seconds = 5
|
|
21
|
+
end
|
|
22
|
+
def get_overrides_string
|
|
23
|
+
@overrides_string ||= "url:http://localhost:8081/nexus repository:releases username:admin password:admin123"
|
|
24
|
+
end
|
|
25
|
+
|
|
6
26
|
def get_overrides
|
|
7
|
-
@overrides ||= {
|
|
27
|
+
@overrides ||= {'url' => 'http://localhost:8081/nexus', 'repository' => 'releases', 'username' => 'deployment', 'password' => 'deployment123'}
|
|
8
28
|
end
|
|
9
29
|
|
|
10
30
|
def temp_dir
|
data/lib/nexus_cli.rb
CHANGED
|
@@ -5,11 +5,16 @@ require 'nexus_cli/kernel'
|
|
|
5
5
|
require 'nexus_cli/nexus_remote_factory'
|
|
6
6
|
require 'nexus_cli/nexus_oss_remote'
|
|
7
7
|
require 'nexus_cli/nexus_pro_remote'
|
|
8
|
+
require 'nexus_cli/configuration'
|
|
8
9
|
|
|
9
10
|
module NexusCli
|
|
10
11
|
class << self
|
|
11
12
|
def root
|
|
12
13
|
@root ||= Pathname.new(File.expand_path('../', File.dirname(__FILE__)))
|
|
13
14
|
end
|
|
15
|
+
|
|
16
|
+
def ui
|
|
17
|
+
@ui ||= Thor::Shell::Color.new
|
|
18
|
+
end
|
|
14
19
|
end
|
|
15
20
|
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'extlib'
|
|
2
|
+
|
|
3
|
+
module NexusCli
|
|
4
|
+
module Configuration
|
|
5
|
+
class << self
|
|
6
|
+
def parse(overrides)
|
|
7
|
+
config_path = File.expand_path("~/.nexus_cli")
|
|
8
|
+
config = File.exists?(config_path) ? YAML::load_file(config_path) : Hash.new
|
|
9
|
+
if config.nil? && (overrides.nil? || overrides.empty?)
|
|
10
|
+
raise MissingSettingsFileException
|
|
11
|
+
end
|
|
12
|
+
overrides.each{|key, value| config[key] = value} unless overrides.nil? || overrides.empty?
|
|
13
|
+
validate_config(config)
|
|
14
|
+
config
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def validate_config(configuration)
|
|
18
|
+
["url", "repository", "username","password"].each do |key|
|
|
19
|
+
raise InvalidSettingsException.new(key) if configuration[key].blank?
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/nexus_cli/errors.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
1
3
|
module NexusCli
|
|
2
4
|
class NexusCliError < StandardError
|
|
3
5
|
class << self
|
|
@@ -90,4 +92,17 @@ This could mean several things:
|
|
|
90
92
|
end
|
|
91
93
|
status_code(110)
|
|
92
94
|
end
|
|
95
|
+
|
|
96
|
+
class BadSettingsException < NexusCliError
|
|
97
|
+
def initialize(body)
|
|
98
|
+
@server_response = JSON.pretty_generate(JSON.parse(body))
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def message
|
|
102
|
+
%{Your global_settings.json file is malformed and could not be uploaded to Nexus.
|
|
103
|
+
The output from the server was:
|
|
104
|
+
#{@server_response}}
|
|
105
|
+
end
|
|
106
|
+
status_code(111)
|
|
107
|
+
end
|
|
93
108
|
end
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
require 'restclient'
|
|
2
2
|
require 'nokogiri'
|
|
3
3
|
require 'yaml'
|
|
4
|
+
require 'json'
|
|
4
5
|
|
|
5
6
|
module NexusCli
|
|
6
7
|
class OSSRemote
|
|
7
8
|
|
|
8
9
|
def initialize(overrides)
|
|
9
|
-
@configuration =
|
|
10
|
+
@configuration = Configuration::parse(overrides)
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def configuration
|
|
@@ -14,7 +15,7 @@ module NexusCli
|
|
|
14
15
|
end
|
|
15
16
|
|
|
16
17
|
def nexus
|
|
17
|
-
@nexus ||= RestClient::Resource.new configuration["url"], :user => configuration["username"], :password => configuration["password"]
|
|
18
|
+
@nexus ||= RestClient::Resource.new configuration["url"], :user => configuration["username"], :password => configuration["password"], :timeout => 1000000, :open_timeout => 1000000
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def status
|
|
@@ -36,18 +37,21 @@ module NexusCli
|
|
|
36
37
|
rescue RestClient::ResourceNotFound
|
|
37
38
|
raise ArtifactNotFoundException
|
|
38
39
|
end
|
|
39
|
-
|
|
40
|
+
if version.casecmp("latest")
|
|
41
|
+
doc = Nokogiri::XML(get_artifact_info(artifact))
|
|
42
|
+
version = doc.xpath("//version").first.content()
|
|
43
|
+
end
|
|
40
44
|
destination = File.join(File.expand_path(destination || "."), "#{artifact_id}-#{version}.#{extension}")
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
File.expand_path(
|
|
45
|
+
artifact_file = File.open(destination, 'wb')
|
|
46
|
+
artifact_file.write(fileData)
|
|
47
|
+
artifact_file.close()
|
|
48
|
+
File.expand_path(artifact_file.path)
|
|
45
49
|
end
|
|
46
50
|
|
|
47
51
|
def push_artifact(artifact, file)
|
|
48
52
|
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
|
49
53
|
nexus['service/local/artifact/maven/content'].post({:hasPom => false, :g => group_id, :a => artifact_id, :v => version, :e => extension, :p => extension, :r => configuration['repository'],
|
|
50
|
-
|
|
54
|
+
:file => File.new(file)}) do |response|
|
|
51
55
|
case response.code
|
|
52
56
|
when 400
|
|
53
57
|
raise BadUploadRequestException
|
|
@@ -78,32 +82,58 @@ module NexusCli
|
|
|
78
82
|
end
|
|
79
83
|
end
|
|
80
84
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
end
|
|
87
|
-
return split_artifact
|
|
85
|
+
def search_for_artifacts(artifact)
|
|
86
|
+
group_id, artifact_id = artifact.split(":")
|
|
87
|
+
nexus['service/local/data_index'].get({:params => {:g => group_id, :a => artifact_id}}) do |response|
|
|
88
|
+
doc = Nokogiri::XML(response.body)
|
|
89
|
+
return format_search_results(doc, group_id, artifact_id)
|
|
88
90
|
end
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def get_global_settings
|
|
94
|
+
nexus['service/local/global_settings/current'].get({:accept => "application/json"}) do |response|
|
|
95
|
+
pretty_json = JSON.pretty_generate(JSON.parse(response.body))
|
|
96
|
+
destination = File.join(File.expand_path("."), "global_settings.json")
|
|
97
|
+
artifact_file = File.open(destination, 'wb') do |file|
|
|
98
|
+
file.write(pretty_json)
|
|
97
99
|
end
|
|
98
|
-
overrides.each{|key, value| config[key] = value} unless overrides.nil? || overrides.empty?
|
|
99
|
-
validate_config(config)
|
|
100
|
-
config
|
|
101
100
|
end
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def upload_global_settings
|
|
104
|
+
global_settings_file = File.join(File.expand_path("."), "global_settings.json")
|
|
105
|
+
nexus['service/local/global_settings/current'].put(File.read(global_settings_file), {:content_type => "application/json"}) do |response|
|
|
106
|
+
case response.code
|
|
107
|
+
when 400
|
|
108
|
+
raise BadSettingsException.new(response.body)
|
|
106
109
|
end
|
|
107
110
|
end
|
|
108
|
-
|
|
109
|
-
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def reset_global_settings
|
|
114
|
+
default_json = nexus['service/local/global_settings/default'].get({:accept => "application/json"})
|
|
115
|
+
nexus['service/local/global_settings/current'].put(default_json, {:content_type => "application/json"})
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
private
|
|
119
|
+
def format_search_results(doc, group_id, artifact_id)
|
|
120
|
+
versions = doc.xpath("//version").inject([]) {|array,node| array << "#{node.content()}"}
|
|
121
|
+
indent_size = versions.max{|a,b| a.length <=> b.length}.size+4
|
|
122
|
+
formated_results = ['Found Versions:']
|
|
123
|
+
versions.inject(formated_results) do |array,version|
|
|
124
|
+
temp_version = version + ":"
|
|
125
|
+
array << "#{temp_version.ljust(indent_size)} `nexus-cli pull #{group_id}:#{artifact_id}:#{version}:tgz`"
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def parse_artifact_string(artifact)
|
|
130
|
+
split_artifact = artifact.split(":")
|
|
131
|
+
if(split_artifact.size < 4)
|
|
132
|
+
raise ArtifactMalformedException
|
|
133
|
+
end
|
|
134
|
+
group_id, artifact_id, version, extension = split_artifact
|
|
135
|
+
version.upcase! if version.casecmp("latest")
|
|
136
|
+
return group_id, artifact_id, version, extension
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -21,7 +21,7 @@ module NexusCli
|
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
def update_artifact_custom_info(artifact, file
|
|
24
|
+
def update_artifact_custom_info(artifact, file)
|
|
25
25
|
# Check if artifact exists before posting custom metadata.
|
|
26
26
|
get_artifact_info(artifact)
|
|
27
27
|
# Update the custom metadata using the n3 file.
|
|
@@ -7,7 +7,7 @@ module NexusCli
|
|
|
7
7
|
class << self
|
|
8
8
|
|
|
9
9
|
def create(overrides)
|
|
10
|
-
@configuration =
|
|
10
|
+
@configuration = Configuration::parse(overrides)
|
|
11
11
|
running_nexus_pro? ? ProRemote.new(overrides) : OSSRemote.new(overrides)
|
|
12
12
|
end
|
|
13
13
|
|
|
@@ -35,25 +35,6 @@ module NexusCli
|
|
|
35
35
|
def running_nexus_pro?
|
|
36
36
|
return status['edition_long'] == "Professional" ? true : false
|
|
37
37
|
end
|
|
38
|
-
|
|
39
|
-
def parse_configuration(overrides)
|
|
40
|
-
begin
|
|
41
|
-
config = YAML::load_file(File.expand_path("~/.nexus_cli"))
|
|
42
|
-
rescue
|
|
43
|
-
end
|
|
44
|
-
if config.nil? && (overrides.nil? || overrides.empty?)
|
|
45
|
-
raise MissingSettingsFileException
|
|
46
|
-
end
|
|
47
|
-
overrides.each{|key, value| config[key] = value} unless overrides.nil? || overrides.empty?
|
|
48
|
-
validate_config(config)
|
|
49
|
-
config
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def validate_config(configuration)
|
|
53
|
-
["url", "repository", "username","password"].each do |key|
|
|
54
|
-
raise InvalidSettingsException.new(key) unless configuration.has_key?(key)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
38
|
end
|
|
58
39
|
end
|
|
59
40
|
end
|
data/lib/nexus_cli/tasks.rb
CHANGED
|
@@ -12,6 +12,7 @@ module NexusCli
|
|
|
12
12
|
map 'custom' => :get_artifact_custom_info
|
|
13
13
|
map 'config' => :get_nexus_configuration
|
|
14
14
|
map 'status' => :get_nexus_status
|
|
15
|
+
map 'search' => :search_for_artifacts
|
|
15
16
|
|
|
16
17
|
class_option :overrides,
|
|
17
18
|
:type => :hash,
|
|
@@ -34,112 +35,86 @@ module NexusCli
|
|
|
34
35
|
:desc => "A different folder other than the current working directory."
|
|
35
36
|
desc "pull_artifact artifact", "Pulls an artifact from Nexus and places it on your machine."
|
|
36
37
|
def pull_artifact(artifact)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
say "Artifact has been retrived and can be found at path: #{path_to_artifact}", :green
|
|
40
|
-
rescue NexusCliError => e
|
|
41
|
-
say e.message, :red
|
|
42
|
-
exit e.status_code
|
|
43
|
-
end
|
|
38
|
+
path_to_artifact = @nexus_remote.pull_artifact(artifact, options[:destination])
|
|
39
|
+
say "Artifact has been retrived and can be found at path: #{path_to_artifact}", :green
|
|
44
40
|
end
|
|
45
41
|
|
|
46
42
|
desc "push_artifact artifact file", "Pushes an artifact from your machine onto the Nexus."
|
|
47
43
|
def push_artifact(artifact, file)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
say "Artifact #{artifact} has been successfully pushed to Nexus.", :green
|
|
51
|
-
rescue NexusCliError => e
|
|
52
|
-
say e.message, :red
|
|
53
|
-
exit e.status_code
|
|
54
|
-
end
|
|
44
|
+
@nexus_remote.push_artifact(artifact, file)
|
|
45
|
+
say "Artifact #{artifact} has been successfully pushed to Nexus.", :green
|
|
55
46
|
end
|
|
56
47
|
|
|
57
48
|
desc "get_artifact_info artifact", "Gets and returns the metadata in XML format about a particular artifact."
|
|
58
49
|
def get_artifact_info(artifact)
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
50
|
+
say @nexus_remote.get_artifact_info(artifact), :green
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
desc "search_for_artifacts", "Prints out some information about some junk."
|
|
54
|
+
def search_for_artifacts(artifact)
|
|
55
|
+
@nexus_remote.search_for_artifacts(artifact).each{|output| say output, :green}
|
|
65
56
|
end
|
|
66
57
|
|
|
67
58
|
desc "get_artifact_custom_info artifact", "Gets and returns the custom metadata in XML format about a particular artifact."
|
|
68
59
|
def get_artifact_custom_info(artifact)
|
|
69
|
-
|
|
70
|
-
say @nexus_remote.get_artifact_custom_info(artifact), :green
|
|
71
|
-
rescue NexusCliError => e
|
|
72
|
-
say e.message, :red
|
|
73
|
-
exit e.status_code
|
|
74
|
-
end
|
|
60
|
+
say @nexus_remote.get_artifact_custom_info(artifact), :green
|
|
75
61
|
end
|
|
76
62
|
|
|
77
63
|
desc "get_artifact_custom_info_n3 artifact", "Gets and returns the custom metadata in Nexus n3 format about a particular artifact."
|
|
78
|
-
def get_artifact_custom_info_n3(artifact)
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
say @nexus_remote.get_artifact_custom_info_n3(artifact), :green
|
|
82
|
-
rescue NexusCliError => e
|
|
83
|
-
say e.message, :red
|
|
84
|
-
exit e.status_code
|
|
85
|
-
end
|
|
64
|
+
def get_artifact_custom_info_n3(artifact)
|
|
65
|
+
raise NotNexusProException unless @nexus_remote.kind_of? ProRemote
|
|
66
|
+
say @nexus_remote.get_artifact_custom_info_n3(artifact), :green
|
|
86
67
|
end
|
|
87
68
|
|
|
88
|
-
method_option :insecure,
|
|
89
|
-
:type => :boolean,
|
|
90
|
-
:default => false,
|
|
91
|
-
:desc => "Overrides any failures because of an 'insecure' SSL connection."
|
|
92
69
|
desc "update_artifact_custom_info artifact file", "Updates the artifact custom metadata by pushing the Nexus custom artifact file (n3) from your machine onto the Nexus."
|
|
93
70
|
def update_artifact_custom_info(artifact, file)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
say "Custom metadata for artifact #{artifact} has been successfully pushed to Nexus.", :green
|
|
98
|
-
rescue NexusCliError => e
|
|
99
|
-
say e.message, :red
|
|
100
|
-
exit e.status_code
|
|
101
|
-
end
|
|
71
|
+
raise NotNexusProException unless @nexus_remote.kind_of? ProRemote
|
|
72
|
+
@nexus_remote.update_artifact_custom_info(artifact, file)
|
|
73
|
+
say "Custom metadata for artifact #{artifact} has been successfully pushed to Nexus.", :green
|
|
102
74
|
end
|
|
103
75
|
|
|
104
76
|
desc "search_artifacts key type value", "Searches for artifacts using artifact metadata and returns the result as a list with items in XML format."
|
|
105
77
|
def search_artifacts(key, type, value)
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
say @nexus_remote.search_artifacts(key, type, value), :green
|
|
109
|
-
rescue NexusCliError => e
|
|
110
|
-
say e.message, :red
|
|
111
|
-
exit e.status_code
|
|
112
|
-
end
|
|
78
|
+
raise NotNexusProException unless @nexus_remote.kind_of? ProRemote
|
|
79
|
+
say @nexus_remote.search_artifacts(key, type, value), :green
|
|
113
80
|
end
|
|
114
81
|
|
|
115
82
|
desc "get_nexus_configuration", "Prints out configuration from the .nexus_cli file that helps inform where artifacts will be uploaded."
|
|
116
83
|
def get_nexus_configuration
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
say "Nexus Repository: #{config['repository']}", :blue
|
|
122
|
-
rescue NexusCliError => e
|
|
123
|
-
say e.message, :red
|
|
124
|
-
exit e.status_code
|
|
125
|
-
end
|
|
84
|
+
config = @nexus_remote.configuration
|
|
85
|
+
say "********* Reading CLI configuration from #{File.expand_path('~/.nexus_cli')} *********", :blue
|
|
86
|
+
say "Nexus URL: #{config['url']}", :blue
|
|
87
|
+
say "Nexus Repository: #{config['repository']}", :blue
|
|
126
88
|
end
|
|
127
89
|
|
|
128
90
|
desc "get_nexus_status", "Prints out information about the Nexus instance."
|
|
129
91
|
def get_nexus_status
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
92
|
+
data = @nexus_remote.status
|
|
93
|
+
say "********* Getting Nexus status from #{data['base_url']} *********", :blue
|
|
94
|
+
say "Application Name: #{data['app_name']}", :blue
|
|
95
|
+
say "Version: #{data['version']}", :blue
|
|
96
|
+
say "Edition: #{data['edition_long']}", :blue
|
|
97
|
+
say "State: #{data['state']}", :blue
|
|
98
|
+
say "Started At: #{data['started_at']}", :blue
|
|
99
|
+
say "Base URL: #{data['base_url']}", :blue
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
desc "get_global_settings", "Prints out your Nexus' current setttings and saves them to a file."
|
|
103
|
+
def get_global_settings
|
|
104
|
+
@nexus_remote.get_global_settings
|
|
105
|
+
say "Your current Nexus global settings have been written to the file: global_settings.json", :blue
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
desc "upload_global_settings", "Uploads a global_settings.json file to your Nexus to update its settings."
|
|
109
|
+
def upload_global_settings
|
|
110
|
+
@nexus_remote.upload_global_settings
|
|
111
|
+
say "Your global_settings.json file has been uploaded to Nexus", :blue
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
desc "reset_global_settings", "Resets your Nexus global_settings to their out-of-the-box defaults."
|
|
115
|
+
def reset_global_settings
|
|
116
|
+
@nexus_remote.reset_global_settings
|
|
117
|
+
say "Your Nexus global settings have been reset to their default values", :blue
|
|
143
118
|
end
|
|
144
119
|
end
|
|
145
120
|
end
|
data/nexus_cli.gemspec
CHANGED
|
@@ -19,6 +19,8 @@ Gem::Specification.new do |s|
|
|
|
19
19
|
s.add_dependency 'thor'
|
|
20
20
|
s.add_dependency 'rest-client'
|
|
21
21
|
s.add_dependency 'nokogiri'
|
|
22
|
+
s.add_dependency 'extlib'
|
|
23
|
+
s.add_dependency 'json'
|
|
22
24
|
|
|
23
25
|
s.add_development_dependency 'rspec'
|
|
24
26
|
s.add_development_dependency 'aruba'
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'nexus_cli'
|
|
2
|
+
|
|
3
|
+
describe NexusCli do
|
|
4
|
+
it "gives you errors when configuration has a blank password" do
|
|
5
|
+
overrides = {"url" => "http://somewebsite.com", "username" => "admin", "password" => ""}
|
|
6
|
+
expect {NexusCli::Configuration.parse(overrides)}.to raise_error(NexusCli::InvalidSettingsException)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
it "gives you errors when configuration has a blank username" do
|
|
10
|
+
overrides = {"url" => "http://somewebsite.com", "username" => "", "password" => "admin"}
|
|
11
|
+
expect {NexusCli::Configuration.parse(overrides)}.to raise_error(NexusCli::InvalidSettingsException)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "gives you errors when configuration has a blank url" do
|
|
15
|
+
overrides = {"url" => "", "username" => "admin", "password" => "admin"}
|
|
16
|
+
expect {NexusCli::Configuration.parse(overrides)}.to raise_error(NexusCli::InvalidSettingsException)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "gives you errors when configuration has a blank repository" do
|
|
20
|
+
overrides = {"url" => "http://somewebsite.com", "repository" => ""}
|
|
21
|
+
expect {NexusCli::Configuration.parse(overrides)}.to raise_error(NexusCli::InvalidSettingsException)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'nexus_cli'
|
|
2
|
+
|
|
3
|
+
remote = NexusCli::OSSRemote.new(nil)
|
|
4
|
+
|
|
5
|
+
describe NexusCli do
|
|
6
|
+
it "gives you errors when you attempt to pull an artifact don't give a valid artifact name" do
|
|
7
|
+
expect {remote.pull_artifact "com.something:something:1.0.0", nil}.to raise_error(NexusCli::ArtifactMalformedException)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
it "gives you errors when you attempt to get an artifact's info and don't give a valid artifact name" do
|
|
11
|
+
expect {remote.get_artifact_info "com.something:something:1.0.0"}.to raise_error(NexusCli::ArtifactMalformedException)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "gives you errors when you attempt to pull an artifact and it cannot be found" do
|
|
15
|
+
RestClient::Resource.any_instance.stub(:get).and_raise(RestClient::ResourceNotFound)
|
|
16
|
+
expect {remote.pull_artifact "com.something:something:1.0.0:tgz", nil}.to raise_error(NexusCli::ArtifactNotFoundException)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "gives you errors when you attempt to get an artifact's info and it cannot be found" do
|
|
20
|
+
RestClient::Resource.any_instance.stub(:get).and_raise(RestClient::ResourceNotFound)
|
|
21
|
+
expect {remote.get_artifact_info "com.something:something:1.0.0:tgz"}.to raise_error(NexusCli::ArtifactNotFoundException)
|
|
22
|
+
end
|
|
23
|
+
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nexus_cli
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2012-
|
|
12
|
+
date: 2012-08-10 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: thor
|
|
@@ -59,6 +59,38 @@ dependencies:
|
|
|
59
59
|
- - ! '>='
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
61
|
version: '0'
|
|
62
|
+
- !ruby/object:Gem::Dependency
|
|
63
|
+
name: extlib
|
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
|
65
|
+
none: false
|
|
66
|
+
requirements:
|
|
67
|
+
- - ! '>='
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: '0'
|
|
70
|
+
type: :runtime
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
none: false
|
|
74
|
+
requirements:
|
|
75
|
+
- - ! '>='
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: '0'
|
|
78
|
+
- !ruby/object:Gem::Dependency
|
|
79
|
+
name: json
|
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
|
81
|
+
none: false
|
|
82
|
+
requirements:
|
|
83
|
+
- - ! '>='
|
|
84
|
+
- !ruby/object:Gem::Version
|
|
85
|
+
version: '0'
|
|
86
|
+
type: :runtime
|
|
87
|
+
prerelease: false
|
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
89
|
+
none: false
|
|
90
|
+
requirements:
|
|
91
|
+
- - ! '>='
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '0'
|
|
62
94
|
- !ruby/object:Gem::Dependency
|
|
63
95
|
name: rspec
|
|
64
96
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -138,11 +170,12 @@ files:
|
|
|
138
170
|
- Rakefile
|
|
139
171
|
- VERSION
|
|
140
172
|
- bin/nexus-cli
|
|
141
|
-
- features/
|
|
173
|
+
- features/nexus_oss.feature
|
|
142
174
|
- features/step_definitions/cli_steps.rb
|
|
143
175
|
- features/support/env.rb
|
|
144
176
|
- lib/nexus_cli.rb
|
|
145
177
|
- lib/nexus_cli/cli.rb
|
|
178
|
+
- lib/nexus_cli/configuration.rb
|
|
146
179
|
- lib/nexus_cli/errors.rb
|
|
147
180
|
- lib/nexus_cli/kernel.rb
|
|
148
181
|
- lib/nexus_cli/nexus_oss_remote.rb
|
|
@@ -151,7 +184,8 @@ files:
|
|
|
151
184
|
- lib/nexus_cli/tasks.rb
|
|
152
185
|
- lib/nexus_cli/version.rb
|
|
153
186
|
- nexus_cli.gemspec
|
|
154
|
-
- spec/
|
|
187
|
+
- spec/configuration_spec.rb
|
|
188
|
+
- spec/oss_remote_spec.rb
|
|
155
189
|
homepage: https://github.com/RiotGames/nexus_cli
|
|
156
190
|
licenses: []
|
|
157
191
|
post_install_message:
|
|
@@ -166,7 +200,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
166
200
|
version: '0'
|
|
167
201
|
segments:
|
|
168
202
|
- 0
|
|
169
|
-
hash:
|
|
203
|
+
hash: -589331205850929008
|
|
170
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
205
|
none: false
|
|
172
206
|
requirements:
|
|
@@ -175,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
175
209
|
version: '0'
|
|
176
210
|
segments:
|
|
177
211
|
- 0
|
|
178
|
-
hash:
|
|
212
|
+
hash: -589331205850929008
|
|
179
213
|
requirements: []
|
|
180
214
|
rubyforge_project:
|
|
181
215
|
rubygems_version: 1.8.21
|
|
@@ -183,7 +217,8 @@ signing_key:
|
|
|
183
217
|
specification_version: 3
|
|
184
218
|
summary: A command-line wrapper for making REST calls to Sonatype Nexus.
|
|
185
219
|
test_files:
|
|
186
|
-
- features/
|
|
220
|
+
- features/nexus_oss.feature
|
|
187
221
|
- features/step_definitions/cli_steps.rb
|
|
188
222
|
- features/support/env.rb
|
|
189
|
-
- spec/
|
|
223
|
+
- spec/configuration_spec.rb
|
|
224
|
+
- spec/oss_remote_spec.rb
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
Feature: Use the Nexus CLI
|
|
2
|
-
As a CLI user
|
|
3
|
-
I need commands to get Nexus status, push, pull
|
|
4
|
-
|
|
5
|
-
Scenario: Get Nexus Status
|
|
6
|
-
When I call the nexus "status" command
|
|
7
|
-
Then the output should contain:
|
|
8
|
-
"""
|
|
9
|
-
Application Name: Sonatype Nexus
|
|
10
|
-
Version: 2.0.5
|
|
11
|
-
"""
|
|
12
|
-
And the exit status should be 0
|
|
13
|
-
|
|
14
|
-
Scenario: Push an Artifact
|
|
15
|
-
When I push an artifact with the GAV of "com.test:mytest:1.0.0:tgz"
|
|
16
|
-
Then the output should contain:
|
|
17
|
-
"""
|
|
18
|
-
Artifact com.test:mytest:1.0.0:tgz has been successfully pushed to Nexus.
|
|
19
|
-
"""
|
|
20
|
-
And the exit status should be 0
|
|
21
|
-
|
|
22
|
-
Scenario: Pull an artifact
|
|
23
|
-
When I call the nexus "pull com.test:mytest:1.0.0:tgz" command
|
|
24
|
-
Then the output should contain:
|
|
25
|
-
"""
|
|
26
|
-
Artifact has been retrived and can be found at path:
|
|
27
|
-
"""
|
|
28
|
-
And the exit status should be 0
|
|
29
|
-
|
|
30
|
-
Scenario: Pull an artifact to a specific place
|
|
31
|
-
When I pull an artifact with the GAV of "com.test:mytest:1.0.0:tgz" to a temp directory
|
|
32
|
-
Then I should have a copy of the "mytest-1.0.0.tgz" artifact in a temp directory
|
|
33
|
-
|
|
34
|
-
Scenario: Get an artifact's info
|
|
35
|
-
When I call the nexus "info com.test:mytest:1.0.0:tgz" command
|
|
36
|
-
Then the output should contain:
|
|
37
|
-
"""
|
|
38
|
-
<groupId>com.test</groupId>
|
|
39
|
-
"""
|
|
40
|
-
And the exit status should be 0
|
|
41
|
-
|
|
42
|
-
Scenario: Attempt to delete an artifact
|
|
43
|
-
When I delete an artifact with the GAV of "com.test:mytest:1.0.0:tgz"
|
|
44
|
-
And I call the nexus "info com.test:mytest:1.0.0:tgz" command
|
|
45
|
-
Then the output should contain:
|
|
46
|
-
"""
|
|
47
|
-
The artifact you requested information for could not be found. Please ensure it exists inside the Nexus.
|
|
48
|
-
"""
|
|
49
|
-
And the exit status should be 101
|
data/spec/remote_spec.rb
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
require 'nexus_cli'
|
|
2
|
-
require 'restclient'
|
|
3
|
-
|
|
4
|
-
describe NexusCli do
|
|
5
|
-
it "gives you errors when configuration is missing a password" do
|
|
6
|
-
expect {NexusCli::Remote.configuration = {url: "http://somewebsite.com", username: "admin"}}.to raise_error(NexusCli::InvalidSettingsException)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
it "gives you errors when configuration is missing a username" do
|
|
10
|
-
expect {NexusCli::Remote.configuration = {url: "http://somewebsite.com", password: "admin"}}.to raise_error(NexusCli::InvalidSettingsException)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
it "gives you errors when you attempt to pull an artifact don't give a valid artifact name" do
|
|
14
|
-
expect {NexusCli::Remote.pull_artifact "com.something:something:1.0.0", nil}.to raise_error(NexusCli::ArtifactMalformedException)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
it "gives you errors when you attempt to push an artifact don't give a valid artifact name" do
|
|
18
|
-
expect {NexusCli::Remote.push_artifact "com.something:something:1.0.0", nil}.to raise_error(NexusCli::ArtifactMalformedException)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
it "gives you errors when you attempt to get an artifact's info and don't give a valid artifact name" do
|
|
22
|
-
expect {NexusCli::Remote.get_artifact_info "com.something:something:1.0.0"}.to raise_error(NexusCli::ArtifactMalformedException)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
it "gives you errors when you attempt to delete an artifact and don't give a valid artifact name" do
|
|
26
|
-
expect {NexusCli::Remote.get_artifact_info "com.something:something:1.0.0"}.to raise_error(NexusCli::ArtifactMalformedException)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "gives you errors when you attempt to pull an artifact and it cannot be found" do
|
|
30
|
-
RestClient::Resource.any_instance.stub(:get).and_raise(RestClient::ResourceNotFound)
|
|
31
|
-
expect {NexusCli::Remote.pull_artifact "com.something:something:1.0.0:tgz", nil}.to raise_error(NexusCli::ArtifactNotFoundException)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "gives you errors when you attempt to get an artifact's info and it cannot be found" do
|
|
35
|
-
RestClient::Resource.any_instance.stub(:get).and_raise(RestClient::ResourceNotFound)
|
|
36
|
-
expect {NexusCli::Remote.get_artifact_info "com.something:something:1.0.0:tgz"}.to raise_error(NexusCli::ArtifactNotFoundException)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
it "gives you errors when you attempt to get an artifact's custom info and it cannot be found" do
|
|
40
|
-
RestClient::Resource.any_instance.stub(:get).and_raise(RestClient::ResourceNotFound)
|
|
41
|
-
expect {NexusCli::Remote.get_artifact_custom_info "com.something:something:1.0.0:tgz"}.to raise_error(NexusCli::ArtifactNotFoundException)
|
|
42
|
-
end
|
|
43
|
-
end
|