Предоставляет ли Azure DevOps постоянное хранилище для своих сборок? - PullRequest
1 голос
/ 03 октября 2019

Я хотел бы разработать сборку Azure DevOps, которая должна считывать некоторые данные, а после сборки обновлять эти данные. Мои параметры в настоящее время:

  1. Связать данные со сборкой как артефакт. Следующая сборка будет знать, что нужно искать предыдущую сборку для этого артефакта, и, таким образом, получит необходимые данные. Полагается на наличие предыдущей сборки, то есть, если кто-то случайно ее удалит - пуф. Кроме того, если кто-то ввинтит политику хранения - poof.
  2. Сохраните данные в виде файла в репозитории Git, будь то тот, который содержит сборку, или выделенный. - сборка должна будетподтолкнуть изменения к репо. В случае выделенного репо, придется также извлекать данные вручную.
  3. Выделенное хранилище где-то.

Я не особенно стремлюсь взломать мой путь с предметами(1) и (2). Пункт (3) кажется наиболее простым способом, но тогда я должен сохранить это отдельное хранилище. Даже если это простейшее хранилище больших двоичных объектов в Azure.

Есть ли лучший способ?

РЕДАКТИРОВАТЬ 1

Сканирование API-интерфейса REST AzOUR DevOpsдокументация, с которой я столкнулся - https://docs.microsoft.com/en-us/rest/api/azure/devops/build/properties?view=azure-devops-rest-5.1

Никогда не использовал ее раньше, но, похоже, она соответствует моим потребностям. Мне не нужно хранить много данных. Интересно, есть ли у кого-нибудь опыт работы со свойствами сборки и есть ли здесь какие-то ошибки?

РЕДАКТИРОВАТЬ 2

Мне нужно хранить менее 1 КБ текстовой информации. Я мог бы сохранить его в файле на общем диске, но тогда слишком много головной боли при обслуживании - нужно убедиться, что права доступа правильные и никто не удаляет этот файл.

В конце я решил сохранить информацию в определении разрабатываемой мной сборки, используя следующий код powershell:

$DefaultStateKey = "3edac6eed15745eb960e20b53e2bba68"

function ExtractValue($res, $StateKey)
{
    $res = $res.value.$StateKey.'$value'
    if ($res)
    {
        $res = $res | ConvertFrom-Json
    }
    $res
}

function Get-State(
    [Parameter(Mandatory)]$TfsProject,
    [Parameter(Mandatory)]$BuildDefId,
    [ValidateNotNullOrEmpty()]$StateKey = $DefaultStateKey)
{
    $url = "$TfsInstanceUrl/$TfsProject/_apis/build/definitions/$BuildDefId/properties?$TfsApiVersion-preview.1"
    ExtractValue $(Invoke-RestMethod $url -UseDefaultCredentials) $StateKey
}

function Set-State(
    [Parameter(Mandatory)]$TfsProject,
    [Parameter(Mandatory)]$BuildDefId,
    [Parameter(Mandatory)][AllowNull()]$value,
    [ValidateNotNullOrEmpty()]$StateKey = $DefaultStateKey)
{
    $url = "$TfsInstanceUrl/$TfsProject/_apis/build/definitions/$BuildDefId/properties?$TfsApiVersion-preview.1"
    $Body = @{
        path = "/$StateKey"
    }
    if ($null -eq $value)
    {
        $Body.op = 'Remove'
    }
    else
    {
        $Body.op = 'Add'
        $Body.value = $value | ConvertTo-Json    
    }
    $Body = $Body | ConvertTo-Json -Compress
    ExtractValue $(Invoke-RestMethod $url `
        -UseDefaultCredentials `
        -Method Patch `
        -ContentType "application/json-patch+json" `
        -Body "[$Body]") $StateKey
}
...