2

我正在使用 SVN ANT 版本 1.3.1、ANT 1.7.1、Java 1.6u,并且 SVN 存储库是 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 存储库上的路径之前,提交可能没有完成?如果是这样,我该怎么做才能确保它等待提交通过?在我添加这个新的“tag-version-number”目标之前,一切都很好(并且,为了记录,这是构建脚本中唯一一次运行目标“check-in”。)

问题是别的吗?

4

1 回答 1

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 版本)根本无法 100% 与 SVN 服务器 1.7.x 一起工作。它适用于我们的某些命令,包括导出,但是当使用 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。该任务的用法与tigris的svnant略有不同。具体是

<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。

最后,我意识到 opticylic 的 svnant 不支持 svn 导出,但我们需要它用于我正在处理的构建。因此,我被迫让 BOTH 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。通过这种方式,我们可以在 ant 脚本的过程中调用任何一个。请记住要注意您在任何给定时刻都使用了您正在使用的 svnant 所需的正确语法。

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

于 2012-12-08T05:44:31.453 回答