Class: Artifactory::Resource::Artifact

Inherits:
Base
  • Object
show all
Defined in:
lib/artifactory/resources/artifact.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

attribute, attributes, #attributes, #client, #client=, #client?, #extract_client!, extract_client!, find_from_config, format_repos!, #format_repos!, from_url, has_attribute?, #initialize, #inspect, list_from_config, #set, #to_hash, #to_json, #to_matrix_properties, #to_query_string_parameters, #to_s, url_safe, #url_safe

Constructor Details

This class inherits a constructor from Artifactory::Resource::Base

Class Method Details

.checksum_search(options = {}) ⇒ Array<Resource::Artifact>

Search for an artifact by its checksum

Examples:

Search for all repositories with the given MD5 checksum

Artifact.checksum_search(
  md5: 'abcd1234...',
)

Search for all artifacts with the given SHA1 checksum in a repo

Artifact.checksum_search(
  sha1: 'abcdef123456....',
  repos: 'libs-release-local',
)

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :md5 (String)

    the MD5 checksum of the artifact to search for

  • :sha1 (String)

    the SHA1 checksum of the artifact to search for

  • :repos (String, Array<String>)

    the list of repos to search



178
179
180
181
182
183
184
185
186
# File 'lib/artifactory/resources/artifact.rb', line 178

def checksum_search(options = {})
  client = extract_client!(options)
  params = Util.slice(options, :md5, :sha1, :repos)
  format_repos!(params)

  client.get('/api/search/checksum', params)['results'].map do |artifact|
    from_url(artifact['uri'], client: client)
  end
end

.creation_search(options = {}) ⇒ Array<Resource::Artifact>

Search for an artifact by its creation date

Examples:

Search for all repositories with the given creation date range

Artifact.usage_search(
  from : 1414800000000,
  to   : 1414871200000,
)

Search for all artifacts with the given creation date range in a repo

Artifact.usage_search(
  from : 1414800000000,
  to   : 1414871200000,
  repos: 'libs-release-local',
)

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :from (Long)

    the creation start date of the artifact to search for (millis since epoch)

  • :to (Long)

    the creation end date of the artifact to search for (millis since epoch)

  • :repos (String, Array<String>)

    the list of repos to search



260
261
262
263
264
265
266
267
268
# File 'lib/artifactory/resources/artifact.rb', line 260

def creation_search(options = {})
  client = extract_client!(options)
  params = Util.slice(options, :from, :to, :repos)
  format_repos!(params)

  client.get('/api/search/creation', params)['results'].map do |artifact|
    from_url(artifact['uri'], client: client)
  end
end

.from_hash(hash, options = {}) ⇒ Object

See Also:



364
365
366
367
368
369
370
371
# File 'lib/artifactory/resources/artifact.rb', line 364

def from_hash(hash, options = {})
  super.tap do |instance|
    instance.created       = Time.parse(instance.created) rescue nil
    instance.last_modified = Time.parse(instance.last_modified) rescue nil
    instance.last_updated  = Time.parse(instance.last_updated)  rescue nil
    instance.size          = instance.size.to_i
  end
end

.gavc_search(options = {}) ⇒ Array<Resource::Artifact>

Search for an artifact by Maven coordinates: Group ID, Artifact ID, Version and Classifier.

Examples:

Search for all repositories with the given gavc

Artifact.gavc_search(
  group:      'org.acme',
  name:       'artifact',
  version:    '1.0',
  classifier: 'sources',
)

Search for all artifacts with the given gavc in a specific repo

Artifact.gavc_search(
  group:      'org.acme',
  name:       'artifact',
  version:    '1.0',
  classifier: 'sources',
  repos:      'libs-release-local',
)

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :group (String)

    the group id to search for

  • :name (String)

    the artifact id to search for

  • :version (String)

    the version of the artifact to search for

  • :classifier (String)

    the classifer to search for

  • :repos (String, Array<String>)

    the list of repos to search



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/artifactory/resources/artifact.rb', line 94

def gavc_search(options = {})
  client = extract_client!(options)
  options = Util.rename_keys(options,
    :group      => :g,
    :name       => :a,
    :version    => :v,
    :classifier => :c,
  )
  params = Util.slice(options, :g, :a, :v, :c, :repos)
  format_repos!(params)

  client.get('/api/search/gavc', params)['results'].map do |artifact|
    from_url(artifact['uri'], client: client)
  end
