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_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',
)

Parameters:

  • options (Hash) (defaults to: {})

    the list of options to search with

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

Returns:



160
161
162
163
164
165
166
167
168
# File 'lib/artifactory/resources/artifact.rb', line 160

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

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

See Also:



264
265
266
267
268
269
270
271
# File 'lib/artifactory/resources/artifact.rb', line 264

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',
)

Parameters:

  • options (Hash) (defaults to: {})

    the list of options to search with

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

Returns:



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/artifactory/resources/artifact.rb', line 76

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')

Parameters:

  • options (Hash) (defaults to: {})

    the list of options to search with

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

Returns:

  • (String, nil)

    the latest version as a string (e.g. 1.0-201203131455-2), or nil if no artifact matches the given query



241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
# File 'lib/artifactory/resources/artifact.rb', line 241

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',
)

Parameters:

  • options (Hash) (defaults to: {})

    the free-form list of options to search with

Options Hash (options):

  • :client (Artifactory::Client)

    the client object to make the request with

  • :repos (String, Array<String>)

    the list of repos to search

Returns:



121
122
123
124
125
126
127
128
129
# File 'lib/artifactory/resources/artifact.rb', line 121

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')

Parameters:

  • options (Hash) (defaults to: {})

    the list of options to search with

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

Returns:



26
27
28
29
30
31
32
33
34
# File 'lib/artifactory/resources/artifact.rb', line 26

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

.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')

Parameters:

  • options (Hash) (defaults to: {})

    the list of options to search with

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



190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'lib/artifactory/resources/artifact.rb', line 190

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

Returns:

  • (Object)


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

attribute :checksums

#checksums=(value) ⇒ Object

Set this object’s checksums

Parameters:

  • value (Object)

    the value to set for checksums

  • default (Object)

    the default value for this attribute



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

attribute :checksums

#checksums?Boolean

Determines if the checksums value exists and is truthy

Returns:

  • (Boolean)


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

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' }] }

Returns:

  • (Hash<String, Array<Hash>>)


355
356
357
# File 'lib/artifactory/resources/artifact.rb', line 355

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

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

See Also:

  • #copy_or_move


307
308
309
# File 'lib/artifactory/resources/artifact.rb', line 307

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

#createdObject

Return this object’s created

Returns:

  • (Object)


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

attribute :created

#created=(value) ⇒ Object

Set this object’s created

Parameters:

  • value (Object)

    the value to set for created

  • default (Object)

    the default value for this attribute



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

attribute :created

#created?Boolean

Determines if the created value exists and is truthy

Returns:

  • (Boolean)


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

attribute :created

#deleteBoolean

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

Returns:

  • (Boolean)

    true if the object was deleted successfully, false otherwise



318
319
320
321
322
# File 'lib/artifactory/resources/artifact.rb', line 318

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

Parameters:

  • target (String) (defaults to: Dir.mktmpdir)

    the target directory where the artifact should be downloaded to (defaults to a temporary directory). **It is the user’s responsibility to cleanup the temporary directory when finished!**

  • options (Hash) (defaults to: {})

Options Hash (options):

  • filename (String)

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

Returns:

  • (String)

    the path where the file was downloaded on disk



380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
# File 'lib/artifactory/resources/artifact.rb', line 380

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

Returns:

  • (Object)


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

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

#download_uri=(value) ⇒ Object

Set this object’s download_uri

Parameters:

  • value (Object)

    the value to set for download_uri

  • default (Object)

    the default value for this attribute



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

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

#download_uri?Boolean

Determines if the download_uri value exists and is truthy

Returns:

  • (Boolean)


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

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

#keyObject

Return this object’s key

Returns:

  • (Object)


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

attribute :key

#key=(value) ⇒ Object

Set this object’s key

Parameters:

  • value (Object)

    the value to set for key

  • default (Object)

    the default value for this attribute



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

attribute :key

#key?Boolean

Determines if the key value exists and is truthy

Returns:

  • (Boolean)


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

attribute :key

#last_modifiedObject

Return this object’s last_modified

Returns:

  • (Object)


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

attribute :last_modified

#last_modified=(value) ⇒ Object

Set this object’s last_modified

Parameters:

  • value (Object)

    the value to set for last_modified

  • default (Object)

    the default value for this attribute



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

attribute :last_modified

#last_modified?Boolean

Determines if the last_modified value exists and is truthy

Returns:

  • (Boolean)


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

attribute :last_modified

#last_updatedObject

Return this object’s last_updated

Returns:

  • (Object)


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

attribute :last_updated

#last_updated=(value) ⇒ Object

Set this object’s last_updated

Parameters:

  • value (Object)

    the value to set for last_updated

  • default (Object)

    the default value for this attribute



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

