SVN-ANT 复制任务不起作用,来自 CLI 的 svn 复制不起作用,相同的参数



我使用的是SVN ANT版本1.3.1、ANT 1.7.1、Java 1.6u,SVN repo是1.6(我认为-proddbformat文件显示"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:buildpromote_prod.xml:210: Can't copy

它们让我认为,在尝试访问SVN回购上的路径之前,提交可能并没有一直完成?如果是,我该怎么做才能确保它等待提交通过?在我添加这个新的"标记版本号"目标之前,一切都很好(而且,记录在案,这是构建脚本中唯一一次运行目标"签入"。)

这个问题是别的吗?

您使用svn工具包吗?如果是这样的话,我今天在尝试将一些久经考验的构建脚本迁移到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版本)根本不能100%与SVN服务器1.7.x配合使用。它对我们的一些命令(包括导出)来说很好,但当使用SVN副本进行标记时,我们收到了上面描述的相同错误:

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.-1.0.9.zip,并按照安装说明进行操作,主要只是用适当的类路径声明taskdef。任务的用法与tigris的svnant略有不同。特别是

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

而不是

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

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

一旦完成,svn复制应该可以正常工作,从而可以应用ant中的标记。注意:确保opticylic的svnant任务在执行期间没有看到任何旧的svnant库。我以前在我的ant/lib中有与svn相关的jar,所以必须删除它们才能使用opticycic的svnant。

最后,我意识到,不幸的是,opticylic的svnant不支持svn导出,但我正在进行的构建需要它。因此,我被迫将两个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标签名称,同时给opticycic的标签svn2。通过这种方式,我们可以在蚂蚁脚本的过程中调用任意一个。只需记住,在任何特定时刻,您都在使用svnant所需的正确语法。

现在他们有了一些新的粉丝,也许opticycle会在他们的svnant中添加导出。这将允许我们简化以上内容,并直接使用更新的svnant。

相关内容

  • 没有找到相关文章

最新更新