Jenkins流水线中PowerShell环境变量显示为`org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME`

5

是否有人在Jenkins Pipeline中使用PowerShell时遇到问题,例如当您尝试获取环境变量(例如$env:CHANGE_ID)时,它会评估为类似于这样的内容?

org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME

看起来有人在这个问题中遇到了类似的问题,但我不确定那里是否得到了答案(它们展示了如何打印所有环境变量,但没有展示当toString未实现时如何获取特定环境变量):在Jenkinsfile中检索所有env属性

我的Jenkins流水线文件:

pipeline {
  agent {
    node {
      label 'jenkins_managed_windows'
    }
  }

  stages {
    stage('SonarQube Analysis') {
      steps {
        powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME"
      }
    }

    stage('Build') {
      steps {
        powershell 'dotnet build'
      }
    }

    stage('SonarQube End') {
      steps {
        powershell 'dotnet sonarscanner end'
      }
    }
  }
}

"环境变量所在的步骤将以以下方式运行:"
dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=org.jenkinsci.plugins.workflow.cps.EnvActionImpl@54ee3a8:BRANCH_NAME
Interestingly, if I use single quoting:
powershell 'dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME'

It doesn't even evaluate the environment variable at all, and just gets run as:
dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME

单引号字符串不会被计算。 - Benjamin Hubbard
尝试运行 powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$($env:BRANCH_NAME)" - Benjamin Hubbard
这给了我:WorkflowScript: 11: $符号后面出现非法字符串字符; 解决方案:要么转义文字中的$符号"\$5",要么将值表达式用大括号括起来"${5}" @行11,列3。然后我尝试了:powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=${env:BRANCH_NAME}",最终可以工作。 - olucafont6
2个回答

5

语法形式$env:BRANCH_NAME和等效的${env:BRANCH_NAME}PowerShell结构,这意味着为了将它们传递给在插值Groovy字符串("...")中将其传递到PowerShell,您必须\-转义$字符以防止Groovy在前面解释该结构

powershell "dotnet sonarscanner begin ... /d:sonar.branch.name=\$env:BRANCH_NAME"

话虽如此,鉴于您的命令不包含需要插值的 Groovy 变量(让 PowerShell 引用 环境 变量更安全和更健壮),您可以使用纯文本 Groovy 字符串 '...',其中针对 PowerShell 的 $ 字符无需进行转义

powershell 'dotnet sonarscanner begin ... /d:sonar.branch.name=$env:BRANCH_NAME'

关于您尝试的内容:
在插值Groovy字符串中使用"... $ env:BRANCH_NAME"会导致Groovy插值变量env(因为它前面有$),并将: BRANCH_NAME 视为文本。
由于env是指包含所有环境变量的对象,因此您看到的是该对象的(不太有用的)字符串形式,即类名(org.jenkinsci.plugins.workflow.cps.EnvActionImpl)后跟实例特定散列码(@54ee3a8)。
使用${env.BRANCH_NAME}将起作用-假设可以将环境变量BRANCH_NAME的值作为env对象的属性访问-但请注意,这意味着Groovy预先插值该值,然后PowerShell仅查看结果值
简单情况下(没有空格或特殊字符的环境变量值),"$ {env.BRANCH_NAME}"(由Groovy预先插值)和"\ $ {env:BRANCH_NAME}"(由PowerShell稍后解释)是可互换的,但只有后者适用于所有值。

1
哦,算了。Jenkins Pipeline 的输出只是显示命令为 dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME,因为 Groovy 没有插值该命令。但当在 PowerShell 中实际运行时,它使用的是实际的环境变量。 - olucafont6

0
原来以这种方式指定环境变量是可行的:
powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=${env:BRANCH_NAME}"

你也可以使用句号代替冒号 (${env.BRANCH_NAME})。


1
"..." 内,你应该使用 \ 转义 $,即 \${env:BRANCH_NAME},以防止 Groovy 可能会解释该结构。相比之下,使用 ${env.BRANCH_NAME}(注意 .)会导致 Groovy 在 PowerShell 看到结果字符串之前将构造替换为环境变量 BRANCH_NAME 的 _值_。在简单情况下,这两种方法是可以互换的,但是后一种方法可能会在变量值包含空格或特殊字符时出现问题。 - mklement0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接