仅使用svn触发对提交到trunk的构建

时间:2009-07-20 06:52:31

标签: svn hudson post-commit

我刚刚在我们的subversion存储库中设置了一个post-commit脚本,它通过请求一个hudson构建URL来触发构建。

这可以正常工作,但是现在我只想在提交到主干时触发此构建。

我们的提交后脚本如下所示:

SET REPOS=%1
SET REV=%2

SET DIR=%REPOS%/hooks
SET PATH=%PATH%;%DIR%
wget http://circus-09:8080/job/UE/build?delay=0sec

如何检查提交是否已提交到主干?

4 个答案:

答案 0 :(得分:7)

这是一个快速的代码片段,当主干中的内容发生变化或没有变化时输出不同的消息:

set repos=%~1
set rev=%~2

call :did_it_change "%repos%" "%rev%" "trunk"
if %ERRORLEVEL%==1 (
    echo trunk changed
) else (
    echo no changes in trunk
)
exit /B 0

:did_it_change
    set repos=%~1
    set rev=%~2
    set dir=%~3
    set found=0
    for /F "delims=/" %%p in ('svnlook dirs-changed "%repos%" -r %rev% 2^>NUL') do call :check "%%p" "%dir%"
    exit /B %found%

:check
    set check_string=%~1
    set must_match=%~2
    if "$%check_string%" == "$%must_match%" set found=1
    exit /B 0

注意:did_it_change函数可以与任何存储库根级别子目录一起使用,而不仅仅是trunk。检测新标签或分支非常有用。另请注意,该函数可以被调用任意次。

注意:这实际上并不检查源文件是否已更改 - 它只是检查修订更改目录列表中是否提到了trunk。可能是因为某些目录或文件的svn属性发生了变化。

答案 1 :(得分:2)

据我所知,使用subversion没有简单的方法:post-commit脚本在任何提交到存储库之后运行,无论它是在trunk还是在分支中。

您可以尝试在脚本中确定已更改文件的位置(可能使用svnlook changed和一些正则表达式),当然..

答案 2 :(得分:2)

正如Paulius的回答所说,svnlook为您提供了修订的详细信息,它只需要一些操作。 使用python pysvn库有助于保护您免受这样做的一些内部因素的影响,并为一些更高级的集成打开了大门。

让您入门的示例:

import sys;
import urllib;
import svnlook;

#duckpunch to get access to the relative path for the revision
def relativePath(self):
    return self.path

baseUrl = sys.argv[1]
repo = sys.argv[2]
revision = sys.argv[3]

l = svnlook.changed(repo, revision);
#TODO this assumes all enries in the commit are against one project, so the first item found is sufficient
#May want to iterate the entries and check for any different paths
out = l[0]

changePath = relativePath(out)

print changePath

#TODO if 'trunk' is found in changePath, trigger build

答案 3 :(得分:0)

在bash中可以这样做:

REPOS="$1"
REV="$2"
TXN_NAME="$3"
SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
export LANG=en_US.UTF-8

RES=$($SVNLOOK dirs-changed $REPOS -r $REV)
if [[ $RES == *"trunk"* ]]
then
   Call whichever command you want to call when there are changes in trunk
fi