5

我使用 SVN-1.7.4 进行修订控制,并使用 atlassian JIRA 作为我的 LAMP 网站的问题跟踪器。如果我的任何团队成员提交但未提及相同的 Jira 问题密钥,我想限制 SVN 提交。我正在使用独立的 JIRA 并将其安装在我的服务器上。谷歌搜索给了我 Subversion Jira 插件 (https://studio.plugins.atlassian.com/wiki/display/SVN/Subversion+JIRA+plugin) 但它只能帮助我跟踪具有 JIRA 密钥的提交,而不是在限制他们。如果我应该发布有关该问题的更多细节,请告诉我。

4

7 回答 7

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}以确保问题是开放的,但这似乎足以满足我们的目的。

于 2014-09-11T16:26:20.140 回答
5

我碰巧有一个包含这个(以及许多其他事情)的预提交钩子。

该钩子可通过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 票证的开发人员不会受到构建人员的追捕,而是受到他们的老板和其他开发人员的追捕。现在,发布良好的提交信息已成为该地方的文化。而且,这是一个比任何预提交钩子更好的执行器。

于 2012-05-08T13:24:42.227 回答
4

Atlassian 提供了一个触发器脚本,可以为大多数常见的 VCS 系统(包括 SVN)执行此操作,以及一个 JIRA 插件,可让您定义在提交描述中查找的内容。请参阅JIRA Commit Acceptance 插件页面

于 2012-05-08T13:08:59.930 回答
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
于 2015-11-09T16:52:27.810 回答
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);
于 2017-02-14T10:23:14.083 回答
1

Commit Policy Plugin是一个相当新的 JIRA 插件来强制执行此操作。

与此处建议的其他解决方案不同,它不仅验证提交消息中是否存在类似模式的问题键(如“FOO-123”),甚至可以将其与 JIRA 中的配置 JQL 查询匹配!

例如,这允许检查提到的问题是否是:

  • 当前 sprint 中正在进行的用户故事
  • 针对下一个产品版本的未解决的错误或任务
  • 分配给团队负责人的高优先级任务(在代码冻结期间)

除了检查上述问题外,它还可以验证:

  • 提交者的身份(他在 JIRA 中吗?他在 JIRA 组中吗?)
  • 更改的文件(仅提交图像?有没有,.class, .obj,*.tmp 文件?所有 *.PNG 都在 /images 目录中?)
  • 提交消息(这是 10+ 个字符长,没有空格吗?它是否以 JIRA 键开头?)

确保您查看文档并尝试一下。

免责声明:我是开发此插件的开发人员。尽管如此,这是解决此问题的最佳解决方案。

于 2015-08-26T08:16:17.530 回答
0

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

从好的方面来说,它根本不需要检查 Jira,但这也意味着您可以在其中放入一些看起来像有效问题密钥的东西。

于 2012-05-08T13:03:20.010 回答