SVN-ANT复制任务不起作用,从CLI执行svn复制,同样的参数

时间:2012-07-19 05:40:06

标签: svn ant tagging svnant

我正在使用SVN ANT版本1.3.1,ANT 1.7.1,Java 1.6u,SVN repo是1.6(我认为 - prod\db\format文件说“4”。)

我有两个SVN目标(我想知道在“复制”任务尝试执行之前“提交”任务是否未完成,这就是我将其作为build.xml的一部分引用的原因。)

我试图将版本标记为生产版本(对于依赖SVN-ANT的ANT构建来说,这似乎是一项相当常见的任务,对吧?)我可以在命令行上执行以下操作:

svn copy http://svnserver/svn/prod/Production/App \
     http://svnserver/svn/prod/Archive/App/1.5 \
     -m "Tagging Release of App as Version 1.5"

我当然得到了

Committed revision 27.

然而,当我尝试:

<target name="check-in" >
    <svn refid="svn.settings">
        <commit message="${application.name} - Committed to Prod" > 
            <fileset dir="${src.dir}">
                <include name= "**/*"/>
            </fileset>
        </commit>
    </svn>
</target>

<target name="tag-version-number" depends="check-in" >
    <svn refid="svn.settings">
        <copy
            srcUrl="http://svnserver/svn/prod/Production/App/"
            destUrl="http://svnserver/svn/prod/Archive/App/1.5/"
            message="Tagging Release of App as Version 1.5">
        </copy>
    </svn>
</target>

我回到了奇怪的错误:

check-in:

tag-version-number:
      [svn] svn: File not found: revision 28, path '/Production/App/Production/App'
      [svn] svn: '/svn/prod/!svn/bc/28/Production/summons' path not found: 404 Not Found (http://svnserver)
      [svn] svn: File not found: revision 28, path '/Production/App/Production/App'
      [svn] svn: '/svn/prod/!svn/bc/28/Production/summons' path not found: 404 Not Found (http:/svnserver)
      [svn] <Copy> failed.

BUILD FAILED
C:\build\promote_prod.xml:210: Can't copy

他们让我觉得在尝试访问SVN repo上的路径之前,提交可能没有完全通过?如果是这样,我该怎么做才能确保它等待提交通过?在我添加这个新的“tag-version-number”目标之前,所有东西都提交得很好(并且,对于记录,这是构建脚本中唯一一次目标“签入”正在运行。)

这个问题还有别的吗?

1 个答案:

答案 0 :(得分:4)

您使用的是svn-kit吗?如果是这样,我今天遇到了同样的问题,同时试图将一些经过验证的真实构建脚本迁移到Jenkins的新实例中。在准备正式版本时,我们使用版本号进行标记,然后根据标记提取代码以构建它。和OP一样,我觉得这必须是一个非常标准的用例。

顺便说一句,使用-v标志运行ant,svnant将报告它是使用svnkit,javahl还是回退到命令行:

  [svn] Using svnkit
  [svn] <Export> started ...
  [svn] export -r HEAD https://foo.com/svn/project

尽我所知,svnant 1.3.1(以及它依赖的svnkit的版本)对于SVN服务器1.7.x来说根本不起作用100%。它适用于某些命令,包括导出,但是当使用svn copy进行标记时,我们得到了上述相同的错误:

22:06:48        [svn] copy -rHEAD https://foo.com/svn/project/trunk https://foo.com/svn/project/tags/tag3
22:06:48        [svn] svn: File not found: revision 64, path '/project/trunk/project/trunk'
22:06:48        [svn] svn: '/svn/project/!svn/bc/64/project/trunk' path not found: 404 Not Found (https://foo.com)
谢天谢地,救世主的名字是opticylic。在浏览器中打开一个新标签,然后转到:

https://github.com/opticyclic/svntask

从下载部分获取svntask-1.7-1.0.9.zip并遵循安装说明,主要是通过使用适当的类路径声明taskdef。该任务的使用与底格里斯河的情况略有不同。具体来说就是

<copy src="url" dst="url2" commitMessage="tmbg"/> 

而不是

<copy srcUrl="url" destUrl="url2" message="flood"/>, 

并且不再支持新的svnsettings,因此您必须直接在标记中指定用户名和密码。

完成此操作后,svn copy应该可以正常工作,从而可以应用ant中的标记。注:确保opticylic的svnant任务在执行期间没有看到任何旧的svnant库。我以前在我的ant / lib中有svn相关的jar,所以不得不删除它们才能使用opticyclic的svnant。

最后,我意识到svn export很遗憾不受opticylic的svnant支持,但是我们需要它来处理我正在进行的构建。因此,我被迫为我的构建提供两个svnant。只要你单独指定它们的两个类路径并且(重要!)给它们中的一个新名称,因为它们都默认使用svn作为标记名),你应该能够这样做:

<path id="svnant.classpath">
        <fileset dir="lib/svnant">
          <include name="*.jar"/>
        </fileset>
</path>
<typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="svnant.classpath"/>

<path id="svnant2.classpath">
            <fileset dir="lib/svn2">
              <include name="*.jar"/>
            </fileset>
</path>
<taskdef name="svn2" classname="com.googlecode.svntask.SvnTask" classpathref="svnant2.classpath"/>

在这里,我允许tigris'svnant声明默认的'svn'标签名称,同时给予opticyclic标签svn2。通过这种方式,我们可以在蚂蚁脚本的过程中调用。请记住要注意,您正在使用您在任何特定时刻使用的svnant所需的正确语法。

也许opticyclic会为他们的svnant添加导出,因为他们有一些新的粉丝。这将使我们能够简化上述内容并直接使用更新的svnant。