我正在使用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”目标之前,所有东西都提交得很好(并且,对于记录,这是构建脚本中唯一一次目标“签入”正在运行。)
这个问题还有别的吗?
答案 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。