withEnv and withCredentials don't set environment fully

This issue is archived. You can view it, but you can't modify it. Learn more

XMLWordPrintable

      Using withEnv or withCredentials fails to correctly setup the environment meaning replacements don't happen.

      withEnv(['TESTVAR=TESTVAL']) {
           echo env.dump()                   // TESTVAR is not present
           echo env.getEnvironment().dump()  // TESTVAR is not present
           echo env.TESTVAR                  // outputs TESTVAL
           env.TESTVAR = env.TESTVAR         // Should have no effect
           echo env.dump()                   // TESTVAR is now present
           echo env.getEnvironment().dump()  // TESTVAR is now present
      } 

      The impact of this is that withCredentials blocks don't behave as expected with calls like httpRequest as the variables can't be passed in single quoted, which is a security risk.

      For example this does not expand $ENV_KEY in the httpRequest case but does when sh is used

      withCredentials([string(credentialsId: 'PasswordEncryptionKey', variable: 'ENC_KEY')]) {
          try {
              httpRequest url: 'http://127.0.0.1:1000/$ENC_KEY' // Uses liternal $ENV_KEY
          } catch (e) {
              echo "ERROR: $e"
          }
      
          try {
              node('master') {
                  sh  'echo $ENC_KEY'                           // Correctly outputs *****
                  def localEnv = env.getEnvironment()
                  echo localEnv.expand('${ENC_KEY} $ENC_KEY')   // Incorrectly output literal ${ENC_KEY} $ENC_KEY
              }
          } catch (e) {
              echo "ERROR: $e"
          }
      
          env.ENC_KEY = env.ENC_KEY                             // Workaround for some cases
          echo env.dump()                                       // ENC_KEY is now present
          try {
              httpRequest url: 'http://127.0.0.1:1000/$ENC_KEY' // Still uses liternal $ENV_KEY
          } catch (e) {
              echo "ERROR: $e"
          }
      
          try {
              node('master') {
                  sh  'echo $ENC_KEY'                           // Correctly outputs *****
                  def localEnv = env.getEnvironment()
                  echo localEnv.expand('${ENC_KEY} $ENC_KEY')   // Correctly outputs ***** *****
              }
          } catch (e) {
              echo "ERROR: $e"
          }
      }

       

       

       

            Assignee:
            Unassigned
            Reporter:
            Steven
            Archiver:
            Jenkins Service Account

              Created:
              Updated:
              Archived: