Technology · 2022年10月20日

在动态路径下如何从Artifactory上下载文件

一般来说,将文件保存在Artifactory上时需要选好repository和path。文件有变化的时候,通过LastModified之类的查询就可以在相同路径下获取到最新的文件。

但是我遇到的使用场景并不是这样 –

每次有新的build生成后,在构建path的时候都会把changelist作为一级目录放在path中间,也就是说,每次把文件放入Artifactory的时候,路径都是不一样的。

我几年前遇到这个问题的时候,是通过Artifactory的query来下载想要的文件的,比如:

https://<artifactory_server>/<repository_name>?download=build.product=<product_name>%7Cartifact.classifier=<classifier>%7Cbuild.type=<build_type>%7Cbuild.version=<build_version>

上述就是通过文件名称+一堆属性来定位要下载的文件的。

但是最近可能Artifactory升级了,或者Admin配置了仅允许静态下载,上述方法就失效了。(更新:后续发现使用Python依旧可以通过这种方法拿到文件)

查询了很多文档,都不满足我这个需求。直到我退而求其次,准备放弃直接下载而改成两步查询,即第一步先找到目标文件的静态路径,第二步再使用静态路径下载文件。

如何查询就变成了下一个问题,通过Artifactory的REST API文档,我发现了Pattern Search的功能:

Pattern Search

Description: Get all artifacts matching the given Ant path pattern
Since: 2.2.4
Notes: Requires Artifactory Pro. Pattern “**” is not supported to avoid overloading search results.
Security: Requires a privileged non-anonymous user.
Usage: GET /api/search/pattern?pattern=repo-key:this/is/a/*pattern*.war
Produces: application/json (application/vnd.org.jfrog.artifactory.search.PatternResultFileSet+json)
Sample Output:

GET /api/search/pattern?pattern=libs-release-local:killer/*/ninja/*/*.jar
{
    “repositoryUri” : “http://localhost:8081/artifactory/libs-release-local”,
    “sourcePattern” : “libs-release-local:killer/*/ninja/*/*.jar”,
    files : [
        “killer/coding/ninja/1.0/monkey-1.0.jar”,
        “killer/salty/ninja/1.5-SNAPSHOT/pickle-1.5-SNAPSHOT.jar”
    ]
}

通过Pattern Search功能,可以将动态变化的路径使用星号代替,包括文件名的全部或部分。尽管返回的结果是一个数组,但这对于编程来说都不是什么事儿了。

希望对有同样需求的人有所帮助。