2

tfs.visualstudio.com でホストされている Team Foundation Service を使用すると、ビルド定義に「ビルド出力をサーバーにコピーする」オプションがあり、ドロップ フォルダーの zip が作成され、チーム Web アクセス経由で https 経由でダウンロードできます。このドロップを自動的にダウンロードする必要があるため、ビルド パイプラインの次のステージに入力をチェーンできます。

残念ながら、ドロップ URL は明らかではありませんが、TfsDropDownloaderを使用して作成できます。

TL;DR - TfsDropDownloader を機能させることができません。他の誰かがこのツールまたは同様の方法を使用して、https://tfs.visualstudio.com からドロップを正常にダウンロードしたことを願っています。

コマンド ライン TfsDropDownloader.exe を使用すると、次のことができます。

TfsDropDownloader.exe /c:"https://MYPROJECTNAME.visualstudio.com/DefaultCollection" /t:"ProjectName" /b:"BuildDefinitionName" /u:username /p:password

...そして、最後に成功したビルドの正しいビルド ラベル名を持つ空の zip ファイルを取得します。例: BuildDefinitionName_20130611.zip

デバッガーでソース コードを実行すると、ダウンロード用に生成された URL が次のようになるためです。

https://tflonline.visualstudio.com/DefaultCollection/_apis/resources/containers/804/drop/BuildDefinitionName_20130611.1.zip

..サポートされていない application/json のコンテンツ タイプを返します。この例外はアプリケーションによって飲み込まれますが、空の zip ファイルが作成される前ではありません。

Team Foundation Service の REST API が何らかの方法で変更されたため、生成された URL が正しくなくなった可能性はありますか?

Team Foundation サービス アカウント (つまり、ライブ ID ではない) で定義された "代替資格情報" を使用していることに注意してください。それ以外のものを使用すると、TF30063: 承認されていません。

4

1 に答える 1

6

別の資格情報を使用して機能させましたが、別のパスを介して REST API にアクセスする必要もありました。

現在のTfsDropDownloaderは、次のような URL を作成します。

https://project.visualstudio.com/DefaultCollection/_apis/resources/containers/804/drop/BuildDefinitionName_20130611.1.zip

これを使用しようとすると、空の JSON が返されます。URLを次のように微調整すると、間違いなく認証されます。

https://project.visualstudio.com/DefaultCollection/_apis/resources/containers/804/drop

ドロップ内のすべてのファイルの優れた JSON リストを取得しますが、zip は取得しません。

Fiddler を使用してhttps://tfs.visualstudio.comへの SSL トラフィックをスパイすると、[Download drop as zip] リンクをクリックすると、次の場所に別のエンドポイントがあることがわかります。

https://project.visualstudio.com/DefaultCollection/ProjectName/_api/_build/ItemContent?buildUri=vstfs%3a%2f%2f%2fBuild%2fBuild%2f639&path=%2Fdrop

...これはzipを提供します。「vstfs%3a%2f%2f%2fBuild%2fBuild%2f639」の部分は URL エンコードされた BuildUri です。

そこで、TfsDropDownloader ソースの GetServerPath のバージョンを次のように変更しました。

private static string GetServerPath(TfsConnection collection, IBuildDetail buildDetail)
{
    var downloadPath = string.Format("{0}{1}/_api/_build/ItemContent?buildUri={2}&path=%2Fdrop",
                                            collection.Uri, 
                                            HttpUtility.UrlPathEncode(buildDetail.TeamProject), 
                                            HttpUtility.UrlEncode(buildDetail.Uri.ToString()));

    return downloadPath;
}

これは当分の間私にとってはうまくいきます。うまくいけば、これは同じ問題を抱えている他の誰かに役立ちます!

于 2013-06-13T10:57:15.577 に答える