azureazure-devopsazure-pipelines

Unable to locate executable file: 'bash'. Please verify either the file path exists


I was getting below error on using a self hosted windows agent.

##[error]Unable to locate executable file: 'bash'. Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also verify the file has a valid extension for an executable file.

How do I add a Task or stage in below mentioned pipeline to resolve this error by adding this path : C:\Program Files\Git\bin

Here's my Pipeline -

resources:
  pipelines:
  - pipeline: xxx
    source: xxx
    project: xxx
    trigger:
      stages:
      - Deploy_xxx
      xxx

variables:
- name: dashboardFileDirectory
  value: "C:\\Users\\svcAzurexxx\\test-team-xxxfiles"
- name: setJava
  value: "false"

stages:
- stage: Test1 #no whitespace
  displayName: xxx
  jobs:
    - job: BuildAndTest
      pool: 
       name: "Test"
      displayName: 'Build and Test'
      steps:
      - template: templates/test- Automation.yml
        parameters:
          mvnCommand: mvn clean test  Automation"
          pipelineArtifactName:  Automation-API
      - bash: |
          echo "##vso[task.setvariable variable= Automation-API-outcome;isOutput=true]$(result)"
        name: outputForDashboard
        condition: always()

    # run the report creation in a new job on microsoft hosted agents
    - job: allureReport
      pool: "Azure Pipelines"
      dependsOn: BuildAndTest
      condition: always()
      steps:
      - template: templates/ Automation.yml
        parameters:
          pipelineArtifactName:  Automation-API
          reportName:  Automation-Test-Report    

- stage: SaveDetailsForDashboard
  displayName: Save details for dashboard
  pool: "Test Automation"
  dependsOn:
    - Test1
  condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
  jobs:
    - job: SaveDetails
      displayName: Save details
      variables:
         Automation-API-outcome: $[stageDependencies.Test1.BuildAndTest.outputs['outputForDashboard. Automation-API-outcome']]
      steps:
      - task: PowerShell@2
        inputs:
          targetType: 'inline'
          script: |
            echo "$( Automation-API-outcome)" | Out-File -FilePath $(dashboardFileDirectory)\ Automation-API-outcome

Updated Pipeline which threw a new error -

resources:
  pipelines:
  - pipeline: XYZ-deploy
    source: XYZ Deploy
    project: XYZ
    trigger:
      stages:
      - Deploy_  prod
   
variables:
- name: dashboardFileDirectory
  value: "C:\\Users\\svcAzurdsdsdt\\dsdsd"
- name: setJava
  value: "false"

stages:
- stage: Test1 #no whitespace
  displayName:   -ABCD-API
  jobs:
    - job: BuildAndTest
      pool: 
       name: "Test Automation"
      displayName: 'Build and Test'
      steps:
      
      - task: PowerShell@2
        displayName: Config PATH ENV
        inputs:
          targetType: 'inline'
          script: |

            $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
            echo $env:Path
            $bashpath = "C:\Program Files\Git\bin"
            echo "##vso[task.setvariable variable=PATH]$bashpath;$(PATH)"
      
      - template: templates/test-template.yml
        parameters:
          mvnCommand: mvn clean test -P   -Dgroups="ABCDSanity"
          pipelineArtifactName:   -ABCD-API
      - bash: |
          echo "##vso[task.setvariable variable=  -ABCD-API-outcome;isOutput=true]$(result)"
        name: outputForDashboard
        condition: always()

    # run the report creation in a new job on microsoft hosted agents
    - job: allureReport
      pool: "Azure Pipelines"
      dependsOn: BuildAndTest
      condition: always()
      steps:
      - template: templates/allure-report.yml
        parameters:
          pipelineArtifactName:   -ABCD-API
          reportName:   -ABCD-API-Automation-Test-Report    

- stage: SaveDetailsForDashboard
  displayName: Save details for dashboard
  pool: "Test Automation"
  dependsOn:
    - Test1
  condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
  jobs:
    - job: SaveDetails
      displayName: Save details
      variables:
          -ABCD-API-outcome: $[stageDependencies.Test1.BuildAndTest.outputs['outputForDashboard.  -ABCD-API-outcome']]
      steps:
      - task: PowerShell@2
        inputs:
          targetType: 'inline'
          script: |
            echo "$(  -ABCD-API-outcome)" | Out-File -FilePath $(dashboardFileDirectory)\  -ABCD-API-outcome

