使用变量在 Jenkins 工作流的 git 步骤中访问 credentialId
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 等脚本化项目更加愉快。
我试图在工作流程的 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 等脚本化项目更加愉快。