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}"
}
我正在尝试将更多 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}"
}