Solution

  • ##[error]Unable to locate executable file: 'bash'.

    The cause of the issue is that the Bash is not the Built-in tool in Windows machine.

    To solve this issue, we can install git bash and add bash command folder in the PATH of environment variable on the agent machine.

    How do I add a Task or stage in below mentioned pipeline to resolve this error

    To integrate all the steps into the Pipeline, you can add the following tasks:

    steps:
    
    - task: PowerShell@2
      displayName: Install Git And Config PATH ENV
      inputs:
        targetType: 'inline'
        script: |
          # Define the URL of the Git installer
          $gitInstallerUrl = "https://github.com/git-for-windows/git/releases/download/v2.40.1.windows.1/Git-2.40.1-64-bit.exe"
          
          # Define the path to save the installer
          $installerPath = "$env:TEMP\Git-2.40.1-64-bit.exe"
          
          # Download the Git installer
          Invoke-WebRequest -Uri $gitInstallerUrl -OutFile $installerPath
          
          # Run the installer silently
          Start-Process -FilePath $installerPath -ArgumentList "/SILENT", "/NORESTART" -Wait
          
          # Optionally, remove the installer after installation
          Remove-Item -Path $installerPath
          $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
          echo $env:Path
          $gitpath = git --exec-path
          $bashpath = $gitpath.Replace('mingw64/libexec/git-core','bin')
          echo "##vso[task.setvariable variable=PATH]$bashpath;$(PATH)"
    
    
    - task: Bash@3
      inputs:
        targetType: 'inline'
        script: |
          echo "test"
    

    In this case, we can use the Bash task in Windows self-hosted agent.

    On the other hand, from your YAML sample, you are using bash task to set the Pipeline variable.

    You can also consider changing to use PowerShell task to achieve the same feature. In this case, you don't need to configure bash environment variable in Pipeline.

    For example:

      - powershell: |
          echo "##vso[task.setvariable variable=xxxx-outcome;isOutput=true]$(result)"
        name: outputForDashboard
        condition: always()
    

    Update:

    Since the git bash exist on your local machine(C:\Program Files\Git\bin), you can add the following powershell task to set the env variable.

    steps:
    
    
    - task: PowerShell@2
      displayName: Install Git And Config PATH ENV
      inputs:
        targetType: 'inline'
        script: |
    
          $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
          echo $env:Path
          $bashpath = "C:\Program Files\Git\bin"
          echo "##vso[task.setvariable variable=PATH]$bashpath;$(PATH)"
    
    
    - task: Bash@3
      inputs:
        targetType: 'inline'
        script: |
          echo "test"
    

    Update2:

    resources:
      pipelines:
      - pipeline: xxx
        source: xxx
        project: xxx
        trigger:
          stages:
          - Deploy_xxx
          xxx
    
    variables:
    - name: dashboardFileDirectory
      value: "C:\\Users\\svcAzurexxx\\test-team-xxxfiles"
    - name: setJava
      value: "false"
    
    stages:
    - stage: Test1 #no whitespace
      displayName: xxx
      jobs:
        - job: BuildAndTest
          pool: 
           name: "Test"
          displayName: 'Build and Test'
          steps:
          - task: PowerShell@2
            displayName: Config PATH ENV
            inputs:
              targetType: 'inline'
              script: |
    
                $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User")
                echo $env:Path
                $bashpath = "C:\Program Files\Git\bin"
                echo "##vso[task.setvariable variable=PATH]$bashpath;$(PATH)"
    
          - template: templates/test- Automation.yml
            parameters:
              mvnCommand: mvn clean test  Automation"
              pipelineArtifactName:  Automation-API
          - bash: |
              echo "##vso[task.setvariable variable= Automation-API-outcome;isOutput=true]$(result)"
            name: outputForDashboard
            condition: always()
    
        # run the report creation in a new job on microsoft hosted agents
        - job: allureReport
          pool: "Azure Pipelines"
          dependsOn: BuildAndTest
          condition: always()
          steps:
          - template: templates/ Automation.yml
            parameters:
              pipelineArtifactName:  Automation-API
              reportName:  Automation-Test-Report    
    
    - stage: SaveDetailsForDashboard
      displayName: Save details for dashboard
      pool: "Test Automation"
      dependsOn:
        - Test1
      condition: eq(variables['Build.SourceBranch'], 'refs/heads/main')
      jobs:
        - job: SaveDetails
          displayName: Save details
          variables:
             Automation-API-outcome: $[stageDependencies.Test1.BuildAndTest.outputs['outputForDashboard. Automation-API-outcome']]
          steps:
          - task: PowerShell@2
            inputs:
              targetType: 'inline'
              script: |
                echo "$( Automation-API-outcome)" | Out-File -FilePath $(dashboardFileDirectory)\ Automation-API-outcome