Home > Blockchain >  github Actions: assign command output piped into grep to variable
github Actions: assign command output piped into grep to variable

Time:07-21

I have a step in a Github Actions job:

      - name: Check for changes
        run: |
          diff=$( git diff --name-only 'origin/main' )
          changed_files=$( echo $diff | grep -c src/my_folder ) # this fails

          # more script lines
          # that are unrelated

This fails with Error: Process completed with exit code 1. only if grep finds nothing. If there are matches in $diff, then this step works as intended. But of course it also needs to work without matches.

I can run this locally or inside a script without a problem, exit code is always 0 (on a Mac).

I fail to understand what the problem is. After some hours of trial and error and research I learned that apparently grep is tricky in Github actions, but I found no hint or proper documentation how I am supposed to solve this exact case.

If I change my failing line to

echo $( echo $diff | grep -c src/my_folder ) # this works and prints out the result

this gets executed without problems.

But how do I get my grep output into my variable even when there are no findings?

CodePudding user response:

I would suggest to use the dorny/paths-filter action, like:

- uses: dorny/paths-filter@v2
  id: changes
  with:
    filters: |
      src:
        - 'src/my_folder/**'

  # run only if some file in 'src/my_folder' folder was changed
- if: steps.changes.outputs.src == 'true'
  run: ...

Check the output section for details about changes

CodePudding user response:

I don't know what problem grep has in Github actions but you can try something like :

... 
changed_files=$( [ ! -e $diff ] && { echo $diff | grep -c src/my_folder } || echo 0 ) 
... 

This way grep wouldn't run if $diff is empty. It would just store 0 in $changed_files

  • Related