1

我正在尝试使用 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
}
4

2 回答 2

1

您要做的是向 Artifactory 询问构建的“最新”状态,并根据该状态进行过滤。然而,这不是 Artifactory 处理 AQL 查询的方式。

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

现在假设您的 AQL 查询将选择具有“build.promotion.status”:“aat”的构建,您真正要求 Artifactory 是这样的:请返回 build.promotions 数组的任何元素具有的任何构建匹配属性“build.promotion.status”:“aat”。

因此,即使您示例中的构建 #2551 已从“aat”升级为“已发布”,您仍会询问 AQL 是否(在任何时间点)具有升级状态“aat”,它确实如此。

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

如果您试图通过询问相反的问题来解决此问题:哪些构建没有任何带有 "build.promotion.status" = "released" 的构建状态历史记录项,即使 AQL 可以做到这一点,它也不会告诉你目前的状态是什么。如果您构建的是“回滚”,它也不会正常工作。

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

于 2019-05-23T20:00:17.357 回答
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)
于 2017-01-04T20:18:19.603 回答