azure-devopsazure-pipelines-yamlazure-pipelines-tasks

CopyFiles Task not picking up files


Using Azure DevOps YAML in a database project build and release pipeline

This bit of code correctly picks up my four dacpac files, I can see these being copied in the console

    - task: CopyFiles@2
      displayName: Copy build output to artifacts staging
      inputs:
        SourceFolder: "$(Build.SourcesDirectory)"
        flattenFolders: true
        Contents: '**\bin\**\*.dacpac'
        TargetFolder: "$(Build.ArtifactStagingDirectory)"

This bit of code correctly picks up my publish files, I can see these being copied in the console

    - task: CopyFiles@2
      displayName: Copy build output to artifacts staging
      inputs:
        SourceFolder: "$(Build.SourcesDirectory)"
        flattenFolders: true
        Contents: '**\PublishProfile\*.publish.xml'
        TargetFolder: "$(Build.ArtifactStagingDirectory)"

This bit of code reports "zero files found"

    - task: CopyFiles@2
      displayName: Copy build output to artifacts staging
      inputs:
        SourceFolder: "$(Build.SourcesDirectory)"
        flattenFolders: true
        Contents: |
          '**\bin\**\*.dacpac'
          '**\PublishProfile\*.publish.xml'
        TargetFolder: "$(Build.ArtifactStagingDirectory)"

This pipe multiline syntax is all over the examples https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/copy-files?view=azure-devops&tabs=yaml#examples

I've also used Get-ChildItem to doubly confirm that the files exist.

It seems like | / multiline doesn't work as described.


Solution

  • As usual, as I write this I checked in detail and the one difference between my code and the example was single quotes.

    So it works if you remove single quotes.

    Does anyone even QA this stuff?

        - task: CopyFiles@2
          displayName: Copy build output to artifacts staging
          inputs:
            SourceFolder: "$(Build.SourcesDirectory)"
            flattenFolders: true
            Contents: |
              # NOTE THESE PATHS ARE NOT SURROUNDED BY SINGLE QUOTES
              # EVEN THOUGH THIS WORKS IN THE SINGLE LINE VERSION
              **\bin\**\*.dacpac
              **\PublishProfile\*.publish.xml
            TargetFolder: "$(Build.ArtifactStagingDirectory)"
    

    Other hot tips to save you hours:

    This code makes all the variables in the variable group TST available (these are under "Library" not "Environment" - go figure)

    variables:
    - group: TST
    

    This code (with extra indentation) doesn't throw an error or give any clues, it just doesn't make any variables available. All your variables like $(MyVariable) will be treated as literals

    variables:
      - group: TST