end

.latest_version(options = {}) ⇒ String?

Get the latest version of an artifact.

Examples:

Find the latest version of an artifact

Artifact.latest_version(name: 'artifact')

Find the latest version of an artifact in a repo

Artifact.latest_version(
  name: 'artifact',
  repo: 'libs-release-local',
)

Find the latest snapshot version of an artifact

Artifact.latest_version(name: 'artifact', version: '1.0-SNAPSHOT')

Find the latest version of an artifact in a group

Artifact.latest_version(name: 'artifact', group: 'org.acme')

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :group (String)

    the group id to search for

  • :name (String)

    the artifact id to search for

  • :version (String)

    the version of the artifact to search for

  • :remote (Boolean)

    search remote repos (default: false)

  • :repos (String, Array<String>)

    the list of repos to search



341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
# File 'lib/artifactory/resources/artifact.rb', line 341

def latest_version(options = {})
  client = extract_client!(options)
  options = Util.rename_keys(options,
    :group   => :g,
    :name    => :a,
    :version => :v,
  )
  params = Util.slice(options, :g, :a, :v, :repos, :remote)
  format_repos!(params)

  # For whatever reason, Artifactory won't accept "true" - they want a
  # literal "1"...
  params[:remote] = 1 if options[:remote]

  client.get('/api/search/latestVersion', params)
rescue Error::HTTPError => e
  raise unless e.code == 404
  nil
end

.property_search(options = {}) ⇒ Array<Resource::Artifact>

Search for an artifact by the given properties. These are arbitrary properties defined by the user on artifact, so the search uses a free- form schema.

Examples:

Search for all repositories with the given properties

Artifact.property_search(
  branch: 'master',
  author: 'sethvargo',
)

Search for all artifacts with the given gavc in a specific repo

Artifact.property_search(
  branch: 'master',
  author: 'sethvargo',
  repos: 'libs-release-local',
)

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :repos (String, Array<String>)

    the list of repos to search



139
140
141
142
143
144
145
146
147
# File 'lib/artifactory/resources/artifact.rb', line 139

def property_search(options = {})
  client = extract_client!(options)
  params = options.dup
  format_repos!(params)

  client.get('/api/search/prop', params)['results'].map do |artifact|
    from_url(artifact['uri'], client: client)
  end
end

.search(options = {}) ⇒ Array<Resource::Artifact>

Search for an artifact by the full or partial filename.

Examples:

Search for all repositories with the name “artifact”

Artifact.search(name: 'artifact')

Search for all artifacts named “artifact” in a specific repo

Artifact.search(name: 'artifact', repos: 'libs-release-local')

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :name (String)

    the name of the artifact to search (it can be a regular expression)

  • :repos (String, Array<String>)

    the list of repos to search



44
45
46
47
48
49
50
51
52
# File 'lib/artifactory/resources/artifact.rb', line 44

def search(options = {})
  client = extract_client!(options)
  params = Util.slice(options, :name, :repos)
  format_repos!(params)

  client.get('/api/search/artifact', params)['results'].map do |artifact|
    from_url(artifact['uri'], client: client)
  end
end

.usage_search(options = {}) ⇒ Array<Resource::Artifact>

Search for an artifact by its usage

Examples:

Search for all repositories with the given usage statistics

Artifact.usage_search(
  notUsedSince: 1388534400000,
  createdBefore: 1388534400000,
)

Search for all artifacts with the given usage statistics in a repo

Artifact.usage_search(
  notUsedSince: 1388534400000,
  createdBefore: 1388534400000,
  repos: 'libs-release-local',
)

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :notUsedSince (Long)

    the last downloaded cutoff date of the artifact to search for (millis since epoch)

  • :createdBefore (Long)

    the creation cutoff date of the artifact to search for (millis since epoch)

  • :repos (String, Array<String>)

    the list of repos to search



219
220
221
222
223
224
225
226
227
# File 'lib/artifactory/resources/artifact.rb', line 219

def usage_search(options = {})
  client = extract_client!(options)
  params = Util.slice(options, :notUsedSince, :createdBefore, :repos)
  format_repos!(params)

  client.get('/api/search/usage', params)['results'].map do |artifact|
    from_url(artifact['uri'], client: client)
  end
