【问题标题】:Jenkins pipeline script issue with wget and variables in URLJenkins管道脚本问题与URL中的wget和变量
【发布时间】:2021-03-12 08:24:56
【问题描述】:

我检查了很多关于这个问题的建议,但没有找到合适的解决方案。

最初我的管道代码运行良好,但出现 Jenkins 安全警告 已检测到的以下步骤可能对敏感变量进行了不安全的插值。 sh: [通过,用户]

我的代码如下:

    withCredentials([usernamePassword(credentialsId: 'Jenkins-Nexus-tech', passwordVariable: 'pass', usernameVariable: 'user')]){
                        sh "wget --user=$user --password=$pass 'https://nexus.mycompany.io/repository/updated-maven-releases/com/mycompany/project/authorization-server/${params.AuthorizationServerVersion}/authorization-server-${params.AuthorizationServerVersion}.war' "
                }

警告:

[Pipeline] sh
Warning: A secret was passed to "sh" using Groovy String interpolation, which is insecure.
         Affected argument(s) used the following variable(s): [pass, user]
         See https://jenkins.io/redirect/groovy-string-interpolation for details.

为避免 https://www.jenkins.io/doc/book/pipeline/jenkinsfile/#interpolation-of-sensitive-environment-variables 中建议的 Jenkins 安全警告,我已将代码修改如下。但是对于单引号和双引号的不同排列和组合,它不起作用。它抛出 Bad substitution 错误:

    withCredentials([usernamePassword(credentialsId: 'Jenkins-Nexus-tech', passwordVariable: 'pass', usernameVariable: 'user')]){
                        sh 'wget --user=$user --password=$pass \"https://nexus.mycompany.io/repository/updated-maven-releases/com/mycompany/project/authorization-server/${params.AuthorizationServerVersion}/authorization-server-${params.AuthorizationServerVersion}.war\" '
                } 

我尝试过使用 3 个单引号。有了这个我没有收到警告,但它无法替换 wget URL 中的变量:

    withCredentials([usernamePassword(credentialsId: 'Jenkins-Nexus-tech', passwordVariable: 'pass', usernameVariable: 'user')]){
                        sh '''wget --user=$user --password=$pass 'https://nexus.mycompany.io/repository/updated-maven-releases/com/mycompany/project/authorization-server/${params.AuthorizationServerVersion}/authorization-server-${params.AuthorizationServerVersion}.war' '''
                }

错误如下,因为它不能替换变量的值

[Pipeline] sh
+ wget --user=**** --password=**** https://nexus.mycompany.io/repository/updated-maven-releases/com/mycompany/project/authorization-server/${params.AuthorizationServerVersion}/authorization-server-${params.AuthorizationServerVersion}.war
HTTP request sent, awaiting response... 404 com/mycompany/project/authorization-server/${params.AuthorizationServerVersion}/authorization-server-${params.AuthorizationServerVersion}.war
ERROR 404: com/mycompany/project/authorization-server/${params.AuthorizationServerVersion}/authorization-server-${params.AuthorizationServerVersion}.war.

如果有人能在这里提供帮助,那就太好了。

【问题讨论】:

  • 请复习一下 Groovy 字符串插值。

标签: jenkins jenkins-pipeline wget jenkins-groovy


【解决方案1】:

page you mention 中概述的建议建议您不要使用Groovy string interpolation 将敏感数据传递给sh 步骤。建议是让sh 脚本改为从环境中获取值。

但是,在您的情况下,您仍然需要在您的 sh 步骤中保存在 params.AuthorizationServerVersion 中的值。

Groovy 字符串插值仅在字符串在双引号内时使用。当字符串在单引号中时,字符串插值被关闭。

当字符串在双引号中时,您可以使用反斜杠转义$s。当您不希望发生这种情况时,这将防止将变量的内容插入到字符串中。

然后,您可以做的是使用双引号,转义要从环境中读取的变量上的 $s,并保留要直接访问的变量上的 $s 未转义来自您的 Groovy 代码。

一个例子,使用withCredentials plugin:

withCredentials([string(credentialsId: 'mytoken', variable: 'THE_TOKEN')]) {
    sh "some_command --that-uses \$THE_TOKEN --as-an-environment-variable --and-also-uses $params.A_PARAMETER"
}

在这里,令牌作为秘密注入到环境中,并通过转义$sh 脚本中使用。这意味着实际的 Unix shell(bash、zsh 或其他)将获得文字 $ 并按照该 shell 语言的指定扩展它。

$ for $params.A_PARAMETER 没有转义,并且在双引号内,因此 Groovy 将执行字符串插值并在运行时将 $params.A_PARAMETER 替换为参数的值,因为字符串是在内存中构造的,在字符串作为参数传递给sh 步骤。

在您的具体情况下,这是您可以使用的(当然,在您的 withCredentials 块内):

sh "wget --user=\$user --password=\$pass 'https://nexus.mycompany.io/repository/updated-maven-releases/com/mycompany/project/authorization-server/${params.AuthorizationServerVersion}/authorization-server-${params.AuthorizationServerVersion}.war'"

请注意,$user$pass 上的 $ 已转义,但 ${params.AuthorizationServerVersion} 上的 $ 未转义。

【讨论】:

  • 嘿@Shane,我通过转义$ 来尝试相同的方法,但是它将变量本身传递给sh 命令,例如$Host。这里有什么问题?
猜你喜欢
  • 2021-10-19
  • 2018-02-06
  • 2021-12-14
  • 1970-01-01
  • 2019-01-04
  • 2021-12-17
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
相关资源
最近更新 更多