Search code examples
azure-devopsazure-pipelinescicdazure-pipelines-yaml

Azure DevOps: passing runtime parameters for copy task (using conditional insert) - template expression


I'm defining these parameters in Azure_pipeline.yaml:

parameters:
- name: 'buildtype'
  default: entire
  type: string
  values:
  - entire
  - reduced

I've defined this copy task in task.yaml using the few other stages & jobs templates and parameters values:

steps:
- ${{ if eq(parameters.buildtype, 'entire') }}:
  - task: CopyFiles@2
    displayName: Deploy ${{ parameters.buildtype }} Build to ${{ parameters.deploymentFolder }}
    inputs:
      SourceFolder: $(Build.ArtifactStagingDirectory)/${{ parameters.appName }}
      Contents: |
                **
                !.config/**/*
      TargetFolder: ${{ parameters.deploymentFolder }}
      OverWrite: true
      flattenFolders: false
      enabled: true 
    
- ${{ if eq(parameters.buildtype, 'reduced') }}:
  - task: CopyFiles@2
    displayName: Deploy ${{ parameters.buildtype }} Build to ${{ parameters.deploymentFolder }}
    inputs:
      SourceFolder: $(Build.ArtifactStagingDirectory)/${{ parameters.appName }}
      Contents: |
                **
                !.config/**/*
                !$(Build.ArtifactStagingDirectory)/${{ parameters.appName }}/appsettings.Staging
      TargetFolder: ${{ parameters.deploymentFolder }}
      OverWrite: true
      flattenFolders: false
      enabled: true

From this task, I am trying to copy the required files to deployment folder, based on the Run time parameter values=entire/reduced name=buildtype. During the pipeline run, it's evaluating as "False".

I haven't shared the complete template and values due to restrictions.

Ref: Conditional insertion - Microsoft docs


Solution

  • You're referencing parameters buildtype, appName and deploymentFolder in your template (tasks.yaml) but you forgot to define them.

    Try the following:

    # task.yaml
    
    parameters:
      - name: 'buildtype'
        displayName: 'Build Type'
        type: string
    
      - name: 'appName'
        displayName: 'Application Name'
        type: string
    
      - name: 'deploymentFolder'
        displayName: 'Deployment Folder'
        type: string
    
    steps:
      - script: |
          echo "Deploying ${{ parameters.buildtype }} Build"
        displayName: 'Deploy ${{ parameters.buildtype }} Build'
    
      - ${{ if eq(parameters.buildtype, 'entire') }}:
        - task: CopyFiles@2
          displayName: Deploy ${{ parameters.buildtype }} Build to ${{ parameters.deploymentFolder }}
          inputs:
            SourceFolder: $(Build.ArtifactStagingDirectory)/${{ parameters.appName }}
            Contents: |
              **
              !.config/**/*
            TargetFolder: ${{ parameters.deploymentFolder }}
            OverWrite: true
            flattenFolders: false
            enabled: true 
          
      - ${{ if eq(parameters.buildtype, 'reduced') }}:
        - task: CopyFiles@2
          displayName: Deploy ${{ parameters.buildtype }} Build to ${{ parameters.deploymentFolder }}
          inputs:
            SourceFolder: $(Build.ArtifactStagingDirectory)/${{ parameters.appName }}
            Contents: |
              **
              !.config/**/*
              !$(Build.ArtifactStagingDirectory)/${{ parameters.appName }}/appsettings.Staging
            TargetFolder: ${{ parameters.deploymentFolder }}
            OverWrite: true
            flattenFolders: false
            enabled: true
    

    Using the template - example:

    # Azure_pipeline.yaml
    
    parameters:
      - name: 'buildtype'
        displayName: 'Build Type'
        type: string
        default: entire
        values:
        - entire
        - reduced
    
    trigger: none
    
    pool:
      vmImage: 'ubuntu-latest'
    
    steps:
      # other tasks here
    
      - template: task.yaml
        parameters:
          buildtype: ${{ parameters.buildtype }}
          appName: 'myapp'
          deploymentFolder: '/my/deployment/folder'