Skip to content

fix(shells): check if pipefail is supported with for loop because grep might not be installed

Eligio Alejandro Mariño Garcés requested to merge (removed):grep-pipefail into main

What does this MR do?

Changes grep for a for loop in the shell script generation in bash.go. It iterates by the words outputted by set -o to check if pipefail is a supported shell option.

Why was this MR needed?

grep is not always installed in custom CI images but the runner uses it when starting the shell session. The shell errors are shown when grep is not installed, confusing CI users if there is an issue in the CI job image or the script section.

  • /bin/bash: line 4: grep: command not found
  • sh: line 4: grep: command not found

What's the best way to test this MR?

It can be tested with the following .gitlab-ci.yml

test-grep-not-used-in-bash:
  image: nixery.dev/shell # image with bash but not grep
  script:
    - 'echo "Check in the log lines above there is no error like: /bin/bash: line 4: grep: command not found"'
    
    # pipefail should be "on" in bash options
    - set -o
    
    # "false | true" should output 1 if pipefail is enabled
    - false | true; if [ $? -eq 0 ]; then echo "pipefail is disabled or not supported"; exit 1; else echo "pipefail is enabled"; fi

test-grep-not-used-in-sh:
  image:
    name: nixery.dev/shell
    entrypoint: ["/bin/sh", "-c"] # image with sh but not grep
  script:
    - 'echo "Check in the log lines above there is no error like: sh: line 4: grep: command not found"'
      
    # pipefail should be "on" in sh options
    - set -o

    # "false | true" should output 1 if pipefail is enabled
    - false | true; if [ $? -eq 0 ]; then echo "pipefail is disabled or not supported"; exit 1; else echo "pipefail is enabled"; fi

What are the relevant issue numbers?

Merge request reports