Groovy Jenkins动力外壳管道不工作

lo8azlld  于 2022-11-01  发布在  Jenkins
关注(0)|答案(1)|浏览(150)

我想在Jenkins完成构建步骤后替换文件中的一些文本。
我在我的后构建步骤中有下面的代码。

powershell.exe -Command(Get-Content "./PublishedWebsites/app.config") |
Foreach-Object {$_.replace({{MyDummValue}}, "${env.BUILD_NUMBER}")} | 
Set-Content "./PublishedWebsites/app.config"

第一部分工作(Get-Content "./PublishedWebsites/app.config"),直到管道(“|“).
在管道之后,它会抛出一个错误:内部或外部命令无法识别Foreach-Object。
我认为这与转义序列和语法有关。所以我也试过这个

"""powershell.exe -Command(Get-Content "./PublishedWebsites/app.config") |
    Foreach-Object {$_.replace({{MyDummValue}}, "${env.BUILD_NUMBER}")} | 
    Set-Content "./PublishedWebsites/app.config"""

然后,由于某种原因,Jenkins甚至在到达后生成步骤之前就尝试计算$_.replace({{MyDummValue}},并向我提供错误**“无法在空对象上获取属性替换”**
所以我很茫然。我想做的就是在一个构建后的步骤中,用构建号重命名文件中的一个值。

wf82jlnq

wf82jlnq1#

调用PowerShell时(或其他)脚本,请始终使用单引号(或三个单引号)字符串文字。如果使用双引号(或三重双引号)字符串,Groovy试图插入该字符串,因此您必须将$转义为\$,才能按字面意思使用它。双引号字符串也容易脚本注入,当Groovy在脚本中插入管道参数时,管道用户可能会运行任意PowerShell脚本。
另一个错误:值{{MyDummValue}}没有用引号括起来。
另外,我不知道为什么要显式调用powershell.exe,请使用powershell步骤:

post {
    always {  // or one of the other available sections
        powershell '''
            Get-Content "./PublishedWebsites/app.config" |
                Foreach-Object {$_.replace("{{MyDummValue}}", $env:BUILD_NUMBER)} |
                Set-Content "./PublishedWebsites/app.config"
        '''
    }
}

相关问题