Jenkins 流水线不扩展 Git 命令

Posted

技术标签:

【中文标题】Jenkins 流水线不扩展 Git 命令【英文标题】:Jenkins Pipeline Not Expanding Git Commands 【发布时间】:2021-10-26 22:58:20 【问题描述】:

我正在尝试在 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 &lt;&lt; "EOF" 和带引号的结束标记来避免这种情况。另请注意,您说您在本地计算机上测试的脚本与您尝试放入 gitBranch.sh 的脚本不同的版本,并且计算机非常关心即使是微小的差异。 以前从未在#!/bin/bash 中看到过空间。添加一行 git --version 并查看它是否在 sh 中找到 git @IanW:那个空间曾经是必需的。在现代系统中,它已成为可选。 好吧,我从来不知道;猜猜你永远不会太老而不能学习新东西。自 96 年以来一直在使用 Linux,并且使用过 Solaris、HP-UX、AIX、QNX,但从未遇到过!好像Q被问到了before;有趣的lore ... " 但事实证明,实际上不可能找到真正需要这个的 Unix。" @IanW:嗯。我原以为要求是在 4.1BSD 中(我在 1980 年代初使用过),但也许它只是在 文档 中。 【参考方案1】:

你的问题是 Jenkins(所以我删除了非 Jenkins 标签):Jenkins 使用 Groovy 来执行命令,Groovy 在字符串中使用自己的 $ 插值。您只需要保护这些特定的美元符号。另见Using "$" in Groovy 和illegal string body character after dollar sign : either escape a literal dollar sign "\$5" or bracket the value expression。

(我不是 Jenkins 或 Groovy 专家,我完全不喜欢 Jenkins,但这是任何使用它的人都应该知道的事情,因为那样做很邪恶。)

【讨论】:

这是我今天早上和"#!&lt;space&gt;/path" 不知道的两件事。谢谢。

以上是关于Jenkins 流水线不扩展 Git 命令的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins+Docker+Git+Harbor流水线打包

3种创建Jenkins流水线的方法 - Classic UI, BlueOcean, Git

CI/CD——构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台

CI/CD——构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台

Jenkins 流水线参数

Jenkins流水线项目发布流程