end

.versions(options = {}) ⇒ Object

Get all versions of an artifact.

Examples:

Get all versions of a given artifact

Artifact.versions(name: 'artifact')

Get all versions of a given artifact in a specific repo

Artifact.versions(name: 'artifact', repos: 'libs-release-local')

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :group (String)

    the

  • :sha1 (String)

    the SHA1 checksum of the artifact to search for

  • :repos (String, Array<String>)

    the list of repos to search



290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
# File 'lib/artifactory/resources/artifact.rb', line 290

def versions(options = {})
  client  = extract_client!(options)
  options = Util.rename_keys(options,
    :group   => :g,
    :name    => :a,
    :version => :v,
  )
  params = Util.slice(options, :g, :a, :v, :repos)
  format_repos!(params)

  client.get('/api/search/versions', params)['results']
rescue Error::HTTPError => e
  raise unless e.code == 404
  []
end

Instance Method Details

#checksumsObject

Return this object’s checksums



375
# File 'lib/artifactory/resources/artifact.rb', line 375

attribute :checksums

#checksums=(value) ⇒ Object

Set this object’s checksums



375
# File 'lib/artifactory/resources/artifact.rb', line 375

attribute :checksums

#checksums?Boolean

Determines if the checksums value exists and is truthy



375
# File 'lib/artifactory/resources/artifact.rb', line 375

attribute :checksums

#complianceHash<String, Array<Hash>>

Get compliance info for a given artifact path. The result includes license and vulnerabilities, if any.

**This requires the Black Duck addon to be enabled!**

Examples:

Get compliance info for an artifact

artifact.compliance #=> { 'licenses' => [{ 'name' => 'LGPL v3' }] }


455
456
457
# File 'lib/artifactory/resources/artifact.rb', line 455

def compliance
  @compliance ||= client.get(File.join('/api/compliance', relative_path))
end

#copy(destination, options = {}) ⇒ Object

See Also:

  • #copy_or_move


407
408
409
# File 'lib/artifactory/resources/artifact.rb', line 407

def copy(destination, options = {})
  copy_or_move(:copy, destination, options)
end

#createdObject

Return this object’s created



376
# File 'lib/artifactory/resources/artifact.rb', line 376

attribute :created

#created=(value) ⇒ Object

Set this object’s created



376
# File 'lib/artifactory/resources/artifact.rb', line 376

attribute :created

#created?Boolean

Determines if the created value exists and is truthy



376
# File 'lib/artifactory/resources/artifact.rb', line 376

attribute :created

#deleteBoolean

Delete this artifact from repository, suppressing any ResourceNotFound exceptions might occur.



418
419
420
421
422
# File 'lib/artifactory/resources/artifact.rb', line 418

def delete
  !!client.delete(download_uri)
rescue Error::HTTPError
  false
end

#download(target = Dir.mktmpdir, options = {}) ⇒ String

Download the artifact onto the local disk.

Examples:

Download an artifact

artifact.download #=> /tmp/cache/000adad0-bac/artifact.deb

Download a remote artifact into a specific target

artifact.download('~/Desktop') #=> ~/Desktop/artifact.deb

Options Hash (options):

  • filename (String)

    the name of the file when downloaded to disk (defaults to the basename of the file on the server)



480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
# File 'lib/artifactory/resources/artifact.rb', line 480

def download(target = Dir.mktmpdir, options = {})
  target = File.expand_path(target)

  # Make the directory if it doesn't yet exist
  FileUtils.mkdir_p(target) unless File.exists?(target)

  # Use the server artifact's filename if one wasn't given
  filename = options[:filename] || File.basename(download_uri)

  # Construct the full path for the file
  destination = File.join(target, filename)

  File.open(destination, 'wb') do |file|
    file.write(client.get(download_uri))
  end

  destination
end

#download_uriObject

Return this object’s download_uri



377
# File 'lib/artifactory/resources/artifact.rb', line 377

attribute :download_uri, ->{ raise 'Download URI missing!' }

#download_uri=(value) ⇒ Object

Set this object’s download_uri



377
# File 'lib/artifactory/resources/artifact.rb', line 377

attribute :download_uri, ->{ raise 'Download URI missing!' }

