Groovy 使用变量访问Jenkins工作流git步骤中的credentialId

Groovy 使用变量访问Jenkins工作流git步骤中的credentialId,groovy,jenkins-workflow,Groovy,Jenkins Workflow,我试图在我的工作流的git步骤下提供一个参数作为credentialId。我将以下变量定义为作业文件夹中的环境变量: stashProject=ssh://git@stash.finra.org:7999/rpt gitProdCredential=289b9074-c29a-463d-a793-6e926174066c 在内联Groovy CPS DSL工作流脚本中,我有以下几行代码: sh 'echo retrieving code using credential: ${gitProdC

我试图在我的工作流的git步骤下提供一个参数作为credentialId。我将以下变量定义为作业文件夹中的环境变量:

stashProject=ssh://git@stash.finra.org:7999/rpt
gitProdCredential=289b9074-c29a-463d-a793-6e926174066c
在内联Groovy CPS DSL工作流脚本中,我有以下几行代码:

sh 'echo retrieving code using credential: ${gitProdCredential}'
git url: '${stashProject}/etl.git', credentialsId: '${gitProdCredential}', branch: 'feature/workflow'
您可以看到,由于gitProdCredential是echo'd,并且git检索尝试根据以下输出从我的正确URL获取,因此变量的计算是正确的:

使用凭据检索代码:289b9074-c29a-463d-a793-6e926174066c hudson.plugins.git.GitException:未能从中获取ssh://git@stash.finra.org:7999/rpt/etl.git stderr:权限被拒绝(公钥)

但是您也可以看到它没有正确地进行身份验证。但是,如果我像这样硬编码gitProdCredential

git url:'${stashProject}/etl', credentialId: '289b9074-c29a-463d-a793-6e926174066c', branch: 'feature/workflow'

它运行良好,克隆了我的回购协议。因此,credentialId变量在git DSL函数中的计算不正确,即使它似乎在工作流的其余部分。如果我遗漏了什么,请给出建议。

这主要是一个Groovy问题

'${gitProdCredential}'
是文本为
${gitProdCredential}
的文本字符串。也许你是说

"${gitProdCredential}"
或者更简单地说

gitProdCredential
因为创建一个插入(
字符串
值)表达式且不包含任何其他内容的字符串表达式是没有意义的。但是,在本例中,该变量不是Groovy变量而是环境变量,因此需要使用

env.gitProdCredential
你可能被以下事实误导了

sh 'echo retrieving code using credential: ${gitProdCredential}'
工作。但这仅仅是因为它运行的是Bourne shell脚本

echo使用凭据检索代码:${gitProdCredential}
这个shell恰好允许使用与Groovy在
GString
中使用的语法类似的语法来扩展环境变量

至于“
”${stashProject}/etl.git”
的附带扩展,这显然是一个bug(从工作流脚本传递的值应该按原样使用):一些Jenkins插件在配置输入中扩展环境变量,同样使用与Groovy使用的语法类似的语法

总之,你想写的是

git url: "${env.stashProject}/etl.git", credentialsId: env.gitProdCredential, branch: 'feature/workflow'

顺便说一句,当使用足够新版本的凭据插件时,当创建新的凭据项时(但不是之后),您可以单击“高级”按钮来指定助记符ID,这使使用脚本项目(如工作流)更加愉快。

这主要是Groovy的问题

'${gitProdCredential}'
是文本为
${gitProdCredential}
的文本字符串。也许你是说

"${gitProdCredential}"
或者更简单地说

gitProdCredential
因为创建一个插入(
字符串
值)表达式且不包含任何其他内容的字符串表达式是没有意义的。但是,在本例中,该变量不是Groovy变量而是环境变量,因此需要使用

env.gitProdCredential
你可能被以下事实误导了

sh 'echo retrieving code using credential: ${gitProdCredential}'
工作。但这仅仅是因为它运行的是Bourne shell脚本

echo使用凭据检索代码:${gitProdCredential}
这个shell恰好允许使用与Groovy在
GString
中使用的语法类似的语法来扩展环境变量

至于“
”${stashProject}/etl.git”
的附带扩展,这显然是一个bug(从工作流脚本传递的值应该按原样使用):一些Jenkins插件在配置输入中扩展环境变量,同样使用与Groovy使用的语法类似的语法

总之,你想写的是

git url: "${env.stashProject}/etl.git", credentialsId: env.gitProdCredential, branch: 'feature/workflow'

顺便说一句,当使用足够新版本的凭据插件时,当创建新的凭据项时(但不是之后),您可以单击“高级”按钮来指定助记符ID,这使使用脚本项目(如工作流)更加愉快。

这主要是Groovy的问题

'${gitProdCredential}'
是文本为
${gitProdCredential}
的文本字符串。也许你是说

"${gitProdCredential}"
或者更简单地说

gitProdCredential
因为创建一个插入(
字符串
值)表达式且不包含任何其他内容的字符串表达式是没有意义的。但是,在本例中,该变量不是Groovy变量而是环境变量,因此需要使用

env.gitProdCredential
你可能被以下事实误导了

sh 'echo retrieving code using credential: ${gitProdCredential}'
工作。但这仅仅是因为它运行的是Bourne shell脚本

echo使用凭据检索代码:${gitProdCredential}
这个shell恰好允许使用与Groovy在
GString
中使用的语法类似的语法来扩展环境变量

至于“
”${stashProject}/etl.git”
的附带扩展,这显然是一个bug(从工作流脚本传递的值应该按原样使用):一些Jenkins插件在配置输入中扩展环境变量,同样使用与Groovy使用的语法类似的语法

总之,你想写的是

git url: "${env.stashProject}/etl.git", credentialsId: env.gitProdCredential, branch: 'feature/workflow'

顺便说一句,当使用足够新版本的凭据插件时,当创建新的凭据项时(但不是之后),您可以单击“高级”按钮来指定助记符ID,这使使用脚本项目(如工作流)更加愉快。

这主要是Groovy的问题

'${gitProdCredential}'
是文本为
${gitProdCredential}
的文本字符串。也许你是说

"${gitProdCredential}"
或者更简单地说

gitProdCredential
因为创建一个插入(
字符串
值)表达式且不包含任何其他内容的字符串表达式是没有意义的。但是,在本例中,该变量不是Groovy变量而是环境变量,因此需要使用

env.gitProdCredential
你可能被以下事实误导了

sh 'echo retrieving code using credential: ${gitProdCredential}'
工作。但这仅仅是因为它运行的是Bourne shell脚本

echo使用凭据检索代码:${gitProdCredential}
这个shell恰好允许使用语法扩展环境变量