繁体   English   中英

Jenkins 管道中的 PowerShell 环境变量给出了`org.jenkinsci.plugins.workflow.cps.EnvActionImpl@1b69f5bb:VARIABLE_NAME`

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM