Из-за использования плавающих версий в тегах PackageReference любые проекты, которые зависят от этих пакетов, будут автоматически вытаскивать самую новую версию, когда они построены в своих соответствующих конвейерах. в корзину. В случае критического изменения, обнаруженного после sh, мы всегда можем восстановить предыдущую версию фида. Учитывая, что этот процесс используется исключительно для наших более чем 50 внутренних пакетов с собственными процессами тестирования, он определенно кажется безопасным путем к go и гораздо более эффективным, чем любой другой вариант, который я могу найти. Однако я не думаю, что отмечу это как окончательный ответ на вопрос, потому что он все еще кажется немного взломанным, и я бы предпочел, чтобы существовала законная возможность принудительно установить новейшие версии в Azure NuGetCommand@2 задача. Код
Как уже упоминалось, я использовал хорошо документированный REST API Azure для этих функций, особенно в областях, управляющих артефакты . Хотя есть страница, посвященная удалению пакета из канала NuGet, я не смог заставить их спецификацию работать. В итоге я проверил вызовы, сделанные из пользовательского интерфейса, и скопировал их, все еще используя свой собственный токен для аутентификации. Этот метод выполняет «обрезку» истории, в которой я нуждался:
public void TrimPackageFeed(string feedName, string packageName)
{
var packageVersions = GetPackageVersions(feedName, packageName);
var deprecated = packageVersions.Where(x => !x.IsLatest && !x.IsDeleted)?.ToList();
if (deprecated != null && deprecated.Any())
{
foreach (var version in deprecated)
{
var url = $"{version.Links.Feed.Value.Replace("feeds.dev.azure.com", "pkgs.dev.azure.com")}/nuget/packagesBatch";
var payload = new AzurePackagePayload
{
Data = null,
Operation = 2,
Packages = new List<AzurePackagePayloadItem>
{
new AzurePackagePayloadItem
{
ID = packageName,
Version = version.Version
}
}
};
ApiRequest(url, Method.POST, null, JsonConvert.SerializeObject(payload));
}
}
}
Я построил это как приложение командной строки. NET Core 3.1, опубликованное как автономный исполняемый файл в нашем репозитории сборки. Я использовал C#, потому что он мне наиболее знаком, но я уверен, что его можно написать на любом языке (возможно, даже на PowerShell). Затем я добавил следующую задачу в конец моего определения конвейера YAML:
- task: CmdLine@2
condition: and(succeeded(), eq(variables['ModifiedProject'], 'true'))
displayName: 'Trim package feed'
inputs:
script: |
AzureApiClient -action trim-package-feed -feed FeedNameHere -package $(ModifiedProject.AssemblyName)
workingDirectory: 'Azure\AzureApiClient\Output'
failOnStderr: true
Пакет помещается в канал, затем имя сборки передается моему клиенту API, который обрезает исторические версии и оставляет для восстановления доступна только новая версия.