我使用 SVN-1.7.4 进行修订控制,并使用 atlassian JIRA 作为我的 LAMP 网站的问题跟踪器。如果我的任何团队成员提交但未提及相同的 Jira 问题密钥,我想限制 SVN 提交。我正在使用独立的 JIRA 并将其安装在我的服务器上。谷歌搜索给了我 Subversion Jira 插件 (https://studio.plugins.atlassian.com/wiki/display/SVN/Subversion+JIRA+plugin) 但它只能帮助我跟踪具有 JIRA 密钥的提交,而不是在限制他们。如果我应该发布有关该问题的更多细节,请告诉我。
7 回答
使用 JIRA ReST API 检查 JIRA 中是否存在问题并不难。
在我们的例子中,我使用了该pre-commit.tmpl
文件并在打开评论部分之后添加了以下内容:
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
CURL=/usr/bin/curl
JIRAURL=http://our.jira.url:8080/rest/api/latest/issue
# Make sure that the log message contains some text.
LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS")
echo ${LOGMSG} | grep "[a-zA-Z0-9]" > /dev/null || exit 1
# check that log message starts with a JIRA ticket
# should have format 'FOO-123: my commit message' or 'FOO-123 my commit message'
JIRAID=$(expr "${LOGMSG}" : '^\([A-Z]*-[0-9]*\)[: ].*')
if [[ "$JIRAID" == "" ]]
then
echo "No JIRA id found in log message \"${LOGMSG}\"" >&2
echo "Please use log message of the form \"JIRA-ID: My message\"" >&2
exit 1
fi
# check if JIRA issue exists
JIRAISSUE=$(${CURL} ${JIRAURL}/${JIRAID})
if [[ "${JIRAISSUE}" =~ "Issue Does Not Exist" ]]
then
echo "The JIRA id ${JIRAID} was not found" >&2
echo "Please use log message of the form \"JIRA-ID: My message\"" >&2
exit 1
fi
这要求消息的格式为“JIRA-id: text”或“JIRA-id test”。您可以使正则表达式更通用,以允许在文本中的任何位置使用 JIRA id。如果需要,您还可以添加检查${JIRAISSUE}
以确保问题是开放的,但这似乎足以满足我们的目的。
我碰巧有一个包含这个(以及许多其他事情)的预提交钩子。
该钩子可通过Git-Hub获得。它不会验证 Jira ID 是否存在,但它可以验证提交消息中是否存在类似 Jira 的 ID。这通常足以确保开发人员将 Jira 票号添加到他们的提交消息中。有一个示例control.ini
文件向您展示了如何在提交消息中检查类似 Jira 的票号。有效的提交消息的格式如下:
- 无:我修复了一个没有 Jira 票号的问题
- FDS-1231:我修复了一张 Jira 票
- FDS-1231、FDS-3232:我修复了几张 Jira 票
但是,比 pre-commit hook 更好的方法是改变工作场所的文化,让开发人员自然会将 Jira 票号放在提交消息中,并会自动给出更详细的提交消息。我发现使用像Jenkins这样的持续构建服务器可以做到这一点。
Jenkins 将在每次签入时自动构建您的代码。每个构建都会向您显示更改和提交注释。Jenkins 集成到 Jira 中,一键查看 Jira 信息。Jenkins 还将提交消息和构建 # 附加到 Jira 票证上,因此 QA 人员可以查看特定的 Jira 票证,并查看哪个构建修复了此票证。
突然,提交消息信息变得更加明显。开发人员和 QA 开始依赖它。不添加 Jira 票证的开发人员不会受到构建人员的追捕,而是受到他们的老板和其他开发人员的追捕。现在,发布良好的提交信息已成为该地方的文化。而且,这是一个比任何预提交钩子更好的执行器。
Atlassian 提供了一个触发器脚本,可以为大多数常见的 VCS 系统(包括 SVN)执行此操作,以及一个 JIRA 插件,可让您定义在提交描述中查找的内容。请参阅JIRA Commit Acceptance 插件页面。
好吧,我创建了一个简单的 shell 脚本(预提交)钩子来验证 jira 问题密钥是否由正则表达式提供并调用 REST API 以保证服务器上存在问题
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
JIRAURL=http://myown.jira.server:8080/rest/api/latest/issue
CURL=/usr/bin/curl
LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS")
# check if any comment has supplied by the commiter
if [ -z "$LOGMSG" ]; then
echo "Your commit was blocked because it have no comments." 1>&2
exit 1
fi
#check minimum size of text
if [ ${#LOGMSG} -lt 20 ]; then
echo "Your Commit was blocked because the comments does not meet minimum length requirements (20 letters)." 1>&2
exit 1
fi
# get jira ID by regex
JIRAID=$(expr "$LOGMSG" : '^\([A-Z]*-[0-9]*\)[: ].*')
# Check if jira id was found.
if [ -z "$JIRAID" ]; then
echo "No JIRA id found in log message \"$LOGMSG\"" 1>&2
echo "Please use log message of the form JIRA-ID: My message" 1>&2
exit 1
fi
# check if JIRA issue exists on the server
JSON_RETURN=$(${CURL} -s ${JIRAURL}/${JIRAID} -u username:password | grep -o "errorMessage")
if [ -n "$JSON_RETURN" ]; then
echo "The specified Jira Issue \"$JIRAID\" was not found in Jira server." 1>&2
echo "Please, verify the specified issue ID and try again!" 1>&2
exit 1
fi
以下脚本添加了正则表达式来查找任何模式,如 abc-123 并检查它是否存在于 jira 中。任何类似的模式也可能出现在评论的任何地方,但存在一个成功的模式将允许提交 -
#!/usr/bin/perl -w
$STATUS="1";
$REPOS=$ARGV[0];
$TXN=$ARGV[1];
$SVNLOOK="/usr/bin/svnlook";
$CURL="/usr/bin/curl";
$JIRAURL="http://x.x.x.x/jira/rest/api/2/issue";
$LOGMSG = `$SVNLOOK log -t $TXN $REPOS`;
chomp ($LOGMSG);
print "--$LOGMSG--\n";
if ($LOGMSG !~ /[A-Za-z][A-Za-z]*-[0-9][0-9]*/ ) {
print STDERR "NO JIRA case Found in comment - $LOGMSG";
exit (1);
}
@ARRAY= split (' ',$LOGMSG);
foreach (@ARRAY){
next if ! /[A-Za-z][A-Za-z]*-[0-9][0-9]*/ ;
chop();
$JIRAISSUE = `$CURL $JIRAURL/$_`;
chop ($JIRAISSUE);
if ($JIRAISSUE =~ /Issue Does Not Exist/){
print STDERR "The JIRA id $_ was not found\n";
}else { exit (0) };
}
exit ($STATUS);
Commit Policy Plugin是一个相当新的 JIRA 插件来强制执行此操作。
与此处建议的其他解决方案不同,它不仅验证提交消息中是否存在类似模式的问题键(如“FOO-123”),甚至可以将其与 JIRA 中的配置 JQL 查询匹配!
例如,这允许检查提到的问题是否是:
- 当前 sprint 中正在进行的用户故事
- 针对下一个产品版本的未解决的错误或任务
- 分配给团队负责人的高优先级任务(在代码冻结期间)
除了检查上述问题外,它还可以验证:
- 提交者的身份(他在 JIRA 中吗?他在 JIRA 组中吗?)
- 更改的文件(仅提交图像?有没有,.class, .obj,*.tmp 文件?所有 *.PNG 都在 /images 目录中?)
- 提交消息(这是 10+ 个字符长,没有空格吗?它是否以 JIRA 键开头?)
确保您查看文档并尝试一下。
免责声明:我是开发此插件的开发人员。尽管如此,这是解决此问题的最佳解决方案。
在预提交挂钩中使用简单的正则表达式之前,我已经看到了这一点。
从好的方面来说,它根本不需要检查 Jira,但这也意味着您可以在其中放入一些看起来像有效问题密钥的东西。