#download_uri?Boolean

Determines if the download_uri value exists and is truthy



377
# File 'lib/artifactory/resources/artifact.rb', line 377

attribute :download_uri, ->{ raise 'Download URI missing!' }

#keyObject

Return this object’s key



378
# File 'lib/artifactory/resources/artifact.rb', line 378

attribute :key

#key=(value) ⇒ Object

Set this object’s key



378
# File 'lib/artifactory/resources/artifact.rb', line 378

attribute :key

#key?Boolean

Determines if the key value exists and is truthy



378
# File 'lib/artifactory/resources/artifact.rb', line 378

attribute :key

#last_modifiedObject

Return this object’s last_modified



379
# File 'lib/artifactory/resources/artifact.rb', line 379

attribute :last_modified

#last_modified=(value) ⇒ Object

Set this object’s last_modified



379
# File 'lib/artifactory/resources/artifact.rb', line 379

attribute :last_modified

#last_modified?Boolean

Determines if the last_modified value exists and is truthy



379
# File 'lib/artifactory/resources/artifact.rb', line 379

attribute :last_modified

#last_updatedObject

Return this object’s last_updated



380
# File 'lib/artifactory/resources/artifact.rb', line 380

attribute :last_updated

#last_updated=(value) ⇒ Object

Set this object’s last_updated



380
# File 'lib/artifactory/resources/artifact.rb', line 380

attribute :last_updated

#last_updated?Boolean

Determines if the last_updated value exists and is truthy



380
# File 'lib/artifactory/resources/artifact.rb', line 380

attribute :last_updated

#local_pathObject

Return this object’s local_path



381
# File 'lib/artifactory/resources/artifact.rb', line 381

attribute :local_path, ->{ raise 'Local destination missing!' }

#local_path=(value) ⇒ Object

Set this object’s local_path



381
# File 'lib/artifactory/resources/artifact.rb', line 381

attribute :local_path, ->{ raise 'Local destination missing!' }

#local_path?Boolean

Determines if the local_path value exists and is truthy



381
# File 'lib/artifactory/resources/artifact.rb', line 381

attribute :local_path, ->{ raise 'Local destination missing!' }

#md5String

The MD5 of this artifact.



400
401
402
# File 'lib/artifactory/resources/artifact.rb', line 400

def md5
  checksums && checksums['md5']
end

#mime_typeObject

Return this object’s mime_type



382
# File 'lib/artifactory/resources/artifact.rb', line 382

attribute :mime_type

#mime_type=(value) ⇒ Object

Set this object’s mime_type



382
# File 'lib/artifactory/resources/artifact.rb', line 382

attribute :mime_type

#mime_type?Boolean

Determines if the mime_type value exists and is truthy



382
# File 'lib/artifactory/resources/artifact.rb', line 382

attribute :mime_type

#move(destination, options = {}) ⇒ Object

