nexus_cli 0.8.4 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/features/nexus_oss.feature +20 -0
- data/features/step_definitions/cli_steps.rb +10 -0
- data/features/support/env.rb +15 -1
- data/lib/nexus_cli/configuration.rb +1 -0
- data/lib/nexus_cli/errors.rb +11 -0
- data/lib/nexus_cli/nexus_oss_remote.rb +34 -13
- data/lib/nexus_cli/nexus_pro_remote.rb +34 -17
- data/lib/nexus_cli/tasks.rb +73 -66
- data/pro/nexus_custom_metadata.feature +21 -2
- metadata +4 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.9.0
|
data/features/nexus_oss.feature
CHANGED
@@ -55,6 +55,15 @@ Feature: Use the Nexus CLI
|
|
55
55
|
"""
|
56
56
|
And the exit status should be 0
|
57
57
|
|
58
|
+
@transfer
|
59
|
+
Scenario: Transfer an artifact between repositories
|
60
|
+
When I call the nexus "transfer com.test:mytest:1.0.0:tgz releases thirdparty" command
|
61
|
+
Then the output should contain:
|
62
|
+
"""
|
63
|
+
The artifact com.test:mytest:1.0.0:tgz has been transferred from releases to thirdparty.
|
64
|
+
"""
|
65
|
+
And the exit status should be 0
|
66
|
+
|
58
67
|
@delete
|
59
68
|
Scenario: Attempt to delete an artifact
|
60
69
|
When I delete an artifact with the GAV of "com.test:mytest:1.0.0:tgz"
|
@@ -65,6 +74,17 @@ Feature: Use the Nexus CLI
|
|
65
74
|
"""
|
66
75
|
And the exit status should be 101
|
67
76
|
|
77
|
+
@delete
|
78
|
+
Scenario: Attempt to delete another artifact
|
79
|
+
When I delete an artifact with the GAV of "com.test:mytest:1.0.0:tgz" from the "thirdparty" repository
|
80
|
+
And I call the nexus "info com.test:mytest:1.0.0:tgz" command overriding "repository:thirdparty"
|
81
|
+
Then the output should contain:
|
82
|
+
"""
|
83
|
+
The artifact you requested information for could not be found. Please ensure it exists inside the Nexus.
|
84
|
+
"""
|
85
|
+
And the exit status should be 101
|
86
|
+
|
87
|
+
|
68
88
|
Scenario: Get the current global settings of Nexus
|
69
89
|
When I call the nexus "get_global_settings" command
|
70
90
|
Then the output should contain:
|
@@ -7,6 +7,11 @@ When /^I call the nexus "(.*?)" command$/ do |command|
|
|
7
7
|
step "I run `nexus-cli #{command} --overrides=#{get_overrides_string}`"
|
8
8
|
end
|
9
9
|
|
10
|
+
When /^I call the nexus "(.*?)" command overriding "(.*?)"$/ do |command, overrides|
|
11
|
+
|
12
|
+
step "I run `nexus-cli #{command} --overrides=#{create_step_overrides(overrides)}`"
|
13
|
+
end
|
14
|
+
|
10
15
|
When /^I call the nexus "(.*?)" command as the "(.*?)" user with password "(.*?)"$/ do |command, username, password|
|
11
16
|
overrides = get_overrides_string.gsub('username:admin', "username:#{username}")
|
12
17
|
overrides.gsub!('password:admin123', "password:#{password}")
|
@@ -33,6 +38,11 @@ When /^I delete an artifact with the GAV of "(.*)"$/ do |gav|
|
|
33
38
|
nexus_remote.delete_artifact(gav)
|
34
39
|
end
|
35
40
|
|
41
|
+
When /^I delete an artifact with the GAV of "(.*?)" from the "(.*?)" repository$/ do |gav, repository|
|
42
|
+
nexus_remote.configuration["repository"] = repository
|
43
|
+
nexus_remote.delete_artifact(gav)
|
44
|
+
end
|
45
|
+
|
36
46
|
When /^I edit the "(.*?)" files "(.*?)" field to true$/ do |file, field|
|
37
47
|
Dir.chdir('tmp/aruba') do
|
38
48
|
json = JSON.parse(File.read(File.join(File.expand_path("~/.nexus"), file)))
|
data/features/support/env.rb
CHANGED
@@ -28,6 +28,20 @@ def get_overrides
|
|
28
28
|
@overrides ||= {'url' => 'http://localhost:8081/nexus', 'repository' => 'releases', 'username' => 'admin', 'password' => 'admin123'}
|
29
29
|
end
|
30
30
|
|
31
|
+
def create_step_overrides(overrides)
|
32
|
+
overrides_hash = overrides.split(" ").inject({}) do |overrides_hash, override|
|
33
|
+
key, value = override.split(":")
|
34
|
+
overrides_hash[key] = value
|
35
|
+
overrides_hash
|
36
|
+
end
|
37
|
+
|
38
|
+
step_overrides = get_overrides.merge(overrides_hash)
|
39
|
+
step_overrides.to_a.inject("") do |overrides_string, pair|
|
40
|
+
overrides_string << pair.join(":")
|
41
|
+
overrides_string << " "
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
31
45
|
def temp_dir
|
32
46
|
@tmpdir ||= Dir.mktmpdir
|
33
47
|
end
|
@@ -38,4 +52,4 @@ end
|
|
38
52
|
|
39
53
|
at_exit do
|
40
54
|
FileUtils.rm_rf(temp_dir)
|
41
|
-
end
|
55
|
+
end
|
data/lib/nexus_cli/errors.rb
CHANGED
@@ -244,5 +244,16 @@ The output from the server was:
|
|
244
244
|
end
|
245
245
|
status_code(127)
|
246
246
|
end
|
247
|
+
|
248
|
+
class NexusHTTP404 < NexusCliError
|
249
|
+
def initialize(body)
|
250
|
+
@server_response = body
|
251
|
+
end
|
247
252
|
|
253
|
+
def message
|
254
|
+
%{Your command failed and the server returned an error code. The output of the response was:
|
255
|
+
#{@server_response}}
|
256
|
+
end
|
257
|
+
status_code(128)
|
258
|
+
end
|
248
259
|
end
|
@@ -56,7 +56,7 @@ module NexusCli
|
|
56
56
|
status['edition_long'] == "Professional"
|
57
57
|
end
|
58
58
|
|
59
|
-
def pull_artifact(artifact, destination)
|
59
|
+
def pull_artifact(artifact, destination=nil)
|
60
60
|
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
61
61
|
version = Nokogiri::XML(get_artifact_info(artifact)).xpath("//version").first.content() if version.casecmp("latest")
|
62
62
|
destination = File.join(File.expand_path(destination || "."), "#{artifact_id}-#{version}.#{extension}")
|
@@ -90,7 +90,7 @@ module NexusCli
|
|
90
90
|
when 403
|
91
91
|
raise PermissionsException
|
92
92
|
when 404
|
93
|
-
raise
|
93
|
+
raise NexusHTTP404.new(response.content)
|
94
94
|
else
|
95
95
|
raise UnexpectedStatusCodeException.new(response.status)
|
96
96
|
end
|
@@ -206,7 +206,7 @@ module NexusCli
|
|
206
206
|
end
|
207
207
|
|
208
208
|
def delete_repository(name)
|
209
|
-
response = nexus.delete(nexus_url("service/local/repositories/#{name
|
209
|
+
response = nexus.delete(nexus_url("service/local/repositories/#{sanitize_for_id(name)}"))
|
210
210
|
case response.status
|
211
211
|
when 204
|
212
212
|
return true
|
@@ -218,7 +218,7 @@ module NexusCli
|
|
218
218
|
end
|
219
219
|
|
220
220
|
def get_repository_info(name)
|
221
|
-
response = nexus.get(nexus_url("service/local/repositories/#{name
|
221
|
+
response = nexus.get(nexus_url("service/local/repositories/#{sanitize_for_id(name)}"))
|
222
222
|
case response.status
|
223
223
|
when 200
|
224
224
|
return response.content
|
@@ -343,7 +343,7 @@ module NexusCli
|
|
343
343
|
end
|
344
344
|
|
345
345
|
def get_group_repository(group_id)
|
346
|
-
response = nexus.get(nexus_url("service/local/repo_groups/#{group_id
|
346
|
+
response = nexus.get(nexus_url("service/local/repo_groups/#{sanitize_for_id(group_id)}"), :header => DEFAULT_ACCEPT_HEADER)
|
347
347
|
case response.status
|
348
348
|
when 200
|
349
349
|
return response.content
|
@@ -358,12 +358,12 @@ module NexusCli
|
|
358
358
|
group_repository = JSON.parse(get_group_repository(group_id))
|
359
359
|
repositories_in_group = group_repository["data"]["repositories"]
|
360
360
|
|
361
|
-
repositories_in_group.find{|repository| repository["id"] == repository_to_check}
|
361
|
+
repositories_in_group.find{|repository| repository["id"] == sanitize_for_id(repository_to_check)}
|
362
362
|
end
|
363
363
|
|
364
364
|
def add_to_group_repository(group_id, repository_to_add_id)
|
365
365
|
raise RepositoryInGroupException if repository_in_group?(group_id, repository_to_add_id)
|
366
|
-
response = nexus.put(nexus_url("service/local/repo_groups/#{group_id
|
366
|
+
response = nexus.put(nexus_url("service/local/repo_groups/#{sanitize_for_id(group_id)}"), :body => create_add_to_group_repository_json(group_id, repository_to_add_id), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
367
367
|
case response.status
|
368
368
|
when 200
|
369
369
|
return true
|
@@ -376,7 +376,7 @@ module NexusCli
|
|
376
376
|
|
377
377
|
def remove_from_group_repository(group_id, repository_to_remove_id)
|
378
378
|
raise RepositoryNotInGroupException unless repository_in_group?(group_id, repository_to_remove_id)
|
379
|
-
response = nexus.put(nexus_url("service/local/repo_groups/#{group_id
|
379
|
+
response = nexus.put(nexus_url("service/local/repo_groups/#{sanitize_for_id(group_id)}"), :body => create_remove_from_group_repository_json(group_id, repository_to_remove_id), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
380
380
|
case response.status
|
381
381
|
when 200
|
382
382
|
return true
|
@@ -386,7 +386,7 @@ module NexusCli
|
|
386
386
|
end
|
387
387
|
|
388
388
|
def delete_group_repository(group_id)
|
389
|
-
response = nexus.delete(nexus_url("service/local/repo_groups/#{group_id
|
389
|
+
response = nexus.delete(nexus_url("service/local/repo_groups/#{sanitize_for_id(group_id)}"))
|
390
390
|
case response.status
|
391
391
|
when 204
|
392
392
|
return true
|
@@ -397,8 +397,25 @@ module NexusCli
|
|
397
397
|
end
|
398
398
|
end
|
399
399
|
|
400
|
+
def transfer_artifact(artifact, from_repository, to_repository)
|
401
|
+
do_transfer_artifact(artifact, from_repository, to_repository)
|
402
|
+
end
|
403
|
+
|
400
404
|
private
|
401
405
|
|
406
|
+
def sanitize_for_id(unsanitized_string)
|
407
|
+
unsanitized_string.gsub(" ", "_").downcase
|
408
|
+
end
|
409
|
+
|
410
|
+
def do_transfer_artifact(artifact, from_repository, to_repository)
|
411
|
+
Dir.mktmpdir do |temp_dir|
|
412
|
+
configuration["repository"] = sanitize_for_id(from_repository)
|
413
|
+
artifact_file = pull_artifact(artifact, temp_dir)
|
414
|
+
configuration["repository"] = sanitize_for_id(to_repository)
|
415
|
+
push_artifact(artifact, artifact_file)
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
402
419
|
def format_search_results(doc, group_id, artifact_id)
|
403
420
|
versions = doc.xpath("//version").inject([]) {|array,node| array << "#{node.content()}"}
|
404
421
|
indent_size = versions.max{|a,b| a.length <=> b.length}.size+4
|
@@ -423,10 +440,12 @@ module NexusCli
|
|
423
440
|
params = {:provider => "maven2"}
|
424
441
|
params[:providerRole] = "org.sonatype.nexus.proxy.repository.Repository"
|
425
442
|
params[:exposed] = true
|
443
|
+
params[:browseable] = true
|
444
|
+
params[:indexable] = true
|
426
445
|
params[:repoType] = "hosted"
|
427
446
|
params[:repoPolicy] = "RELEASE"
|
428
447
|
params[:name] = name
|
429
|
-
params[:id] = name
|
448
|
+
params[:id] = sanitize_for_id(name)
|
430
449
|
params[:format] = "maven2"
|
431
450
|
JSON.dump(:data => params)
|
432
451
|
end
|
@@ -435,6 +454,8 @@ module NexusCli
|
|
435
454
|
params = {:provider => "maven2"}
|
436
455
|
params[:providerRole] = "org.sonatype.nexus.proxy.repository.Repository"
|
437
456
|
params[:exposed] = true
|
457
|
+
params[:browseable] = true
|
458
|
+
params[:indexable] = true
|
438
459
|
params[:repoType] = "proxy"
|
439
460
|
params[:repoPolicy] = "RELEASE"
|
440
461
|
params[:checksumPolicy] = "WARN"
|
@@ -442,7 +463,7 @@ module NexusCli
|
|
442
463
|
params[:downloadRemoteIndexes] = true
|
443
464
|
params[:autoBlockActive] = true
|
444
465
|
params[:name] = name
|
445
|
-
params[:id] = name
|
466
|
+
params[:id] = sanitize_for_id(name)
|
446
467
|
params[:remoteStorage] = {:remoteStorageUrl => url.nil? ? "http://change-me.com/" : url}
|
447
468
|
JSON.dump(:data => params)
|
448
469
|
end
|
@@ -461,7 +482,7 @@ module NexusCli
|
|
461
482
|
end
|
462
483
|
|
463
484
|
def create_group_repository_json(name)
|
464
|
-
params = {:id => name
|
485
|
+
params = {:id => sanitize_for_id(name)}
|
465
486
|
params[:name] = name
|
466
487
|
params[:provider] = "maven2"
|
467
488
|
params[:exposed] = true
|
@@ -471,7 +492,7 @@ module NexusCli
|
|
471
492
|
def create_add_to_group_repository_json(group_id, repository_to_add_id)
|
472
493
|
group_repository_json = JSON.parse(get_group_repository(group_id))
|
473
494
|
repositories = group_repository_json["data"]["repositories"]
|
474
|
-
repositories << {:id => repository_to_add_id}
|
495
|
+
repositories << {:id => sanitize_for_id(repository_to_add_id)}
|
475
496
|
params = {:repositories => repositories}
|
476
497
|
params[:id] = group_repository_json["data"]["id"]
|
477
498
|
params[:name] = group_repository_json["data"]["name"]
|
@@ -38,24 +38,9 @@ module NexusCli
|
|
38
38
|
# @result [Integer] The resulting exit code of the operation
|
39
39
|
def update_artifact_custom_info(artifact, *params)
|
40
40
|
target_n3 = parse_custom_metadata_update_params(*params)
|
41
|
+
nexus_n3 = get_custom_metadata_hash(artifact)
|
41
42
|
|
42
|
-
|
43
|
-
# Read in nexus n3 file. If this is a newly-added artifact, there will be no n3 file so escape the exception.
|
44
|
-
begin
|
45
|
-
nexus_n3 = N3Metadata::convert_result_to_hash(get_artifact_custom_info_raw(artifact))
|
46
|
-
rescue N3NotFoundException
|
47
|
-
nexus_n3 = {}
|
48
|
-
end
|
49
|
-
|
50
|
-
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
51
|
-
encoded_string = N3Metadata::create_base64_subject(group_id, artifact_id, version, extension)
|
52
|
-
response = nexus.post(nexus_url("service/local/index/custom_metadata/#{configuration['repository']}/#{encoded_string}"), :body => create_custom_metadata_update_json(nexus_n3, target_n3), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
53
|
-
case response.code
|
54
|
-
when 201
|
55
|
-
return true
|
56
|
-
else
|
57
|
-
raise UnexpectedStatusCodeException.new(response.status)
|
58
|
-
end
|
43
|
+
do_update_custom_metadata(artifact, nexus_n3, target_n3)
|
59
44
|
end
|
60
45
|
|
61
46
|
# Clears all custom metadata from an artifact
|
@@ -264,8 +249,40 @@ module NexusCli
|
|
264
249
|
end
|
265
250
|
end
|
266
251
|
|
252
|
+
def transfer_artifact(artifact, from_repository, to_repository)
|
253
|
+
do_transfer_artifact(artifact, from_repository, to_repository)
|
254
|
+
|
255
|
+
configuration["repository"] = from_repository
|
256
|
+
from_artifact_metadata = get_custom_metadata_hash(artifact)
|
257
|
+
|
258
|
+
configuration["repository"] = to_repository
|
259
|
+
to_artifact_metadata = get_custom_metadata_hash(artifact)
|
260
|
+
|
261
|
+
do_update_custom_metadata(artifact, from_artifact_metadata, to_artifact_metadata)
|
262
|
+
end
|
263
|
+
|
267
264
|
private
|
268
265
|
|
266
|
+
def get_custom_metadata_hash(artifact)
|
267
|
+
begin
|
268
|
+
N3Metadata::convert_result_to_hash(get_artifact_custom_info_raw(artifact))
|
269
|
+
rescue N3NotFoundException
|
270
|
+
Hash.new
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def do_update_custom_metadata(artifact, source_metadata, target_metadata)
|
275
|
+
group_id, artifact_id, version, extension = parse_artifact_string(artifact)
|
276
|
+
encoded_string = N3Metadata::create_base64_subject(group_id, artifact_id, version, extension)
|
277
|
+
response = nexus.post(nexus_url("service/local/index/custom_metadata/#{configuration['repository']}/#{encoded_string}"), :body => create_custom_metadata_update_json(source_metadata, target_metadata), :header => DEFAULT_CONTENT_TYPE_HEADER)
|
278
|
+
case response.code
|
279
|
+
when 201
|
280
|
+
return true
|
281
|
+
else
|
282
|
+
raise UnexpectedStatusCodeException.new(response.status)
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
269
286
|
def create_add_trusted_key_json(params)
|
270
287
|
JSON.dump(:data => params)
|
271
288
|
end
|
data/lib/nexus_cli/tasks.rb
CHANGED
@@ -15,6 +15,7 @@ module NexusCli
|
|
15
15
|
map 'status' => :get_nexus_status
|
16
16
|
map 'search' => :search_for_artifacts
|
17
17
|
map 'search_custom' => :search_artifacts_custom
|
18
|
+
map 'transfer' => :transfer_artifact
|
18
19
|
|
19
20
|
class_option :overrides,
|
20
21
|
:type => :hash,
|
@@ -26,71 +27,61 @@ module NexusCli
|
|
26
27
|
:default => true,
|
27
28
|
:desc => "Set to false to disable SSL Verification."
|
28
29
|
|
29
|
-
def initialize(*args)
|
30
|
-
super
|
31
|
-
begin
|
32
|
-
@nexus_remote = Factory.create(options[:overrides], options[:ssl_verify])
|
33
|
-
rescue NexusCliError => e
|
34
|
-
say e.message, :red
|
35
|
-
exit e.status_code
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
30
|
method_option :destination,
|
40
31
|
:type => :string,
|
41
32
|
:default => nil,
|
42
33
|
:desc => "A different folder other than the current working directory."
|
43
34
|
desc "pull_artifact artifact", "Pulls an artifact from Nexus and places it on your machine."
|
44
35
|
def pull_artifact(artifact)
|
45
|
-
path_to_artifact =
|
36
|
+
path_to_artifact = nexus_remote.pull_artifact(artifact, options[:destination])
|
46
37
|
say "Artifact has been retrived and can be found at path: #{path_to_artifact}", :green
|
47
38
|
end
|
48
39
|
|
49
40
|
desc "push_artifact artifact file", "Pushes an artifact from your machine onto the Nexus."
|
50
41
|
def push_artifact(artifact, file)
|
51
|
-
|
42
|
+
nexus_remote.push_artifact(artifact, file)
|
52
43
|
say "Artifact #{artifact} has been successfully pushed to Nexus.", :green
|
53
44
|
end
|
54
45
|
|
55
46
|
desc "get_artifact_info artifact", "Gets and returns the metadata in XML format about a particular artifact."
|
56
47
|
def get_artifact_info(artifact)
|
57
|
-
say
|
48
|
+
say nexus_remote.get_artifact_info(artifact), :green
|
58
49
|
end
|
59
50
|
|
60
51
|
desc "search_for_artifacts", "Prints out some information about some junk."
|
61
52
|
def search_for_artifacts(artifact)
|
62
|
-
|
53
|
+
nexus_remote.search_for_artifacts(artifact).each{|output| say output, :green}
|
63
54
|
end
|
64
55
|
|
65
56
|
desc "get_artifact_custom_info artifact", "Gets and returns the custom metadata in XML format about a particular artifact."
|
66
57
|
def get_artifact_custom_info(artifact)
|
67
|
-
raise NotNexusProException unless
|
68
|
-
say
|
58
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
59
|
+
say nexus_remote.get_artifact_custom_info(artifact), :green
|
69
60
|
end
|
70
61
|
|
71
62
|
desc "update_artifact_custom_info artifact param1 param2 ...", "Updates the artifact custom metadata with the given key-value pairs."
|
72
63
|
def update_artifact_custom_info(artifact, *params)
|
73
|
-
raise NotNexusProException unless
|
74
|
-
|
64
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
65
|
+
nexus_remote.update_artifact_custom_info(artifact, *params)
|
75
66
|
say "Custom metadata for artifact #{artifact} has been successfully pushed to Nexus.", :green
|
76
67
|
end
|
77
68
|
|
78
69
|
desc "clear_artifact_custom_info artifact", "Clears the artifact custom metadata."
|
79
70
|
def clear_artifact_custom_info(artifact)
|
80
|
-
raise NotNexusProException unless
|
81
|
-
|
71
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
72
|
+
nexus_remote.clear_artifact_custom_info(artifact)
|
82
73
|
say "Custom metadata for artifact #{artifact} has been successfully cleared.", :green
|
83
74
|
end
|
84
75
|
|
85
76
|
desc "search_artifacts_custom param1 param2 ... ", "Searches for artifacts using artifact metadata and returns the result as a list with items in XML format."
|
86
77
|
def search_artifacts_custom(*params)
|
87
|
-
raise NotNexusProException unless
|
88
|
-
say (s =
|
78
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
79
|
+
say (s = nexus_remote.search_artifacts_custom(*params)) == "" ? "No search results." : s, :green
|
89
80
|
end
|
90
81
|
|
91
82
|
desc "get_nexus_configuration", "Prints out configuration from the .nexus_cli file that helps inform where artifacts will be uploaded."
|
92
83
|
def get_nexus_configuration
|
93
|
-
config =
|
84
|
+
config = nexus_remote.configuration
|
94
85
|
say "********* Reading CLI configuration from #{File.expand_path('~/.nexus_cli')} *********", :blue
|
95
86
|
say "Nexus URL: #{config['url']}", :blue
|
96
87
|
say "Nexus Repository: #{config['repository']}", :blue
|
@@ -98,7 +89,7 @@ module NexusCli
|
|
98
89
|
|
99
90
|
desc "get_nexus_status", "Prints out information about the Nexus instance."
|
100
91
|
def get_nexus_status
|
101
|
-
data =
|
92
|
+
data = nexus_remote.status
|
102
93
|
say "********* Getting Nexus status from #{data['base_url']} *********", :blue
|
103
94
|
say "Application Name: #{data['app_name']}", :blue
|
104
95
|
say "Version: #{data['version']}", :blue
|
@@ -110,7 +101,7 @@ module NexusCli
|
|
110
101
|
|
111
102
|
desc "get_global_settings", "Prints out your Nexus' current setttings and saves them to a file."
|
112
103
|
def get_global_settings
|
113
|
-
|
104
|
+
nexus_remote.get_global_settings
|
114
105
|
say "Your current Nexus global settings have been written to the file: ~/.nexus/global_settings.json", :blue
|
115
106
|
end
|
116
107
|
|
@@ -120,13 +111,13 @@ module NexusCli
|
|
120
111
|
:desc => "A String of the JSON you wish to upload."
|
121
112
|
desc "upload_global_settings", "Uploads a global_settings.json file to your Nexus to update its settings."
|
122
113
|
def upload_global_settings
|
123
|
-
|
114
|
+
nexus_remote.upload_global_settings(options[:json])
|
124
115
|
say "Your global_settings.json file has been uploaded to Nexus", :blue
|
125
116
|
end
|
126
117
|
|
127
118
|
desc "reset_global_settings", "Resets your Nexus global_settings to their out-of-the-box defaults."
|
128
119
|
def reset_global_settings
|
129
|
-
|
120
|
+
nexus_remote.reset_global_settings
|
130
121
|
say "Your Nexus global settings have been reset to their default values", :blue
|
131
122
|
end
|
132
123
|
|
@@ -138,26 +129,26 @@ module NexusCli
|
|
138
129
|
:desc => "The url of the actual repository for the proxy repository to use."
|
139
130
|
desc "create_repository name", "Creates a new Repository with the provided name."
|
140
131
|
def create_repository(name)
|
141
|
-
if
|
132
|
+
if nexus_remote.create_repository(name, options[:proxy], options[:url])
|
142
133
|
say "A new Repository named #{name} has been created.", :blue
|
143
134
|
end
|
144
135
|
end
|
145
136
|
|
146
137
|
desc "delete_repository name", "Deletes a Repository with the provided name."
|
147
138
|
def delete_repository(name)
|
148
|
-
if
|
139
|
+
if nexus_remote.delete_repository(name)
|
149
140
|
say "The Repository named #{name} has been deleted.", :blue
|
150
141
|
end
|
151
142
|
end
|
152
143
|
|
153
144
|
desc "get_repository_info name", "Finds and returns information about the provided Repository."
|
154
145
|
def get_repository_info(name)
|
155
|
-
say
|
146
|
+
say nexus_remote.get_repository_info(name), :green
|
156
147
|
end
|
157
148
|
|
158
149
|
desc "get_users", "Returns XML representing the users in Nexus."
|
159
150
|
def get_users
|
160
|
-
say
|
151
|
+
say nexus_remote.get_users, :green
|
161
152
|
end
|
162
153
|
|
163
154
|
method_option :username,
|
@@ -193,7 +184,7 @@ module NexusCli
|
|
193
184
|
def create_user
|
194
185
|
params = ask_user(options)
|
195
186
|
|
196
|
-
if
|
187
|
+
if nexus_remote.create_user(params)
|
197
188
|
say "A user with the ID of #{params[:userId]} has been created.", :blue
|
198
189
|
end
|
199
190
|
end
|
@@ -228,14 +219,14 @@ module NexusCli
|
|
228
219
|
params = ask_user(options, false, false)
|
229
220
|
params[:userId] = user_id
|
230
221
|
|
231
|
-
if
|
222
|
+
if nexus_remote.update_user(params)
|
232
223
|
say "User #{user_id} has been updated.", :blue
|
233
224
|
end
|
234
225
|
end
|
235
226
|
|
236
227
|
desc "delete_user user_id", "Deletes the user with the given id."
|
237
228
|
def delete_user(user_id)
|
238
|
-
if
|
229
|
+
if nexus_remote.delete_user(user_id)
|
239
230
|
say "User #{user_id} has been deleted.", :blue
|
240
231
|
end
|
241
232
|
end
|
@@ -264,45 +255,45 @@ module NexusCli
|
|
264
255
|
params = {:userId => user_id}
|
265
256
|
params[:oldPassword] = oldPassword
|
266
257
|
params[:newPassword] = newPassword
|
267
|
-
if
|
258
|
+
if nexus_remote.change_password(params)
|
268
259
|
say "The password for user #{user_id} has been updated.", :blue
|
269
260
|
end
|
270
261
|
end
|
271
262
|
|
272
263
|
desc "get_pub_sub repository_id", "Returns the publish/subscribe status of the given repository."
|
273
264
|
def get_pub_sub(repository_id)
|
274
|
-
raise NotNexusProException unless
|
275
|
-
say
|
265
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
266
|
+
say nexus_remote.get_pub_sub(repository_id), :green
|
276
267
|
end
|
277
268
|
|
278
269
|
desc "enable_artifact_publish repository_id", "Sets a repository to enable the publishing of updates about its artifacts."
|
279
270
|
def enable_artifact_publish(repository_id)
|
280
|
-
raise NotNexusProException unless
|
281
|
-
if
|
271
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
272
|
+
if nexus_remote.enable_artifact_publish(repository_id)
|
282
273
|
say "The repository #{repository_id} will now publish updates.", :blue
|
283
274
|
end
|
284
275
|
end
|
285
276
|
|
286
277
|
desc "disable_artifact_publish repository_id", "Sets a repository to disable the publishing of updates about its artifacts."
|
287
278
|
def disable_artifact_publish(repository_id)
|
288
|
-
raise NotNexusProException unless
|
289
|
-
if
|
279
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
280
|
+
if nexus_remote.disable_artifact_publish(repository_id)
|
290
281
|
say "The repository #{repository_id} is no longer publishing updates.", :blue
|
291
282
|
end
|
292
283
|
end
|
293
284
|
|
294
285
|
desc "enable_artifact_subscribe repository_id", "Sets a repository to subscribe to updates about artifacts."
|
295
286
|
def enable_artifact_subscribe(repository_id)
|
296
|
-
raise NotNexusProException unless
|
297
|
-
if
|
287
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
288
|
+
if nexus_remote.enable_artifact_subscribe(repository_id)
|
298
289
|
say "The repository #{repository_id} is now subscribed for artifact updates.", :blue
|
299
290
|
end
|
300
291
|
end
|
301
292
|
|
302
293
|
desc "disable_artifact_subscribe repository_id", "Sets a repository to stop subscribing to updates about artifacts."
|
303
294
|
def disable_artifact_subscribe(repository_id)
|
304
|
-
raise NotNexusProException unless
|
305
|
-
if
|
295
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
296
|
+
if nexus_remote.disable_artifact_subscribe(repository_id)
|
306
297
|
say "The repository #{repository_id} is no longer subscribed for artifact updates.", :blue
|
307
298
|
end
|
308
299
|
end
|
@@ -315,20 +306,20 @@ module NexusCli
|
|
315
306
|
:desc => "An available port that will be used for Smart Proxy connections."
|
316
307
|
desc "enable_smart_proxy", "Enables Smart Proxy on the server."
|
317
308
|
def enable_smart_proxy
|
318
|
-
raise NotNexusProException unless
|
319
|
-
say
|
309
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
310
|
+
say nexus_remote.enable_smart_proxy(options[:host], options[:port])
|
320
311
|
end
|
321
312
|
|
322
313
|
desc "disable_smart_proxy", "Disables Smart Proxy on the server."
|
323
314
|
def disable_smart_proxy
|
324
|
-
raise NotNexusProException unless
|
325
|
-
say
|
315
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
316
|
+
say nexus_remote.disable_smart_proxy
|
326
317
|
end
|
327
318
|
|
328
319
|
desc "get_smart_proxy_settings", "Returns the Smart Proxy settings of the server."
|
329
320
|
def get_smart_proxy_settings
|
330
|
-
raise NotNexusProException unless
|
331
|
-
say JSON.pretty_generate(JSON.parse(
|
321
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
322
|
+
say JSON.pretty_generate(JSON.parse(nexus_remote.get_smart_proxy_settings)), :green
|
332
323
|
end
|
333
324
|
|
334
325
|
method_option :certificate,
|
@@ -341,83 +332,99 @@ module NexusCli
|
|
341
332
|
:desc => "A description to give to the trusted key. It is probably best to make this meaningful."
|
342
333
|
desc "add_trusted_key", "Adds a new trusted key to the Smart Proxy configuration."
|
343
334
|
def add_trusted_key
|
344
|
-
raise NotNexusProException unless
|
345
|
-
if
|
335
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
336
|
+
if nexus_remote.add_trusted_key(options[:certificate], options[:description])
|
346
337
|
say "A new trusted key has been added to the nexus.", :blue
|
347
338
|
end
|
348
339
|
end
|
349
340
|
|
350
341
|
desc "delete_trusted_key key_id", "Deletes a trusted key using the given key_id."
|
351
342
|
def delete_trusted_key(key_id)
|
352
|
-
raise NotNexusProException unless
|
353
|
-
if
|
343
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
344
|
+
if nexus_remote.delete_trusted_key(key_id)
|
354
345
|
say "The trusted key with an id of #{key_id} has been deleted.", :blue
|
355
346
|
end
|
356
347
|
end
|
357
348
|
|
358
349
|
desc "get_trusted_keys", "Returns the trusted keys of the server."
|
359
350
|
def get_trusted_keys
|
360
|
-
raise NotNexusProException unless
|
361
|
-
say JSON.pretty_generate(JSON.parse(
|
351
|
+
raise NotNexusProException unless nexus_remote.kind_of? ProRemote
|
352
|
+
say JSON.pretty_generate(JSON.parse(nexus_remote.get_trusted_keys)), :green
|
362
353
|
end
|
363
354
|
|
364
355
|
desc "get_license_info", "Returns the license information of the server."
|
365
356
|
def get_license_info
|
366
|
-
say
|
357
|
+
say nexus_remote.get_license_info, :green
|
367
358
|
end
|
368
359
|
|
369
360
|
desc "install_license license_file", "Installs a license file into the server."
|
370
361
|
def install_license(license_file)
|
371
|
-
|
362
|
+
nexus_remote.install_license(license_file)
|
372
363
|
end
|
373
364
|
|
374
365
|
desc "get_logging_info", "Gets the log4j Settings of the Nexus server."
|
375
366
|
def get_logging_info
|
376
|
-
say
|
367
|
+
say nexus_remote.get_logging_info, :green
|
377
368
|
end
|
378
369
|
|
379
370
|
desc "set_logger_level level", "Updates the log4j logging level to a new value."
|
380
371
|
def set_logger_level(level)
|
381
|
-
if
|
372
|
+
if nexus_remote.set_logger_level(level)
|
382
373
|
say "The logging level of Nexus has been set to #{level.upcase}", :blue
|
383
374
|
end
|
384
375
|
end
|
385
376
|
|
386
377
|
desc "create_group_repository name", "Creates a new repository group with the given name."
|
387
378
|
def create_group_repository(name)
|
388
|
-
if
|
379
|
+
if nexus_remote.create_group_repository(name)
|
389
380
|
say "A new group repository named #{name} has been created.", :blue
|
390
381
|
end
|
391
382
|
end
|
392
383
|
|
393
384
|
desc "get_group_repository group_id", "Gets information about the given group repository."
|
394
385
|
def get_group_repository(group_id)
|
395
|
-
say
|
386
|
+
say nexus_remote.get_group_repository(group_id), :green
|
396
387
|
end
|
397
388
|
|
398
389
|
desc "add_to_group_repository group_id repository_to_add_id", "Adds a repository with the given id into the group repository."
|
399
390
|
def add_to_group_repository(group_id, repository_to_add_id)
|
400
|
-
if
|
391
|
+
if nexus_remote.add_to_group_repository(group_id, repository_to_add_id)
|
401
392
|
say "The repository #{repository_to_add_id} has been added to the repository group #{group_id}", :blue
|
402
393
|
end
|
403
394
|
end
|
404
395
|
|
405
396
|
desc "remove_from_group_repository group_id repository_to_remove_id", "Remove a repository with the given id from the group repository."
|
406
397
|
def remove_from_group_repository(group_id, repository_to_remove_id)
|
407
|
-
if
|
398
|
+
if nexus_remote.remove_from_group_repository(group_id, repository_to_remove_id)
|
408
399
|
say "The repository with an id of #{repository_to_remove_id} has been removed from the group repository, #{group_id}.", :blue
|
409
400
|
end
|
410
401
|
end
|
411
402
|
|
412
403
|
desc "delete_group_repository group_id","Deletes a group repository based on the given id."
|
413
404
|
def delete_group_repository(group_id)
|
414
|
-
if
|
405
|
+
if nexus_remote.delete_group_repository(group_id)
|
415
406
|
say "The group repository, #{group_id} has been deleted.", :blue
|
416
407
|
end
|
417
408
|
end
|
418
409
|
|
410
|
+
desc "transfer_artifact artifact from_repository to_repository", "Transfers a given artifact from one repository to another."
|
411
|
+
def transfer_artifact(artifact, from_repository, to_repository)
|
412
|
+
if nexus_remote.transfer_artifact(artifact, from_repository, to_repository)
|
413
|
+
say "The artifact #{artifact} has been transferred from #{from_repository} to #{to_repository}.", :blue
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
419
417
|
private
|
420
418
|
|
419
|
+
def nexus_remote
|
420
|
+
begin
|
421
|
+
nexus_remote ||= Factory.create(options[:overrides], options[:ssl_verify])
|
422
|
+
rescue NexusCliError => e
|
423
|
+
say e.message, :red
|
424
|
+
exit e.status_code
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
421
428
|
def ask_user(params, ask_username=true, ask_password=true)
|
422
429
|
username = params[:username]
|
423
430
|
first_name = params[:first_name]
|
@@ -1,7 +1,7 @@
|
|
1
1
|
Feature: Use the Nexus Pro CLI
|
2
2
|
As a Pro CLI user
|
3
3
|
I need commands to get, update, search, and delete Nexus artifact custom metadata
|
4
|
-
|
4
|
+
|
5
5
|
Scenario: Push an artifact
|
6
6
|
When I push an artifact with the GAV of "com.test:myprotest:1.0.0:tgz"
|
7
7
|
Then the output should contain:
|
@@ -10,7 +10,7 @@ Feature: Use the Nexus Pro CLI
|
|
10
10
|
"""
|
11
11
|
And the exit status should be 0
|
12
12
|
|
13
|
-
|
13
|
+
Scenario: Update an artifact's custom metadata
|
14
14
|
When I call the nexus "update_artifact_custom_info com.test:myprotest:1.0.0:tgz somekey:somevalue" command
|
15
15
|
Then the output should contain:
|
16
16
|
"""
|
@@ -78,6 +78,15 @@ Feature: Use the Nexus Pro CLI
|
|
78
78
|
"""
|
79
79
|
And the exit status should be 0
|
80
80
|
|
81
|
+
Scenario: Transfer an artifact and ensure its metadata is also copied
|
82
|
+
When I call the nexus "transfer com.test:myprotest:1.0.0:tgz releases thirdparty" command
|
83
|
+
And I call the nexus "custom com.test:myprotest:1.0.0:tgz" command overriding "repository:thirdparty"
|
84
|
+
Then the output should contain:
|
85
|
+
"""
|
86
|
+
<somekey>somevalue_1!</somekey>
|
87
|
+
"""
|
88
|
+
And the exit status should be 0
|
89
|
+
|
81
90
|
Scenario: Clear an artifact's custom metadata
|
82
91
|
When I call the nexus "clear_artifact_custom_info com.test:myprotest:1.0.0:tgz" command
|
83
92
|
Then the output should contain:
|
@@ -90,6 +99,16 @@ Feature: Use the Nexus Pro CLI
|
|
90
99
|
Scenario: Attempt to delete an artifact
|
91
100
|
When I delete an artifact with the GAV of "com.test:myprotest:1.0.0:tgz"
|
92
101
|
And I call the nexus "info com.test:myprotest:1.0.0:tgz" command
|
102
|
+
Then the output should contain:
|
103
|
+
"""
|
104
|
+
The artifact you requested information for could not be found. Please ensure it exists inside the Nexus.
|
105
|
+
"""
|
106
|
+
And the exit status should be 101
|
107
|
+
|
108
|
+
@delete
|
109
|
+
Scenario: Attempt to delete another artifact
|
110
|
+
When I delete an artifact with the GAV of "com.test:myprotest:1.0.0:tgz" from the "thirdparty" repository
|
111
|
+
And I call the nexus "info com.test:myprotest:1.0.0:tgz" command overriding "repository:thirdparty"
|
93
112
|
Then the output should contain:
|
94
113
|
"""
|
95
114
|
The artifact you requested information for could not be found. Please ensure it exists inside the Nexus.
|
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.9.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-10-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: thor
|
@@ -253,7 +253,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
253
253
|
version: '0'
|
254
254
|
segments:
|
255
255
|
- 0
|
256
|
-
hash:
|
256
|
+
hash: 3447195715993783441
|
257
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
258
258
|
none: false
|
259
259
|
requirements:
|
@@ -262,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
262
262
|
version: '0'
|
263
263
|
segments:
|
264
264
|
- 0
|
265
|
-
hash:
|
265
|
+
hash: 3447195715993783441
|
266
266
|
requirements: []
|
267
267
|
rubyforge_project:
|
268
268
|
rubygems_version: 1.8.21
|