【问题标题】:Using variables in Groovy and Jenkins pipeline build在 Groovy 和 Jenkins 管道构建中使用变量
【发布时间】:2017-04-07 15:26:10
【问题描述】:

我有一个需要获取提交 id (sha) 的 Jenkins 管道构建,所以据我所知,获得它的唯一方法是执行以下操作

sh "git rev-parse --long HEAD > .git/commit-id"                        
GIT_COMMIT = readFile('.git/commit-id')

我需要在 curl 命令中使用 GIT_COMMIT 变量,但使用时遇到问题

sh '''curl "https://api.github.com/repos/myRepo/myBuild/statuses/${GIT_COMMIT}"}"''' 
sh '''curl "https://api.github.com/repos/myRepo/myBuild/statuses/GIT_COMMIT"}"'''

在没有通过 GIT_COMMIT 的那一刻,它始终是空白的,但是如果我回显它,我会返回值

echo GIT_COMMIT
--long
12345678910

谁能告诉我如何实现我的要求

谢谢

更新

我已经尝试了以下但仍然没有运气

sh '''GIT_COMMIT=$(git rev-parse HEAD)'''
sh '''curl "https://api.github.com/repos/myBuild/statuses/$GIT_COMMIT"'''

【问题讨论】:

  • 旁注:git rev-parse不明白--long;这就是为什么文件中有一行只读取--longgit rev-parse 回显未知参数)。但是,依赖这个并不是一个好主意:如果 git rev-parse 的未来版本获得一个 确实 做某事的新 --long 标志会发生什么?
  • 是的想知道为什么它在文件中,所以现在只求助于 git rev-parse HEAD 似乎正在做这项工作....除非您有任何其他建议?谢谢
  • 我对 Groovy 一无所知,但git rev-parse HEAD 是查找当前提交的原始提交 ID 的好方法。既然看起来这就是你所需要的,这似乎是合理的。

标签: git shell jenkins groovy


【解决方案1】:

如果您不想写入文件以保留提交哈希,您可以在 sh 上使用 returnStdout: true 并直接传递它。

GIT_COMMIT = sh script: 'git rev-parse HEAD',  returnStdout: true
sh """curl "https://api.github.com/repos/myBuild/statuses/${GIT_COMMIT}""""

【讨论】:

  • 谢谢,不过我没有返回值,GIT_COMMIT = ""
  • 我把脚本部分里面的命令复制错了。现在应该可以工作了。
  • 谢谢,它现在确实将提交 ID 分配给 GIT_COMMIT.. 出于某种原因,尽管现在我在脚本中使用它时出现错误,illegal characters in url。这与returnStdout: true 有什么关系吗?
  • 最后我不得不做GIT_COMMIT = GIT_COMMIT.replaceAll("\\s","") 让它工作
【解决方案2】:

除非您需要将提交哈希分配给变量,否则您可以在一行中执行此操作而无需输出到文件:

sh "curl https://api.github.com/repos/myRepo/myBuild/statuses/\$(git rev-parse HEAD)"

请记住,只有在 Groovy http://docs.groovy-lang.org/latest/html/documentation/index.html#_triple_double_quoted_string 中,多行字符串才需要三引号

【讨论】:

  • 你知道echo `command` command 是完全一样的,对吧?由于多个 I/O 操作,效率较低。
【解决方案3】:

变量/表达式扩展(插值)仅在 Groovy 中适用于某些类型的字符串文字语法。您使用的语法:

'''content${interpolation}etc'''

不是其中之一。而是将三单引号 (''') 替换为三双引号 ("""),如下所示:

sh """curl "https://api.github.com/repos/myRepo/myBuild/statuses/${GIT_COMMIT}"}""""

编辑:我也有点担心这个语句中可能仍然存在语法错误,尤其是末尾的额外}"。也许下面的内容更像你真正需要的?:

sh """curl "https://api.github.com/repos/myRepo/myBuild/statuses/${GIT_COMMIT}""""

【讨论】:

  • 谢谢,试试看