使用变量在 Jenkins 工作流的 git 步骤中访问 c​​redentialId

Accessing credentialId in git step of Jenkins workflow using variable

我试图在工作流程的 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 被回显并且 git 检索确实尝试从我的正确 URL 获取,基于以下输出:

retrieving code using credential: 289b9074-c29a-463d-a793-6e926174066c hudson.plugins.git.GitException: Failed to fetch from ssh://git@stash.finra.org:7999/rpt/etl.git stderr: Permission denied (publickey).

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

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

它运行良好并克隆了我的存储库。因此,以某种方式,credentialId 变量在 git DSL 函数中没有被正确评估,即使它似乎在工作流的其余部分中。如果我遗漏了什么,请告知。

这主要是一个 Groovy 问题。

'${gitProdCredential}'

是文本字符串 ${gitProdCredential}。可能你的意思是

"${gitProdCredential}"

或更简单地说

gitProdCredential

因为创建一个字符串表达式是没有意义的,它插入一个(String-值)表达式并且不包含任何其他内容。但是在这种情况下,变量不是 Groovy 变量而是环境变量,因此您需要使用

env.gitProdCredential

您可能被以下事实误导了

sh 'echo retrieving code using credential: ${gitProdCredential}'

有效。但这只是因为它是 运行 谍影重重 shell 脚本

echo retrieving code using credential: ${gitProdCredential}

而这个 shell 恰好允许使用类似于 Groovy 在 GString 中使用的语法扩展环境变量。

至于 '${stashProject}/etl.git' 的附带扩展,这显然是 happening in the Git plugin,并且可以说是一个错误(从 Workflow 脚本传递的值应该按原样使用):一些 Jenkins 插件扩展环境配置输入中的变量,再次使用类似于 Groovy.

使用的语法

总而言之,你想写的是

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

顺便说一下,当使用足够新版本的 Credentials 插件时,在创建新的凭据项目时(但不是之后),您可以单击 Advanced 按钮来指定助记符ID,这使得使用 Workflow 等脚本化项目更加愉快。