Artifactory AQL-поиск сборок на Promotion.status

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

Наши бинарники проходят через статус интеграции->аат->релиз Я хочу получить список тех, у кого есть статус интеграции и атта, но не релиз.

Один пример сборки имеет статусы:

"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"}}

to

{"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
}

person Christer Eriksson    schedule 04.01.2017    source источник


Ответы (2)


Если вам не нужно использовать подстановочные знаки с $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)
person Dror Bereznitsky    schedule 04.01.2017
comment
Теперь я попробовал ваши предложения, но проблема заключается в том, что сборка совпадает как при использовании выпуска $ne, так и при выпуске $nmatch, даже если сборка имеет выпуск Promotion.status. Я предполагаю, что проблема заключается в том, что у нас есть массив с разными статусами продвижения, и я не знаю, как использовать AQL, чтобы определить, не содержит ли массив статус. - person Christer Eriksson; 05.01.2017

То, что вы пытаетесь сделать, это запросить у 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" = "выпущено", даже если это было бы возможно с AQL, он не скажет вам, каков текущий статус. Это также не будет работать правильно, если вы когда-либо строите «Откат».

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

person Sander F    schedule 23.05.2019