【发布时间】:2025-12-04 05:00:01
【问题描述】:
我正在尝试在 Jenkins 共享库中创建一个函数,该函数会吐出当前 git 分支的父分支的最后提交哈希。
ParentBranch = 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
这很完美。
但是当我把它放在 Jenkins 的一个函数中时,它似乎什么也没做。我也尝试过转义特殊字符。
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 ""
什么都没有扩展。
请问我做错了什么?
【问题讨论】:
-
看起来更像是问题在于 everything 被扩展了。我不知道 Jenkins 如何替代事物,但从 shell 的角度来看,您可以使用
cat << "EOF"和带引号的结束标记来避免这种情况。另请注意,您说您在本地计算机上测试的脚本与您尝试放入gitBranch.sh的脚本不同的版本,并且计算机非常关心即使是微小的差异。 -
以前从未在
#!/bin/bash中看到过空间。添加一行git --version并查看它是否在sh中找到 git。 -
@IanW:那个空间曾经是必需的。在现代系统中,它已成为可选。
-
@IanW:嗯。我原以为要求是在 4.1BSD 中(我在 1980 年代初使用过),但也许它只是在 文档 中。