3

我们有以下工具:

  • 颠覆(版本 1.5.9)
  • Polarion(版本 3.2.2)

Polarion 基于 Subversion,因此在更改任何内容的每个操作(通常是这种情况)上,Polarion 将使用 Subversion 提交来更改任何内容。目前所有的东西都存储在一个且只有一个存储库中,因此每个用户的每次提交(同一个存储库中的大约 100-200 个)都会触发预提交挂钩。

那么提供预提交钩子的最佳策略是什么?

  • 仅触发某些项目,但不是所有项目
  • 尽可能快地运行,因为每个预提交挂钩都会阻止所有其他提交。

我们尝试使用 Java(使用 SVNKit)实现预提交挂钩,但这将在每次提交 Java VM 时开始。那么有什么想法可以很好地实现吗?

4

5 回答 5

3

我最近使用 Python 实现了一个post-commit钩子,它扫描同一存储库中的不同项目,然后采取相应的行动。我是 Python 新手,因此以下脚本中可能存在一些效率低下(甚至是完全错误),但它确实适用于我们的目的:

#!/usr/bin/env python

import commands
from subprocess import *
import os
import sys

# This is a post-commit hook.  The arguments passed to the hook
# are different than a pre-commit hook, and the syntax/use for
# svnlook will probably be different too.

def check_repo_and_do_stuff(repos, rev):

    dirs_changed_cmd =
    p1 = Popen('%s dirs-changed %s -r %s' % (SVNLOOK, repos, rev)
    dirs_changed = p1.communicate[0]

    for line in dirs_changed:

        if line.find('/part-of-path-for/project1') >= 0:
            do_stuff_for_project1()

        if line.find('/part-of-path-for/project2') >= 0:
            do_stuff_for_project2()

def do_stuff_for_project1()...

def do_stuff_for_project2()...

SVNLOOK='/usr/bin/svnlook'

# Take the arguments that svnserve passes on the command-line
repos = sys.argv[1]
rev = sys.argv[2]

check_repo_and_do_stuff(repos, rev)

我希望这会有所帮助。

-扎卡里

于 2010-01-13T20:38:08.660 回答
2

如果 Java 让事情变慢,但 Java 只在一小部分时间使用,那么我会用轻量级的东西编写钩子。即在 Windows 上,使用 .bat 文件。然后,对于需要它的项目(或文件或用户),从轻量级挂钩中调用更昂贵的 Java 挂钩。这样,您只会在需要时减慢提交速度。

于 2010-03-20T00:27:56.710 回答
1

基于 Java 的 Hook 脚本速度很慢,通常会影响 Subversion 的响应时间,尤其是。如果您在负载较重的服务器上工作。将实现最佳绩效以实施审计和指标以提高质量。通过跟踪审计中的可追溯性,项目团队可以跟踪其进度,获得越来越好的水平。

于 2010-01-13T20:19:48.957 回答
1

在许多情况下,通过监视存储库更改的持续集成服务器可以更好地处理繁重的任务。这可以确保脚本永远不会减慢存储库的速度,并且这些工具通常具有更好的构建、验证和更新任务的错误报告。

缺点是他们不能否认提交的发生......这些任务必须作为钩子处理,但实际上您可以将大多数工作延迟到一些提交后处理。

于 2010-03-20T18:49:36.827 回答
0

您能做的最好的事情就是停止使用一个存储库来处理所有事情。

除了更好的性能之外,这将使您可以对您的存储库进行细粒度控制,允许您拥有单独的访问控制、每个存储库(项目)的单独挂钩等。

于 2010-01-12T17:36:51.160 回答