[英]how to use environment variable in powershell block and groovy block in Jenkins Pipeline
[英]PowerShell environment variable in Jenkins Pipeline gives `org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME`
有没有人在 Jenkins 管道中使用 PowerShell 时遇到问题,当您尝试引入环境变量(例如$env:CHANGE_ID
)时,它的评估结果是这样的?
org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME
看起来其他人在这个问题中遇到了同样的问题,但我不确定它是否在那里得到了回答(他们展示了如何打印所有环境变量,但没有在没有实现toString
时如何获取特定的环境变量) : 在 Jenkinsfile 中检索 env 的所有属性
我的詹金斯管道文件:
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
语法形式$env:BRANCH_NAME
和等效的${env:BRANCH_NAME}
是PowerShell构造,这意味着为了通过插值Groovy字符串 ( "..."
)将它们通过h传递给 PowerShell ,您必须\\
-escape $
字符以防止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'
至于你尝试了什么:
"... $env:BRANCH_NAME"
在插入 Groovy 字符串中会导致 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}"
插值)和"\\${env:BRANCH_NAME}"
(由 PowerShell 稍后解释)是可以互换的,但只有后一种方法对所有值都有效。
结果证明以这种方式指定环境变量有效:
powershell "dotnet sonarscanner begin /k:project-key /d:sonar.branch.name=${env:BRANCH_NAME}"
您还可以使用句点代替冒号 ( ${env.BRANCH_NAME}
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.