Jenkins 和 Git - 如何获取提交者的姓名?

Jenkins and Git - how to grab a committer's name?

我正在尝试将更多 GIT 提交信息放入 HipChat 聊天室。

我看到有许多 GIT 变量可以在 jenkins 中使用。我正在执行作业的 Shell 步骤。

这些作品:

echo "${GIT_BRANCH}"

echo "${GIT_URL}"

echo "${GIT_COMMIT}"

这些不:

echo "${GIT_COMMITTER_EMAIL}"

echo "${GIT_COMMITTER_NAME}"

echo "${GIT_AUTHOR_EMAIL}"

echo "${GIT_AUTHOR_NAME}"   

echo "${GIT_USER}"

问题 1:为什么上面的变量不起作用?

这个有效:

git show --name-only

问题二:为什么我做不到 富 = "git show --name-only" 并在工作的其他地方使用 Foo,即发送到 HipChat?

我看到有一个插件 envInject。但这是在执行 shell 步骤时写入工作区中的文件,然后从该文件中读取。对于我正在尝试做的事情,这似乎有点矫枉过正。

问题 3:envInject 是我唯一的选择吗?

您需要显式执行 git 命令并将其输出放入变量中。在bash中,这叫做command substitution

foo=$(git show --name-only)

如果您使用的是 gerrit 触发器插件,您可以获得如下信息: ${GERRIT_CHANGE_OWNER} 或 ${GERRIT_CHANGE_OWNER_NAME},否则,请尝试使用@Matt 提到的方式,在您要使用此变量之前,只需在您的 jenkins 中创建一个简单的 shell 脚本,然后读取它,将它注入到一个文件中,稍后你可以将它用作普通参数。

我不知道为什么有些变量可用而有些变量不可用,但似乎您不是唯一遇到该问题的人(参见 Git plugin for Jenkins: How do I set env variables GIT_AUTHOR_EMAIL and GIT_COMMITTER_EMAIL?)。

使用例如git show -s --pretty=%an 获取作者姓名并通过命令替换将其存储在变量中,如@MattKneiser 所述:

foo=$(git show -s --pretty=%an)

此变量在 Jenkins 作业的其他 shell 步骤中不可用,但您可以将其保存到工作区中的文件中,

echo "foo=\"$foo\"" > $WORKSPACE/envvars

然后在另一个 shell:

中获取该文件
. $WORKSPACE/envvars

在你的 jenkinsfile 中使用这个函数:

def author = ""
def changeSet = currentBuild.rawBuild.changeSets               
for (int i = 0; i < changeSet.size(); i++) 
{
   def entries = changeSet[i].items;
   for (int i = 0; i < changeSet.size(); i++) 
            {
                       def entries = changeSet[i].items;
                       def entry = entries[0]
                       author += "${entry.author}"
            } 
 }
 print author;

我的做法

script{
 def COMMITTER_EMAIL = bat(
    script: "git --no-pager show -s --format='%%ae'",
    returnStdout: true).split('\r\n')[2].trim() 
    echo "COMMITTER_EMAIL: ${COMMITTER_EMAIL}" 
}