Azure DevOps 如何在发布构建管道后在输出(放置)文件夹中获取文件名

Azure DevOps how to get file name in output (drop) folder after publishing build pipeline

我正在使用 Azure DevOps 构建一个 python 轮子。我想让它尽可能通用,这样团队中的每个人都可以使用相同的管道来构建自己的 python 轮子并将它们部署在某个数据块工作区中。为此,我需要知道构建管道输出中文件的名称,以便在我的发布管道中使用它。

目前在这种情况下,文件是一个 python 轮子,保存在构建管道输出中。我在我的管道 yaml 中使用以下代码在构建管道输出和 Azure 工件提要中发布它。

- task: PublishBuildArtifacts@1
  inputs:
      pathToPublish: '$(Build.ArtifactStagingDirectory)'
      artifactName: dfordbx

- task: UniversalPackages@0
  displayName: Publish
  inputs:
    command: publish
    publishDirectory: $(Build.ArtifactStagingDirectory)/dist/
    vstsFeedPublish: 'MyProject/py_artifacts_1732'
    vstsFeedPackagePublish: $(packageBuildName)

build pipeline 运行结束后,dist文件夹中有一个wheel文件。我需要得到这个轮子的名字。对于我自己的代码,我当然知道名字。但是当其他人 运行 管道用于他们的代码时,我不清楚这一点。我需要在我的发布管道中获得这个名称。

换句话说,我正在我的 yaml 文件中寻找一种方法来获取以下结构中的“py_sample_package-0.6.5-py3-none-any.whl”名称:

通过选择已发布的工件:

获取文件:

突出显示的部分是我需要进入管道的部分。谢谢。

经典发布管道

在经典发布管道中,您引用构建工件并将其用作触发器。工件下载到 $(System.DefaultWorkingDirectory)$(Build.DefinitionName).

要识别工件中的 .whl 文件,请将 powershell 脚本添加到您的发布管道中,以识别文件并使用 ##vso 日志语法创建新变量...

例如:

# find the first .whl file in the artifact folder
$whlFile = Get-ChildItem `
              -Filter *.whl `
              -Path "$(System.DefaultWorkingDirectory)$(Build.DefinitionName)\dfordbx" |
           ForEach-Object { $_.fullname } |
           Select-Object -First 1
        
# create a variable with the full path to the file
Write-Host "##vso[task.setvariable variable=whlFile]$whlFile"

现在您可以像使用任何其他定义的管道变量一样使用该变量$(whlFile)

Multi-Stage YAML 管道

如果您正在使用 multi-stage YAML 管道并且需要在阶段之间使用工件,您不能假设该文件将出现在机器上,因为每个作业都可能 运行 在不同的机器上。您需要在作业开始时下载工件。

variables:
- artifactName: dfordbx

stages:
- stage: build
  jobs:
  - job: buildJob
    steps: 
    - task: PublishPipelineArtifact@1
      inputs:
        targetPath: '$(Build.ArtifactStagingDirectory)'
        artifactName: $(artifactName)
        artifactType: 'pipeline'
    
    # or use the 'publish' alias
    - publish: '$(Build.ArtifactStagingDirectory)'
      artifact: '$(artifactName)'
 

- stage: deploy
  dependsOn: build
  condition: success('build')
  jobs:
  - job: deployJob
    steps:
    - task: DownloadPipelineArtifact@1
      inputs:
        source: 'current'
        artifact: $(artifactName)
        path: '$(Pipeline.Workspace)/$(artifactName)'
    
    # or use the 'download' alias
    - download: current
      artifact: $(artifactName)

    - pwsh: |
        $whlFile = Get-ChildItem -Path "$(Pipeline.Workspace)/$(artifactName)" -Filter *.whl |
                   ForEach-Object { $_.fullName } |
                   Select-Object -First 1
        Write-Host "##vso[task.setvariable variable=whlFile]$whlFile"