我使用SVN-1.7.4进行版本控制,使用atlassian JIRA作为LAMP网站的问题跟踪器。我希望限制SVN提交,如果我的任何团队成员提交,而不提及相同的Jira Issue密钥。 我正在使用JIRA standalone并将其安装在我的服务器上。谷歌搜索给了我Subversion Jira插件(https://studio.plugins.atlassian.com/wiki/display/SVN/Subversion+JIRA+plugin),但它只能帮助我跟踪有JIRA密钥的提交,而不是限制他们。 如果我发布有关该问题的更多细节,请告诉我。
答案 0 :(得分:8)
使用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}
上添加检查,以确保问题在需要时打开,但这似乎足以满足我们的目的。
答案 1 :(得分:5)
我碰巧有一个预提交钩子,涵盖了这个(以及许多其他事情)。
该钩子可以通过Git-Hub获得。它不验证Jira ID是否存在,但它可以验证提交消息中是否存在类似Jira的ID。这通常足以确保开发人员在其提交消息中添加Jira票号。有一个示例control.ini
文件,向您展示如何在提交消息中检查 Jira like 票号。有效的提交消息的格式如下:
但是,比预提交钩子更好的方法是改变工作场所的文化,这样开发人员自然会将Jira票号放在提交消息中,并自动提供更详细的提交消息。我发现使用像Jenkins这样的连续构建服务器可以做到这一点。
Jenkins将在每次签入时自动构建您的代码。每个构建都会显示更改和提交注释。 Jenkins集成到Jira,只需点击一下,即可看到Jira信息。 Jenkins还会附加提交消息并在Jira票证上构建#,因此QA人员可以查看特定的Jira票证,并查看修复此票证的构建。
突然,提交消息信息变得更加明显。开发人员和QA开始依赖它。不添加Jira票证的开发人员不是由那些执行构建的人,而是他们的老板和他们的开发人员。现在,提交好的提交消息就成了这个地方的文化。并且,这是一种比任何预提交钩子更好的执行器。
答案 2 :(得分:4)
Atlassian提供了一个触发器脚本,可以为大多数常见的VCS系统(包括SVN)执行此操作,还可以使用JIRA插件来定义提交描述中要查找的内容。请参阅JIRA Commit Acceptance plugin page。
答案 3 :(得分:3)
好吧,我创建了一个简单的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
答案 4 :(得分:1)
Commit Policy Plugin是一个相当新的JIRA附加组件,用于强制执行此操作。
与此处建议的其他解决方案不同,它不仅可以验证提交消息中是否存在类似模式的问题密钥(例如" FOO-123"),甚至可以匹配在JIRA中配置JQL查询!
例如,这可以检查上述问题是否为:
除了检查上述问题外,它还可以验证:
确保check out the documentation并尝试一下。
免责声明:我是开发此附加组件的开发人员。不过,这是解决此问题的最佳解决方案。
答案 5 :(得分:1)
以下脚本添加了正则表达式以查找任何类似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);
答案 6 :(得分:0)
在使用预提交挂钩中的简单正则表达式之前,我已经看到了这一点。
从好的方面来说,根本不需要检查Jira,但这也意味着你可以放一些看似有效的问题密钥的东西。