Я пытаюсь опубликовать некоторые файлы как артефакты сборки в конвейере сборки Azure DevOps с помощью PowerShell, используя эту документацию:
Моя powershell выглядит так:
$url = "https://dev.azure.com/<org>/<project>/_apis/build/builds/<buildId>/artifacts?api-version=7.2-preview.5"
$body = @{
name = 'testpublish'
resource = @{
data = "./testfolder/*"
type = "filepath"
}
}
$headers = @{
'Authorization' = "Basic " + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":<pat>"))
'Content-Type' = 'application/json'
}
$response = Invoke-RestMethod -Uri $url -Method Post -Headers $headers -Body $body
однако я получаю сообщение об ошибке:
Invoke-RestMethod:
{
"$id": "1",
"innerException": null,
"message": "TF400898: An Internal Error Occurred.",
"typeName": "Newtonsoft.Json.JsonReaderException, Newtonsoft.Json",
"typeKey": "JsonReaderException",
"errorCode": 0,
"eventId": 0
}
Может ли кто-нибудь указать мне на правильный синтаксис и сообщить, если я что-то упускаю?





Похоже, вы пытаетесь загрузить папку в агент сборки как артефакт конвейера. Сообщение об ошибке, которое вы получаете, скорее всего, связано с неправильными входными данными type и data. Однако, если вы остановитесь и подумаете об этом как о REST API, в котором локальный компьютер взаимодействует с удаленным сервером, внутренний сервер не будет иметь ни малейшего представления о том, что означает ".\testfolder\*", так что это может быть не то, что вы ищете.
Эта конечная точка REST API подойдет, если вы хотите связать артефакт предыдущей сборки с новой сборкой или если у вас где-то размещен zip-файл, и вы хотите добавить ссылку из вашей сборки на этот загружаемый артефакт. В этом примере использования подразумеваются некоторые подсказки .
Вот несколько лучших альтернатив:
Синтаксис ведения журнала: ваш сценарий PowerShell может генерировать специальный оператор журнала, который агент сборки может обрабатывать как команду загрузки файла: ##vso[artifact.upload ...]<file>
Задача публикации артефакта: вместо использования задачи PowerShell для загрузки файлов используйте задачу PublishArtifactTask@1
- task: PublishArtifactTask@1
inputs:
targetPath: $(Pipeline.Workspace)/testfolder
artifact: testpublish
Если вы настроены на программное использование API, вам придется немного покопаться. И команды ведения журнала, и PublishArtifactTask используют внутренние плагины в exe-файле агента сборки. Репозитории для этого находятся не в GitHub, но вы можете настроить агент сборки локально, а затем декомпилировать Agents.Plugins.dll, чтобы увидеть, как они загружаются в хранилище Azure, и использовать REST API, чтобы связать артефакт с вашей сборкой.
Я могу воспроизвести ту же ошибку с вашим скриптом. Вам необходимо преобразовать формат $body в json.
$body = @{
name = 'testpublish'
resource = @{
data = "./testfolder/*"
type = "filepath"
}
} | ConvertTo-Json
Однако остальные API, на которые ссылается associate an artifact with a build, используются для сценария, приведенного выше, созданный артефакт not на самом деле будет иметь любой контент, поскольку ваши данные не имеют общего пути.
Если вы создаете артефакт сборки из build pipeline, рекомендуется использовать существующую задачу PublishPipelineArtifact@1 или PublishBuildArtifacts@1 или команду регистрации:
##vso[artifact.associate type=filepath;artifactname=MyFileShareDrop]\\MyShare\MyDropLocation
Если они не соответствуют требованию, вместо этого вы можете использовать Azure CLI, содержимое будет содержаться в артефакте, и команда также может выполняться local machine.
- powershell: |
az pipelines runs artifact upload --artifact-name newtestpublish --path "testfolder" --run-id 5995 --org https://dev.azure.com/{orgname} --project {projectname}
env:
AZURE_DEVOPS_EXT_PAT: $(pat)
С локальной машины: