Jenkins管道中的PowerShell环境变量给出了“org.jenkinsci.plugins.workflow.cps”。EnvActionImpl@1b69f5bb:变量名称`
是否有人在Jenkins管道中使用PowerShell时遇到问题,当您尝试引入环境变量(例如,Jenkins管道中的PowerShell环境变量给出了“org.jenkinsci.plugins.workflow.cps”。EnvActionImpl@1b69f5bb:变量名称`,powershell,jenkins,command-line,jenkins-pipeline,Powershell,Jenkins,Command Line,Jenkins Pipeline,是否有人在Jenkins管道中使用PowerShell时遇到问题,当您尝试引入环境变量(例如,$env:CHANGE\u ID)时,它的计算结果如下 org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME 在这个问题上,似乎其他人遇到了相同的问题,但我不确定问题是否得到了回答(它们显示了如何打印所有环境变量,但没有显示在未实现toString时如何获取特定的环境变量): 我的Jenkins管道文件: pi
$env:CHANGE\u ID
)时,它的计算结果如下
org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME
在这个问题上,似乎其他人遇到了相同的问题,但我不确定问题是否得到了回答(它们显示了如何打印所有环境变量,但没有显示在未实现toString
时如何获取特定的环境变量):
我的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
有趣的是,如果我使用单引号:
powershell 'dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME'
它甚至根本不计算环境变量,只是以如下方式运行:
dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=$env:BRANCH_NAME
结果表明,以这种方式指定环境变量是可行的:
powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=${env:BRANCH_NAME}"
您还可以使用句点而不是冒号(
${env.BRANCH\u NAME}
)。语法形式$env:BRANCH\u NAME
和等效的${env:BRANCH\u 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'
至于你所尝试的:
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\u NAME}
可能会起作用,因为环境变量BRANCH\u NAME
的值可以作为env
对象的属性访问,但请注意,这意味着Groovy会预先插入值,而PowerShell只会看到结果值
在简单情况下(没有空格或特殊字符的环境变量值),
“${env.BRANCH\u NAME}”和“\${env.BRANCH\u NAME}”是可互换的,但是,只有后一种方法对所有值都有效。不计算单引号字符串。请尝试powershell“dotnet Sonascanner begin/k:project key/d:sonar.branch.name=$($env:branch\u name)”
这给了我:工作流脚本:11:美元符号后的非法字符串正文字符;解决方案:要么转义一个字面的美元符号“\$5”,要么将值表达式“${5}”括在第11行第3列。
I然后尝试:powershell“dotnet sonascanner begin/k:project key/d:sonar.branch.name=${env:branch\u name}”
,最终成功。谢谢在“…”
内部,您应该\
-转义$
-\${env:BRANCH\u NAME}
-这会阻止Groovy潜在地解释构造。相反,使用${env.BRANCH\u NAME}
(注意
)会导致Groovy在PowerShell看到结果字符串之前,用环境变量BRANCH\u NAME
的值替换该构造。在简单的情况下,这两种方法是可以互换的,但如果变量值包含空格或特殊字符,则后一种方法可能会中断命令。Jenkins管道的输出只是将命令显示为dotnet sonarscanner begin/k:project key/d:sonar.branch.name=$env:branch\u name
,因为Groovy没有插入命令。当它在PowerShell中实际运行时,尽管它使用的是实际的环境变量。