Скачивание артефакта конвейера из другого конвейера Azure

Я новичок в этом конвейере и пытаюсь создать автоматизированный способ создания установочного файла .msi для своего приложения.

У меня есть 2 проекта .Net Core и Python, поэтому я создал 2 конвейера. Конвейер .Net Core будет создавать и сохранять файлы в определенном месте, а конвейер Python использует эти файлы (из местоположения) для своей зависимости и создает новый файл .msi, последняя часть в конвейере newsetup.py создает .msi, к которому я буду передача расположения выходных файлов конвейера .Net Core.

Я получаю ошибку Artifact dropcli was not found for build 150..

Сценарий конвейера .Net Core:

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation = "$(Build.ArtifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath = "Default Web Site"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
    
- task: PublishPipelineArtifact@1
  inputs:
   targetPath: '$(Pipeline.Workspace)'
   artifact: 'dropcli'
   publishLocation: 'pipeline'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

Скрипт конвейера Python:

- task: DownloadPipelineArtifact@2
  inputs:
    buildType: 'current'
    artifactName: 'dropcli'
    targetPath: '$(Pipeline.Workspace)'

- task: PythonScript@0
  inputs:
    scriptSource: 'filePath'
    scriptPath: 'src/python/newsetup.py'
    arguments: 'bdist_msi $(Pipeline.Workspace)'

Также, если я где-нибудь укажу номер сборки, не возникнет ли проблема при создании нового конвейера? Или это ограничение?

Заранее спасибо.

Каждый конвейер должен использовать свой собственный $ (Pipeline.Workspace), поэтому вам нужно использовать общую папку вроде $ (System.DefaultWorkingDirectory) или что-нибудь еще для публикации и загрузки артефактов. Также добавьте номер сборки к имени вашего артефакта.

Juanma Feliu 06.04.2021 13:31
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
1
38
2

Ответы 2

В вашей задаче DownloadPipelineArtifact@2 значение buildType равно current. Это означает, что вы загружаете артефакт в текущем прогоне. Вы должны установить buildType на specific. Вот пример загрузки последнего артефакта из определенного конвейера:

- task: DownloadPipelineArtifact@2
  inputs:
    buildType: 'specific'
    project: '{project id}'
    definition: '{pipeline id}'
    buildVersionToDownload: 'latest'
    artifactName: 'dropcli'
    targetPath: '$(Pipeline.Workspace)'

Вы можете нажать «Настройки» в верхней части задачи, это поможет вам легче выполнить вашу задачу.

Щелкните Скачать задачу "Артефакты конвейера" для получения подробной информации об аргументах этой задачи.

If i specify the build number somewhere won't it be an issue when a new pipeline is created? Or is that an limitation?

Как упоминалось выше, вам не нужно указывать номер сборки, вам нужно указать идентификатор определения конвейера. Вы можете загрузить последний артефакт конвейера или артефакт конкретной сборки конвейера.

В качестве обходного пути мы можем загрузить указанный артефакт через REST API

GET https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}/artifacts?artifactName = {artifactName}&api-version=6.1-preview.5

Добавьте оболочку task-Power и добавьте следующий скрипт:

$outfile = "$(System.ArtifactsDirectory)\{artifact name}.zip"
$connectionToken = "{pat}"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))

#Get download artifact url
$GetArtifactURL = "GET https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}/artifacts?artifactName = {artifactName}&api-version=6.1-preview.5"
$GetArtifactResult = Invoke-RestMethod -Uri $GetArtifactURL -Headers @{Authorization = "Basic {0}" -f $base64AuthInfo} -Method get 

#download artifact zip file to outfile path
$DownloadArtifactURL = $GetArtifactResult.resource.downloadUrl
$DownloadArtifact = Invoke-RestMethod -Uri $DownloadArtifactURL -Headers @{authorization = "Basic $base64AuthInfo"} -Method Get –OutFile $outfile

Затем добавьте задачу Extract files, чтобы распаковать файл артефакта и использовать его в python script.

Другие вопросы по теме