jenkins - Jenkins 管道不扩展 Git 命令
问题描述
我正在尝试在 Jenkins 共享库中创建一个函数,该函数会吐出当前 git 分支的父分支的最后一个提交哈希。
父分支 = foo
ChildBranch(从父分支)= bar
我想要得到的是foo分支中最后一次提交的提交哈希
我已经编写了这个脚本并在我的本地机器上对其进行了测试
#! /bin/bash
PARENT_BRANCH=$(git show-branch -a | grep '\*' | grep -v `git rev-parse --abbrev-ref HEAD` | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//')
PARENT_COMMIT=$(git rev-parse $PARENT_BRANCH | cut -c-20)
printf $PARENT_COMMIT
这非常有效。
但是当我把它放在詹金斯的一个函数中时,它似乎什么也没做。我也试图逃避特殊字符。
def call() {
sh '''
cat <<EOF > gitBranch.sh
#! /bin/bash
PARENT_BRANCH="$(git show-branch | grep '*' | grep -v "$(git rev-parse --abbrev-ref HEAD)" | head -n1 | sed 's/.*\\[\\(.*\\)\\].*/\\1/' | sed 's/[\\^~].*//')"
PARENT_COMMIT="$(git rev-parse ${PARENT_BRANCH} | cut -c-20)"
printf "${PARENT_COMMIT}"
EOF
'''
}
在我的 Jenkins 控制台输出中,当我 cat 文件 gitBranch.sh 时,这就是我得到的
#! /bin/bash
PARENT_BRANCH=""
PARENT_COMMIT=""
printf ""
什么都没有扩展。
请问我做错了什么?
解决方案
您的问题是 Jenkins(所以我删除了非 Jenkins 标签):Jenkins 使用 Groovy 命令,而Groovy 在 strings 中进行自己的$
插值。您只需要保护这些特定的美元符号。另请参阅在 Groovy 中使用“$”和美元符号后的非法字符串主体字符:转义文字美元符号“\$5”或将值表达式括起来。
(我不是 Jenkins 或 Groovy 专家,我完全不喜欢 Jenkins,但这是任何使用它的人都应该知道的事情,因为那样做很邪恶。)
推荐阅读
- java - 如何修复bundle gradle错误未知属性
- r - r中从列到行的数据转换
- python-3.x - 在 PyGObject 中使用 Gtk.ComboBox 和 Gtk.TreeStore
- python - 如何比较单个文本文件中的行(具有时间戳)?
- c++ - 从对的向量中,我如何在 C++ 中找到密钥?
- mongodb - 如何根据嵌套字段值过滤 mongo 集合?
- laravel - 询问如何在刀片 Laravel 中显示数据透视表中的数据
- mysql - 行号和联合
- javascript - 如何使用 JavaScript 或 Angular 从 Web 下载文件到特定的本地文件夹
- python - 如何使用大型 numpy 数组优化 Python 中的内存分配?