Svn 如果Jira Issue密钥不在提交消息中,则限制Subversion提交

Svn 如果Jira Issue密钥不在提交消息中,则限制Subversion提交,svn,commit,jira,Svn,Commit,Jira,我正在使用SVN-1.7.4进行修订控制,并将atlassian JIRA用作我的LAMP网站的问题跟踪程序。如果我的任何团队成员在没有提及Jira问题密钥的情况下提交,我想限制SVN提交。 我正在使用JIRA standalone,并已将其安装在我的服务器上。谷歌搜索给了我Subversion Jira插件(https://studio.plugins.atlassian.com/wiki/display/SVN/Subversion+JIRA+插件)但它只能帮助我跟踪具有JIRA密钥的提交,

我正在使用SVN-1.7.4进行修订控制,并将atlassian JIRA用作我的LAMP网站的问题跟踪程序。如果我的任何团队成员在没有提及Jira问题密钥的情况下提交,我想限制SVN提交。 我正在使用JIRA standalone,并已将其安装在我的服务器上。谷歌搜索给了我Subversion Jira插件(https://studio.plugins.atlassian.com/wiki/display/SVN/Subversion+JIRA+插件)但它只能帮助我跟踪具有JIRA密钥的提交,而不是限制它们。
请让我知道,如果我应该张贴任何关于这个问题的细节

在预提交钩子中使用简单正则表达式之前,我已经看到了这一点


另一方面,它根本不需要检查Jira,但这也意味着您可以在其中放入看起来像是有效问题密钥的内容。

Atlassian提供了一个触发器脚本,可用于包括SVN在内的大多数常见VCS系统,另外还有一个Jira插件,允许您在提交描述中定义要查找的内容。请参阅。

我碰巧有一个预提交钩子,它涵盖了这一点(以及许多其他内容)

挂钩可通过以下方式获得:。它不验证Jira ID是否存在,但可以验证提交消息中是否存在类似Jira的ID。这通常足以确保开发人员在提交消息中添加Jira票证号。有一个示例
control.ini
文件显示了如何在提交消息中检查类似Jira的票证号。有效的提交消息的格式如下:

  • 无:我修复了一个没有Jira票号的问题
  • FDS-1231:我订了一张Jira票
  • FDS-1231,FDS-3232:我修了几张Jira的票
然而,比预提交挂钩更好的方法是改变工作场所的文化,这样开发人员自然会将Jira票证号放入提交消息中,并自动给出更详细的提交消息。我发现使用像这样的连续构建服务器可以做到这一点

Jenkins将在每次签入时自动生成您的代码。每个构建都会显示更改和提交注释。Jenkins集成到Jira,因此只需单击一下,您就可以看到Jira信息。Jenkins还将附加提交消息并构建到Jira票证上,这样QA人员可以查看特定的Jira票证,并查看哪个构建修复了此票证


突然,提交消息信息变得更加可见。开发人员和QA开始依赖它。没有添加Jira票证的开发人员,不是被构建人员跟踪,而是被他们的老板和其他开发人员跟踪。现在,发布好的提交消息已成为当地的文化。而且,这是一种比任何预提交钩子都更好的执行器。

使用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}
上添加检查,以确保问题在需要时是开放的,但这似乎足以满足我们的目的。

是一个全新的JIRA附加组件,用于强制执行此功能

与这里建议的其他解决方案不同,它不仅验证提交消息(如“FOO-123”)中是否存在类似问题密钥的模式,而且还与JIRA中的configure JQL查询相匹配

例如,这允许检查所提及的问题是否为:

  • 当前sprint中正在进行的用户故事
  • 针对下一个产品版本的未解决错误或任务
  • 分配给团队领导的高优先级任务(代码冻结期内)
除了检查上述问题外,它还可以验证:

  • 提交人的身份(他在JIRA?他在JIRA团队吗?)
  • 更改的文件(仅提交图像?是否有任何.class、.obj、*.tmp文件?所有*.PNG都在/images目录中?)
  • 提交消息(是否有10多个字符长且没有空格?是否以JIRA键开头?)
你一定要试试看


免责声明:我是这个附加组件的开发人员。不过,这是解决这个问题的最佳解决方案。

我创建了一个简单的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

下面的脚本添加了regex来查找任何类似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);

我了解工作场所的变革文化,但我们是一家初创公司,团队规模很小。虽然我一直在努力实现这一点,但偶尔人们会提交不加入JIRA的问题。最新版本的JIRA不支持此插件,而且它本身也有一段时间没有更新。我试图使用它,但我的JIRA实例发生了非常糟糕的事情。@JeremyK我在解决方案中建议的提交策略插件实际上是旧的提交接受插件的替代品。它针对新的JIRA版本进行了更新,只需单击一下即可安装,并利用了所有现代JIRA功能(JQL、REST、P2等)。试试看,你会喜欢的。