Artifactory AQL在promotion.status

时间:2017-01-04 13:47:46

标签: search artifactory artifactory-query-lang

我尝试使用AQL获取所有未升级为"发布"的构建列表。

我们的二进制文件通过状态集成 - > aat - >发布 我想获得一个列表,其中包含促销状态集成和aat但不发布。

构建的一个示例具有状态:

"statuses" : [ {
  "status" : "integration",
  "timestamp" : "2016-04-20T08:36:42.009+0000",
  "user" : "user",
  "ciUser" : "changes",
  "timestampDate" : 1461141402009
}, {
  "status" : "aat",
  "repository" : "repo-aat",
  "timestamp" : "2016-04-20T08:56:11.843+0000",
  "user" : "user",
  "ciUser" : "changes",
  "timestampDate" : 1461142571843
}, {
  "status" : "aat",
  "repository" : "repo-aat",
  "timestamp" : "2016-04-20T08:58:55.417+0000",
  "user" : "user",
  "ciUser" : "changes",
  "timestampDate" : 1461142735417
}, {
  "status" : "aat",
  "repository" : "repo-aat",
  "timestamp" : "2016-04-20T09:20:32.619+0000",
  "user" : "user",
  "ciUser" : "changes",
  "timestampDate" : 1461144032619
}, {
  "status" : "release",
  "repository" : "repo-release",
  "timestamp" : "2016-04-20T09:30:12.143+0000",
  "user" : "user",
  "ciUser" : "changes",
  "timestampDate" : 1461144612143
}, {
  "status" : "release",
  "repository" : "repo-release",
  "timestamp" : "2016-04-20T09:40:50.595+0000",
  "user" : "admin",
  "ciUser" : "changes",
  "timestampDate" : 1461145250595
} ],

无论我们设置如何,都会匹配此版本:

{"promotion.status": {"$nmatch":"aat"}}

{"promotion.status": {"$nmatch":"release"}}
{"promotion.status": {"$nmatch":"integration"}}

请求:

builds.find({
  "$and" : [
  {"name": {"$match": "test"}},
  {"created": {"$lt": "2016-12-01"}},
  {"promotion.status": {"$nmatch":"release"}}
  ]
}).include("promotion.status").limit(10)

我们得到了这样的答复:

{
"results" : [ {
  "build.created" : "2016-04-20T10:12:46.905Z",
  "build.created_by" : "test",
  "build.modified" : "2016-04-20T11:45:12.309Z",
  "build.modified_by" : "admin",
  "build.name" : "user",
  "build.number" : "2551",
  "build.promotions" : [ {
    "build.promotion.status" : "aat"
  }, {
    "build.promotion.status" : "integration"
  } ],
  "build.url" : "URL"
} ],
"range" : {
  "start_pos" : 0,
  "end_pos" : 1,
  "total" : 1,
  "limit" : 10
}

2 个答案:

答案 0 :(得分:1)

如果您不需要在$nmatch中使用通配符,则可以改为使用$ne,例如:

builds.find({
  "$and" : [
  {"name": {"$match": "test"}},
  {"created": {"$lt": "2016-12-01"}},
  {"promotion.status": {"$ne":"release"}}
  ]
}).include("promotion.status").limit(10)

使用$nmatch,以下内容也可以使用:

builds.find({
  "$and" : [
  {"name": {"$match": "test"}},
  {"created": {"$lt": "2016-12-01"}},
  {"promotion.status": {"$nmatch":"releas*"}}
  ]
}).include("promotion.status").limit(10)

答案 1 :(得分:1)

您想要做的是向Artifactory询问构建的“最新”状态,并根据该状态进行过滤。但是,Artifactory并不是这样对待您的AQL查询的。

请注意,您的构建没有属性“ build.promotion.status”。相反,您的构建具有名称为“ build.promotions”的类型为array的属性。在此阵列中,可以为您的构建设置任何数量的促销历史记录项目,包括属性“ build.promotion.status”。

现在假设您的AQL查询将选择具有“ build.promotion.status”:“ aat”的版本,那么您真正要问的Artifactory是:请返回任何包含该版本任何元素的版本。 Promotions数组具有匹配的属性“ build.promotion.status”:“ aat”。

因此,即使示例中的版本#2551已从“ aat”升级为“发布”,您仍要询问AQL,它在任何时候是否具有升级状态“ aat”。 / p>

更令人困惑的是,当您包含(“ promotion.status”)时,您将看到促销历史记录项目的过滤子集。

如果您尝试通过提出以下相反的问题来解决此问题:哪个版本没有任何带有“ build.promotion.status” =“已发布”的版本状态历史记录项目,即使使用AQL可以做到这一点,它不会告诉您当前的状态。如果您构建的版本“回滚”,也将无法正常工作。

我认为JFROG实际上应该引入一个“ build.promotion.status”字段,该字段可以满足人们的合理期望:为您提供要显示和查询的当前状态。在那之前,我唯一想到的解决方案是获取所有构建升级项目,然后以更高阶的语言进行处理。