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

Time:02-17

I am using Azure DevOps to build a python wheel. I want to make it as generic as possible so that everyone in the team can use the same pipeline to build their own python wheels and deploying them in some databricks workspace. For that I need to know what the name of the file(s) in build pipeline output is to use it in my release pipeline.

Currently in this case the file is a python wheel saved in build pipeline output. I am using the following code in my pipeline yaml to publish it both at build pipeline output and an Azure artifact feed.

- 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)

After build pipeline run ends, there is one wheel file in dist folder. I need to get the name of this wheel. For my own code, I of course know the name. But when others run the pipeline for their code, this is not clear to me. I require to get this name in my release pipeline.

In other words, I am looking for a way in my yaml file to get "py_sample_package-0.6.5-py3-none-any.whl" name in the following structure:

By choosing published artifact:

enter image description here

Getting to the file:

enter image description here

The highlighted part is what I need to get in pipeline. Thank you.

CodePudding user response:

Classic Release Pipelines

In a Classic Release pipeline, you reference a build artifact and use it as a trigger. Artifacts are downloaded to $(System.DefaultWorkingDirectory)\$(Build.DefinitionName).

To identify the .whl file in the artifact, add a powershell script into your release pipeline that identifies the file and creates a new variable using the ##vso logging syntax...

For example:

# 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"

Now you can use the variable like any other defined pipeline variable $(whlFile)

Multi-Stage YAML Pipelines

If you're using a multi-stage YAML pipeline and need to use the artifact between stages, you can't assume that the file will be present on the machine because each job is potentially running on a different machine. You will need to download the artifact at the start of the job.

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"
  • Related