Артефактный поиск 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", которое делает то, что люди ожидают разумно: дать вам текущий статус для отображения и запроса. До этого времени единственное решение, которое я могу придумать, - это извлечь все элементы продвижения сборки, а затем сделать магию на языке более высокого порядка.