Artifactory
dohq-artifactory: a Python client for Artifactory
Install / Use
/learn @devopshq/ArtifactoryREADME
Python interface library for JFrog Artifactory 
dohq-artifactory is a live python package for JFrog Artifactory. This module is intended to serve as a logical
descendant of pathlib, and it implements everything as closely as
possible to the origin with few exceptions. Current module was forked from outdated
parallels/artifactory and supports all functionality from the original
package.
Tables of Contents
<!-- toc -->- Install
- Usage
- Authentication
- Artifactory SaaS
- Walking Directory Tree
- Downloading Artifacts
- Downloading Artifacts in chunks
- Downloading Artifacts folder as archive
- Uploading Artifacts
- Copy Artifacts
- Move Artifacts
- Remove Artifacts
- Artifact properties
- Repository Scheduled Replication Status
- Artifactory Query Language
- Artifact Stat
- Promote Docker image
- Builds
- Exception handling
- Admin area
- Advanced
- Contribute
- Advertising
Install
Upgrade/install to the newest available version:
pip install dohq-artifactory --upgrade
Install latest development version (Warning! It may contains some errors!):
pip install dohq-artifactory --upgrade --pre
Or specify version, e.g.:
pip install dohq-artifactory==0.5.dev243
Usage
Authentication
dohq-artifactory supports these ways of authentication:
- Username and password (or API KEY) to access restricted resources, you can pass
authparameter to ArtifactoryPath. - API KEY can pass with
apikeyparameter. - Access Token can pass with
tokenparameter.
from artifactory import ArtifactoryPath
# API_KEY
path = ArtifactoryPath(
"http://my-artifactory/artifactory/myrepo/restricted-path", apikey="MY_API_KEY"
)
# Access Token
path = ArtifactoryPath(
"http://my-artifactory/artifactory/myrepo/restricted-path", token="MY_ACCESS_TOKEN"
)
# User and password OR API_KEY
path = ArtifactoryPath(
"http://my-artifactory/artifactory/myrepo/restricted-path",
auth=("USERNAME", "PASSWORD or API_KEY"),
)
# Other authentication types
from requests.auth import HTTPDigestAuth
path = ArtifactoryPath(
"http://my-artifactory/artifactory/myrepo/restricted-path",
auth=("USERNAME", "PASSWORD"),
auth_type=HTTPDigestAuth,
)
from requests.auth import HTTPBasicAuth
path = ArtifactoryPath(
"http://my-artifactory/artifactory/myrepo/restricted-path",
auth=("USERNAME", "PASSWORD"),
auth_type=HTTPBasicAuth,
)
# Load username, password from global config if exist:
path = ArtifactoryPath(
"http://my-artifactory/artifactory/myrepo/restricted-path",
auth_type=HTTPBasicAuth,
)
path.touch()
Artifactory SaaS
If you use Artifactory SaaS solution - use ArtifactorySaaSPath class.
SaaS supports all methods and authentication types as ArtifactoryPath. We have to use other class, because as a SaaS
service, the URL is different from an on-prem installation and the REST API endpoints.
from artifactory import ArtifactorySaaSPath
path = ArtifactorySaaSPath(
"https://myartifactorysaas.jfrog.io/myartifactorysaas/folder/path.xml",
apikey="MY_API_KEY",
)
Walking Directory Tree
Get directory listing:
from artifactory import ArtifactoryPath
path = ArtifactoryPath("http://repo.jfrog.org/artifactory/gradle-ivy-local")
for p in path:
print(p)
Find all .gz files in current dir, recursively:
from artifactory import ArtifactoryPath
path = ArtifactoryPath("http://repo.jfrog.org/artifactory/distributions/org/")
for p in path.glob("**/*.gz"):
print(p)
Downloading Artifacts
Download artifact to a local filesystem:
from artifactory import ArtifactoryPath
path = ArtifactoryPath(
"http://repo.jfrog.org/artifactory/distributions/org/apache/tomcat/apache-tomcat-7.0.11.tar.gz"
)
with path.open() as fd, open("tomcat.tar.gz", "wb") as out:
out.write(fd.read())
Downloading Artifacts in chunks
Download artifact to the local filesystem using chunks (in bytes) to prevent loading the entire response into memory at once. This can help with getting big files or resolve known issue
from artifactory import ArtifactoryPath
path = ArtifactoryPath(
"http://repo.jfrog.org/artifactory/distributions/org/apache/tomcat/apache-tomcat-7.0.11.tar.gz"
)
# download by providing path to out file and use default chunk 1024
path.writeto(out="tomcat.tar.gz")
# download and suppress progress messages
path.writeto(out="tomcat2.tar.gz", progress_func=None)
# download by providing out as file object and specify chunk size
with open("tomcat3.tar.gz", "wb") as out:
path.writeto(out, chunk_size=256)
# download and use custom print function
def custom_print(bytes_now, total, custom):
"""
Custom function that accepts first two arguments as [int, int] in its signature
"""
print(bytes_now, total, custom)
# since writeto requires [int, int] in its signature, all custom arguments you have to provide via lambda function or
# similar methods
path.writeto(
out="tomcat5.tar.gz",
progress_func=lambda x, y: custom_print(x, y, custom="test"),
)
Downloading Artifacts folder as archive
Download artifact folder to a local filesystem as archive (supports zip/tar/tar.gz/tgz) Allows to specify archive type and request checksum for the folder
Note: Archiving should be enabled on the server!
from artifactory import ArtifactoryPath
path = ArtifactoryPath(
"http://my_url:8080/artifactory/my_repo/winx64/aas", auth=("user", "password")
)
with path.archive(archive_type="zip", check_sum=False).open() as archive:
with open(r"D:\target.zip", "wb") as out:
out.write(archive.read())
# download folder archive in chunks
path.archive().writeto(out="my.zip", chunk_size=100 * 1024)
Uploading Artifacts
Deploy a regular file myapp-1.0.tar.gz. This method by default will calculate all available checksums and attach
them to the file
from artifactory import ArtifactoryPath
path = ArtifactoryPath(
"http://my-artifactory/artifactory/libs-snapshot-local/myapp/1.0"
)
path.mkdir()
path.deploy_file("./myapp-1.0.tar.gz")
Deploy artifacts from archive: this will automatically extract the contents of the archive on the server preserving the archive's paths
from artifactory import ArtifactoryPath
path = ArtifactoryPath(
"http://my-artifactory/artifactory/libs-snapshot-local/myapp/1.0"
)
path.mkdir()
path.deploy_file("./myapp-1.0.tar.gz", explode_archive=True)
Atomically deploy artifacts from archive: this will automatically extract the contents of the archive on the server preserving the archive's paths. This is primarily useful when you want Artifactory to see all the artifacts at once, e.g., for indexing purposes.
from artifactory import ArtifactoryPath
path = ArtifactoryPath(
"http://my-artifactory/artifactory/libs-snapshot-local/myapp/1.0"
)
path.mkdir()
path.deploy_file(
"./myapp-1.0.tar.gz", explode_archive=True, explode_archive_atomic=True
)
Deploy artifact by checksum: deploy an artifact to the specified destination by checking if the artifact content already exists i
