0

我正在尝试在我的工作流程的 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 获取,基于以下输出:

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

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

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

它运行得很好并克隆了我的仓库。因此,不知何故,在 git DSL 函数中没有正确评估 credentialId 变量,即使它似乎在工作流程的其余部分中。请告知我是否遗漏了什么。

4

1 回答 1

3

这主要是一个 Groovy 问题。

'${gitProdCredential}'

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

"${gitProdCredential}"

或者更简单地说

gitProdCredential

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

env.gitProdCredential

你可能被以下事实误导了

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

作品。但这仅是因为它正在运行 Bourne shell 脚本

echo retrieving code using credential: ${gitProdCredential}

这个 shell 恰好允许使用类似于 Groovy 在GString.

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

总之,你要写的是

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

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

于 2015-07-28T22:41:27.950 回答