Artifactory and Jenkins - получить файл с новым / самым большим пользовательским свойством - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть generi c хранилище "my_repo". Я загрузил туда файлы из jenkins с путями, такими как my_repo / branch_buildNumber / package.tar.gz, и с пользовательским свойством "tag", например, "1.9.0", "1.10.0" и c. Я хочу получить элемент / файл с последним / самым новым тегом.

Я пытался изменить Пример 2 по этой ссылке ... https://www.jfrog.com/confluence/display/JFROG/Using+File+Specs#UsingFileSpecs -Примеры

.. ... и добавьте сортировку и ограничьте способ, которым это было сделано здесь ... https://www.jfrog.com/confluence/display/JFROG/Artifactory+Query+Language#ArtifactoryQueryLanguage -limitDisplayLimitsandPagination

Но я получаю ошибку "unknown property des c".

jenkins code

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Плагин Jenkins Artifactory, как и большинство клиентов JFrog, поддерживает спецификации файлов для загрузки и выгрузки общих c файлов. Схема File Specs описана здесь . При создании файла Spe c для загрузки файлов у вас есть возможность использовать свойство «pattern», которое может включать подстановочные знаки. Например, следующая инструкция c загружает все zip-файлы из репозитория my-local-repo в локальный каталог froggy:

{
    "files": [
        {
            "pattern": "my-local-repo/*.zip",
            "target": "froggy/"
        }
    ]
}

В качестве альтернативы вы можете использовать «aql» вместо «pattern» , Следующая инструкция c обеспечивает тот же результат, что и предыдущая:

{
  "files": [
    {
      "aql": {
        "items.find": {
          "repo": "my-local-repo",
          "$or": [
            {
              "$and": [
                {
                  "path": {
                    "$match": "*"
                  },
                  "name": {
                    "$match": "*.zip"
                  }
                }
              ]
            }
          ]
        }
      },
      "target": "froggy/"
    }
  ]
}

Допустимый синтаксис AQL в спецификации файлов не включает в себя все, что допускает язык запросов артефактов. Например, вы не можете использовать предложения «include» или «sort». Эти ограничения были введены, чтобы сделать структуру ответа известной и постоянной.

Однако сортировка по-прежнему доступна в спецификациях файлов, независимо от того, выберете ли вы «шаблон» или «aql». Поддерживается выбрасывать свойства File Spe c «sortBy», «sortOrder», «limit» и «offset». Например, следующий файл Spe c загрузит только 3 самых больших файла zip-файла:

{
  "files": [
    {
      "aql": {
        "items.find": {
          "repo": "my-local-repo",
          "$or": [
            {
              "$and": [
                {
                  "path": {
                    "$match": "*"
                  },
                  "name": {
                    "$match": "*.zip"
                  }
                }
              ]
            }
          ]
        }
      },
      "sortBy": ["size"],
      "sortOrder": "desc",
      "limit": 3,
      "target": "froggy/"
    }
  ]
}

И вы можете сделать то же самое с "pattern" вместо "aql":

{
  "files": [
    {
      "pattern": "my-local-repo/*.zip",
      "sortBy": ["size"],
      "sortOrder": "desc",
      "limit": 3,
      "target": "local/output/"
    }
  ]
}

Подробнее о спецификациях файлов можно прочитать здесь .

(ответив на этот вопрос, мы также обновили документацию по спецификациям файлов с этими примерами).

0 голосов
/ 09 апреля 2020

После многих испытаний и экспериментов я обнаружил, что есть много способов решения моей основной проблемы (получение последней версии пакета), но каждый из них требует определенной функции, которая доступна в платной версии. Как sort () в AQL или [RELEASE] в REST API. Но я обнаружил, что все еще могу получить JSON с полным списком файлов и его свойств. Я также могу скачать каждый отдельный файл. Это привело меня к решению с простым python сценарием. Я не могу опубликовать sh целом, но только ядро, которое должно быть довольно очевидным

import requests, argparse
from packaging import version

...

query="""
items.find({
  "type" : "file",
  "$and":[{
    "repo" : {"$match" : \"""" + args.repository +  """\"}, 
    "path" : {"$match" :  \"""" + args.path +  """\"} 
    }]
}).include("name","repo","path","size","property.*")
"""       
auth=(args.username,args.password) 


def clearVersion(ver: str):
    new = ''
    for letter in ver:
        if letter.isnumeric() or letter == ".":
            new+=letter
    return new

def lastestArtifact(response: requests):
    response = response.json()
    latestVer = "0.0.0"
    currentItemIndex = 0
    chosenItemIndex = 0
    for results in response["results"]:
        for prop in results['properties']:
            if prop["key"] == "tag":
                if version.parse(clearVersion(prop["value"])) > version.parse(clearVersion(latestVer)):
                    latestVer = prop["value"]
                    chosenItemIndex = currentItemIndex 
        currentItemIndex += 1
    return response["results"][chosenItemIndex]

req = requests.post(url,data=query,auth=auth)
if args.verbose:
    print(req.text)

latest = lastestArtifact(req)
...

Я просто хочу отметить, что ЭТО НЕ ПОСТОЯННОЕ решение. Мы просто не хотели покупать лицензию только из-за одной проблемы. Но если таких проблем будет больше, мы обязательно купим подписку PRO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...