Артефактный поиск AQL для сборок на promo.status

Я пытаюсь использовать AQL, чтобы получить список всех сборок, не повышенных до "релиза".

Наши двоичные файлы проходят через интеграцию статуса -> aat -> release. Я хочу получить список тех, кто имеет интеграцию статуса продвижения и 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
}

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)

То, что вы пытаетесь сделать, это запросить у Artifactory "самый последний" статус сборки и выполнить фильтрацию на основе этого. Однако это не то, как Artifactory обрабатывает ваш AQL-запрос.

Обратите внимание, что ваша сборка не имеет свойства "build.promotion.status". Вместо этого ваша сборка имеет свойство типа array с именем build.promotions. В этом массиве для вашей сборки может быть установлено любое количество элементов истории продвижения, включая свойство "build.promotion.status".

Теперь предположим, что ваш AQL-запрос выберет сборки, имеющие "build.promotion.status": "aat", то, что вы на самом деле просите Artifactory, это: пожалуйста, верните любую сборку, для которой есть любой из элементов массива build.promotions соответствующее свойство "build.promotion.status": "aat".

Таким образом, несмотря на то, что сборка #2551 в вашем примере была повышена с "aat" до "выпущена", вы спрашиваете AQL, имел ли он - в любой момент времени - статус продвижения "aat", что он и сделал.

Чтобы добавить к путанице, когда вы включаете ("promo.status"), вы увидите отфильтрованное подмножество элементов истории продвижения.

Если вы пытаетесь обойти это, задавая обратный вопрос: в каких сборках отсутствует элемент истории состояния сборки с build.promotion.status "=" release ", даже если это возможно с AQL, это не будет скажу вам, каков текущий статус. И не будет работать правильно, если вы построите когда-либо "Откат".

Я думаю, что JFROG должен на самом деле ввести поле "build.promotion.status", которое делает то, что люди ожидают разумно: дать вам текущий статус для отображения и запроса. До этого времени единственное решение, которое я могу придумать, - это извлечь все элементы продвижения сборки, а затем сделать магию на языке более высокого порядка.

Другие вопросы по тегам