一般来说,将文件保存在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功能,可以将动态变化的路径使用星号代替,包括文件名的全部或部分。尽管返回的结果是一个数组,但这对于编程来说都不是什么事儿了。
希望对有同样需求的人有所帮助。
