Search code examples
github-actionscicd

Unable to Use Output from dorny/paths-filter@v2 in Startegy Matrix ( Github Action )


I am trying to take output from dorny/paths-filter@v2 which is actually a list of files that got changed, and use it as a multiple input for Strategy matrix in Github Actions.

Although i see relevant file path that got changed, which looks something like "aws/dev/something/yo.yaml" for eg. in the plugins output, but the strategy matrix just dont like it and throws errors like

Error when evaluating 'strategy' for job 'deploy'. .github/workflows/main.yaml (Line: 59, Col: 15): Error parsing fromJson,.github/workflows/main.yaml (Line: 59, Col: 15): Unexpected character encountered while parsing value: a. Path '', line 0, position 0.,.github/workflows/main.yaml (Line: 59, Col: 15): Unexpected value ''

My Github Action file

name: Yo

on:
  push:
    branch:
    - main


jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      files: ${{ steps.filter.outputs.aws_files }}

    steps:
    - uses: actions/checkout@v2

    - uses: dorny/paths-filter@v2
      id: filter
      with:
        base: ${{ github.ref }}
        list-files: 'escape'
        filters: |
          aws:
          - added|modified: 'aws/**'

  deploy:
    runs-on: ubuntu-latest
    needs: changes
    strategy:
      matrix:
        file: ${{fromJson(needs.changes.outputs.files)}}
      fail-fast: false

    steps:

    - name: Lets See
      env:
        file: ${{matrix.file}}
      run: |
        echo ${{env.file}}

Tried multiple option of the plugin like shell, csv but no luck


Solution

  • The issue is that strategy matrix expects the response from fromJSON to be an array. That's not happening here, and hence the error.

    So you need to make sure dorny/paths-filter@v2 send back the list of files formatted as a JSON array.

    - uses: dorny/paths-filter@v2
      id: filter
      with:
        base: ${{ github.ref }}
        list-files: 'json'
        filters: |
          aws:
            - added|modified: 'aws/**'
    

    Notice that list-files: 'json' instead of list-files: 'escape'.