See Also:

  • Artifactory::Resource::Artifact.{Artifact{Artifact#copy_or_move}


427
428
429
# File 'lib/artifactory/resources/artifact.rb', line 427

def move(destination, options = {})
  copy_or_move(:move, destination, options)
end

#propertiesHash<String, Object>

The list of properties for this object.

Examples:

List all properties for an artifact

artifact.properties #=> { 'artifactory.licenses'=>['Apache-2.0'] }


440
441
442
# File 'lib/artifactory/resources/artifact.rb', line 440

def properties
  @properties ||= client.get(File.join('/api/storage', relative_path), properties: nil)['properties']
end

#repoObject

Return this object’s repo



383
# File 'lib/artifactory/resources/artifact.rb', line 383

attribute :repo

#repo=(value) ⇒ Object

Set this object’s repo



383
# File 'lib/artifactory/resources/artifact.rb', line 383

attribute :repo

#repo?Boolean

Determines if the repo value exists and is truthy



383
# File 'lib/artifactory/resources/artifact.rb', line 383

attribute :repo

#sha1String

The SHA of this artifact.



391
392
393
# File 'lib/artifactory/resources/artifact.rb', line 391

def sha1
  checksums && checksums['sha1']
end

#sizeObject

Return this object’s size



384
# File 'lib/artifactory/resources/artifact.rb', line 384

attribute :size

#size=(value) ⇒ Object

Set this object’s size



384
# File 'lib/artifactory/resources/artifact.rb', line 384

attribute :size

#size?Boolean

Determines if the size value exists and is truthy



384
# File 'lib/artifactory/resources/artifact.rb', line 384

attribute :size

#upload(repo, remote_path, properties = {}, headers = {}) ⇒ Resource::Artifact

Upload an artifact into the repository. If the first parameter is a File object, that file descriptor is passed to the uploader. If the first parameter is a string, it is assumed to be the path to a local file on disk. This method will automatically construct the File object from the given path.

Examples:

Upload an artifact from a File instance

artifact = Artifact.new(local_path: '/local/path/to/file.deb')
artifact.upload('libs-release-local', '/remote/path')

Upload an artifact with matrix properties

artifact = Artifact.new(local_path: '/local/path/to/file.deb')
artifact.upload('libs-release-local', '/remote/path', {
  status: 'DEV',
  rating: 5,
  branch: 'master'
})

See Also:

  • Artifactory Matrix Properties


532
533
534
535
536
537
538
539
540
541
542
543
544
# File 'lib/artifactory/resources/artifact.rb', line 532

def upload(repo, remote_path, properties = {}, headers = {})
  file     = File.new(File.expand_path(local_path))
  matrix   = to_matrix_properties(properties)
  endpoint = File.join("#{url_safe(repo)}#{matrix}", remote_path)

  # Include checksums in headers if given.
  headers['X-Checksum-Md5'] = md5   if md5
  headers['X-Checksum-Sha1'] = sha1 if sha1

  response = client.put(endpoint, file, headers)

  self.class.from_hash(response)
end

#upload_checksum(repo, remote_path, type, value) ⇒ true

Upload the checksum for this artifact. **The artifact must already be uploaded or Artifactory will throw an exception!**.

Examples:

Set an artifact’s md5

artifact = Artifact.new(local_path: '/local/path/to/file.deb')
artifact.upload_checksum('libs-release-local', '/remote/path', :md5, 'ABCD1234')


562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
# File 'lib/artifactory/resources/artifact.rb', line 562

def upload_checksum(repo, remote_path, type, value)
  file = Tempfile.new("checksum.#{type}")
  file.write(value)
  file.rewind

  endpoint = File.join(url_safe(repo), "#{remote_path}.#{type}")

  client.put(endpoint, file)
  true
ensure
  if file
    file.close
    file.unlink
  end
end

#upload_from_archive(repo, remote_path, properties = {}) ⇒ Object

Upload an artifact with the given archive. Consult the artifactory documentation for the format of the archive to upload.

Examples:

Upload an artifact with a checksum

artifact = Artifact.new(local_path: '/local/path/to/file.deb')
artifact.upload_from_archive('/remote/path')

See Also:



612
613
614
615
616
# File 'lib/artifactory/resources/artifact.rb', line 612

def upload_from_archive(repo, remote_path, properties = {})
  upload(repo, remote_path, properties,
    'X-Explode-Archive' => true,
  )
end

#upload_with_checksum(repo, remote_path, checksum, properties = {}) ⇒ Object

Upload an artifact with the given SHA checksum. Consult the artifactory documentation for the possible responses when the checksums fail to match.

Examples:

Upload an artifact with a checksum

artifact = Artifact.new(local_path: '/local/path/to/file.deb')
artifact.upload_with_checksum('libs-release-local', /remote/path', 'ABCD1234')

See Also:



593
594
595
596
597
598
# File 'lib/artifactory/resources/artifact.rb', line 593

def upload_with_checksum(repo, remote_path, checksum, properties = {})
  upload(repo, remote_path, properties,
    'X-Checksum-Deploy' => true,
    'X-Checksum-Sha1'   => checksum,
  )
end

#uriObject

Return this object’s uri



374
# File 'lib/artifactory/resources/artifact.rb', line 374

attribute :uri, ->{ raise 'API path missing!' }

#uri=(value) ⇒ Object

Set this object’s uri



374
# File 'lib/artifactory/resources/artifact.rb', line 374

attribute :uri, ->{ raise 'API path missing!' }

#uri?Boolean

Determines if the uri value exists and is truthy



374
# File 'lib/artifactory/resources/artifact.rb', line 374

attribute :uri, ->{ raise 'API path missing!' }