【问题标题】:Only trigger a build on commits to the trunk with svn仅使用 svn 触发对主干的提交构建
【发布时间】:2010-11-12 05:27:59
【问题描述】:

我刚刚在我们的 subversion 存储库中设置了一个提交后脚本,它通过请求一个 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

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

【问题讨论】:

  • 你为什么不使用 Hudsons 自己的 svn 观察者?
  • 因为(据我所知)它会定期拖钓存储库,并且会对我们脆弱的小型服务器产生性能影响。另外,我不确定它是否会解决仅在主干提交时才构建的问题。
  • @tuergeist:a) 0xC0DEFACE 所说的 - 无需一直轮询存储库,b) 很容易批量完成(请参阅我的回答)。
  • 轮询对我们的构建服务器没有太大影响。您真的衡量了性能影响吗?
  • 如果有人给我一个任务——我不希望他每 5 分钟就来找我问我是否完成了,我宁愿在我完成后自己告诉他。 ..同样的事情。

标签: svn hudson post-commit


【解决方案1】:

这是一个快速代码 sn-p,当中继中的某些内容发生变化或没有任何内容时,它会输出不同的消息:

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 函数可以用于任何存储库根级别的子目录,而不仅仅是主干。非常有用,用于检测新标签或分支。另请注意,该函数可以调用任意次数。

注意:这实际上并不检查源文件是否被更改 - 它只是检查是否在修订更改目录列表中提到了主干。可能是修改了某些目录或文件的svn属性。

【讨论】:

  • 我稍微编辑了代码:第一个版本在函数中硬编码了“主干”(doh!),然后我认为当 svnlook 的错误输出被丢弃时它会更有用。
  • 由于我对Windows批处理命令非常缺乏经验,这篇文章结束了两个小时的搜索,非常感谢
【解决方案2】:

据我所知,使用 subversion 没有简单的方法来做到这一点:提交后脚本在任何提交到存储库之后运行,无论它是在主干还是在分支中。

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

【讨论】:

    【解决方案3】:

    正如 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
    

    【讨论】:

    • 哇,我不知道 python 有这样的 api...pysvn 看起来不错。
    【解决方案4】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多