jenkins - Jenkins管道脚本问题与URL中的wget和变量
问题描述
我检查了很多关于这个问题的建议,但没有找到合适的解决方案。
最初我的管道代码运行良好,但出现 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 安全警告,我修改了我的代码,如下所示。但是对于单引号和双引号的不同排列和组合,它不起作用。它抛出错误替换错误:
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 字符串插值将敏感数据传递给sh
步骤。建议是让sh
脚本改为从环境中获取值。
但是,在您的情况下,您仍然需要params.AuthorizationServerVersion
在您的sh
步骤中保存的值。
Groovy 字符串插值仅在字符串在双引号内时使用。当字符串在单引号中时,字符串插值被关闭。
当字符串在双引号中时,您可以$
使用反斜杠转义 s。当您不希望发生这种情况时,这将防止将变量的内容插入到字符串中。
然后,您可以做的是使用双引号,$
将您想要从环境中读取的变量上的 s 转义,并让$
您想要直接从 Groovy 代码访问的变量上的 s 不转义。
一个例子,使用withCredentials
插件:
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'"
注意$
on$user
和$pass
被转义,但$
on${params.AuthorizationServerVersion}
没有被转义。
推荐阅读
- html - React App中的焦点DOM元素在useEffect问题中
- javascript - 带有 javascript 的新 div
- python - Python XML解析抛出FileNotFoundError:没有这样的文件或目录:'file.xml'
- image - webp 图像不会出现在 safari 、 iphone 等
- java - 使字符串的一部分等于字符串的其他部分
- c - 计算没有库的空字符串的 MD5 摘要
- windows - 为什么我的机器上无法识别 Microsoft ludown?
- excel - 变量在没有被告知的情况下表示开头的引用
- android - 谷歌地图在 Android 10 上崩溃
- ansible - Ansible - 检查项目是否在列表中