attribute :last_updated

#last_updated?Boolean

Determines if the last_updated value exists and is truthy

Returns:

  • (Boolean)


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

attribute :last_updated

#local_pathObject

Return this object’s local_path

Returns:

  • (Object)


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

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

#local_path=(value) ⇒ Object

Set this object’s local_path

Parameters:

  • value (Object)

    the value to set for local_path

  • default (Object)

    the default value for this attribute



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

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

#local_path?Boolean

Determines if the local_path value exists and is truthy

Returns:

  • (Boolean)


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

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

#md5String

The MD5 of this artifact.

Returns:

  • (String)


300
301
302
# File 'lib/artifactory/resources/artifact.rb', line 300

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

#mime_typeObject

Return this object’s mime_type

Returns:

  • (Object)


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

attribute :mime_type

#mime_type=(value) ⇒ Object

Set this object’s mime_type

Parameters:

  • value (Object)

    the value to set for mime_type

  • default (Object)

    the default value for this attribute



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

attribute :mime_type

#mime_type?Boolean

Determines if the mime_type value exists and is truthy

Returns:

  • (Boolean)


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

attribute :mime_type

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

See Also:

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


327
328
329
# File 'lib/artifactory/resources/artifact.rb', line 327

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'] }

Returns:

  • (Hash<String, Object>)

    the list of properties



340
341
342
# File 'lib/artifactory/resources/artifact.rb', line 340

def properties
  @properties ||= client.get(uri, properties: nil)['properties']
end

#repoObject

Return this object’s repo

Returns:

  • (Object)


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

attribute :repo

#repo=(value) ⇒ Object

Set this object’s repo

Parameters:

  • value (Object)

    the value to set for repo

  • default (Object)

    the default value for this attribute



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

attribute :repo

#repo?Boolean

Determines if the repo value exists and is truthy

Returns:

  • (Boolean)


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

attribute :repo

#sha1String

The SHA of this artifact.

Returns:

  • (String)


291
292
293
# File 'lib/artifactory/resources/artifact.rb', line 291

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

#sizeObject

Return this object’s size

Returns:

  • (Object)


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

attribute :size

#size=(value) ⇒ Object

Set this object’s size

Parameters:

  • value (Object)

    the value to set for size

  • default (Object)

    the default value for this attribute



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

attribute :size

#size?Boolean

Determines if the size value exists and is truthy

Returns:

  • (Boolean)


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

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'
})

Parameters:

  • repo (String)

    the key of the repository to which to upload the file

  • remote_path (String)

    the path where this resource will live in the remote artifactory repository, relative to the repository key

  • headers (Hash) (defaults to: {})

    the list of headers to send with the request

  • properties (Hash) (defaults to: {})

    a list of matrix properties

Returns:

See Also:

  • Artifactory Matrix Properties


432
433
434
435
436
437
438
439
440
441
442
443
444
# File 'lib/artifactory/resources/artifact.rb', line 432

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)

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

  # Upload checksums if they were given
  upload_checksum(repo, remote_path, :md5,  md5)  if md5
  upload_checksum(repo, remote_path, :sha1, sha1) if sha1

  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!**. This is both a public and private API. It is automatically called in #upload if the SHA values are set. You may also call it manually.

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')

Parameters:

  • type (Symbol)

    the type of checksum to write (md5 or sha1)

  • value (String)

    the actual checksum

  • repo (String)

    the key of the repository to which to upload the file

  • remote_path (String)

    the path where this resource will live in the remote artifactory repository, relative to the repository key

  • headers (Hash)

    the list of headers to send with the request

  • properties (Hash)

    a list of matrix properties

Returns:

  • (true)


464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
# File 'lib/artifactory/resources/artifact.rb', line 464

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:



514
515
516
517
518
# File 'lib/artifactory/resources/artifact.rb', line 514

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')

Parameters:

  • checksum (String)

    the SHA1 checksum of the artifact to upload

  • repo (String)

    the key of the repository to which to upload the file

  • remote_path (String)

    the path where this resource will live in the remote artifactory repository, relative to the repository key

  • headers (Hash)

    the list of headers to send with the request

  • properties (Hash) (defaults to: {})

    a list of matrix properties

See Also:



495
496
497
498
499
500
# File 'lib/artifactory/resources/artifact.rb', line 495

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

Returns:

  • (Object)


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

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

#uri=(value) ⇒ Object

Set this object’s uri

Parameters:

  • value (Object)

    the value to set for uri

  • default (Object)

    the default value for this attribute



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

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

#uri?Boolean

Determines if the uri value exists and is truthy

Returns:

  • (Boolean)


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

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