2

私は SVN ANT バージョン 1.3.1、ANT 1.7.1、Java 1.6u を使用しており、SVN リポジトリは 1.6 です (prod\db\formatファイルには「4」と表示されていると思います)。

2 つの 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 を使用していますか? もしそうなら、私は今日同じ問題に遭遇しました. 公式リリースを準備するときは、リリース番号をタグ付けし、タグに基づいてコードをプルしてビルドします。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)

ありがたいことに、オプチリックという名前の救世主がそこにいました。ブラウザで新しいタブを開き、次の場所に進みます。

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 を使用するには、それらを削除する必要がありました。

最後に、残念ながら 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"/>

ここでは、ティグリスの svnant がデフォルトの 'svn' タグ名を主張できるようにし、オプティサイクリックにタグ svn2 を与えています。このようにして、ant スクリプトの過程でいずれかを呼び出すことができます。いつでも使用している svnant に必要な正しい構文を使用していることに注意してください。

おそらく、オプティサイクリックは、新しいファンが数人増えたので、svnant にエクスポートを追加するでしょう。これにより、上記を単純化し、新しい svnant を完全に使用することができます。

于 2012-12-08T05:44:31.453 に答える