Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-40134

Groovy truth issue in Pipeline script

    Details

    • Similar Issues:

      Description

      A Jenkins pipeline script combining two String values with a logical AND (&& operator) does not behave as expected:

      '' && '' -> false
      'a' && 'b' -> 'b'
      'a' != '' && 'b != '' -> true
      

      So when combining two non empty values the result is not of type boolean but the second value of type String.

      The following script demonstrates this behavior:

      node {
          def doit = { String s1, String s2 ->
              def p = { v -> "'$v' (${v.class})" }
          
              echo "s1 = ${p s1}, s2 = ${p s2}"
              echo "s1 && s2 = ${p s1 && s2}"
              echo "s1 != '' && s2 != '' = ${p s1 != '' && s2 != ''}"
          }
       
          doit '', ''
          doit 'foo', 'bar'
      }
      

      Console of an example run in my environment:

        Attachments

          Activity

          m_olk Marcus Olk created issue -
          m_olk Marcus Olk made changes -
          Field Original Value New Value
          Summary Groovy truth issue in parameterized Pipeline script Groovy truth issue in Pipeline script
          m_olk Marcus Olk made changes -
          Description A Jenkins pipeline script combining two {{String}} values with a logical AND ({{&&}} operator) does not behave as expected:

          {code}
          '' && '' -> false
          'a' && 'b' -> 'b'
          'a' != '' && 'b != ''' -> true
          {code}

          So when combining two non empty values the result is not of type {{boolean}} but the second value of type {{String}}.

          The following script demonstrates this behavior:

          {code}
          node {
              def doit = { String s1, String s2 ->
                  def p = { v -> "'$v' (${v.class})" }
              
                  echo "s1 = ${p s1}, s2 = ${p s2}"
                  echo "s1 && s2 = ${p s1 && s2}"
                  echo "s1 != '' && s2 != '' = ${p s1 != '' && s2 != ''}"
              }
           
              doit '', ''
              doit 'foo', 'bar'
          }
          {code}

          Console of an example run in my environment:
           !Screen Shot 2016-11-30 at 22.58.37.png!
          A Jenkins pipeline script combining two {{String}} values with a logical AND ({{&&}} operator) does not behave as expected:

          {code}
          '' && '' -> false
          'a' && 'b' -> 'b'
          'a' != '' && 'b != '' -> true
          {code}

          So when combining two non empty values the result is not of type {{boolean}} but the second value of type {{String}}.

          The following script demonstrates this behavior:

          {code}
          node {
              def doit = { String s1, String s2 ->
                  def p = { v -> "'$v' (${v.class})" }
              
                  echo "s1 = ${p s1}, s2 = ${p s2}"
                  echo "s1 && s2 = ${p s1 && s2}"
                  echo "s1 != '' && s2 != '' = ${p s1 != '' && s2 != ''}"
              }
           
              doit '', ''
              doit 'foo', 'bar'
          }
          {code}

          Console of an example run in my environment:
           !Screen Shot 2016-11-30 at 22.58.37.png!
          abayer Andrew Bayer made changes -
          Component/s workflow-cps-plugin [ 21713 ]
          Component/s pipeline [ 21692 ]
          abayer Andrew Bayer made changes -
          Labels pipeline complex-cps-code pipeline triaged-2018-11

            People

            • Assignee:
              Unassigned
              Reporter:
              m_olk Marcus Olk
            • Votes:
              2 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated: