2

使用 tfs.visualstudio.com 上托管的 Team Foundation 服务,可以在构建定义中选择“将构建输出复制到服务器”,这会创建可以通过团队 Web 访问通过 https 下载的放置文件夹的 zip。我真的需要自动下载这个drop,这样我就可以将输入链接到构建管道的下一个阶段。

不幸的是,放置 URL 并不明显,但可以使用TfsDropDownloader创建。

TL;DR - 我无法让 TfsDropDownloader 工作,我希望其他人已经使用此工具或类似方法从https://tfs.visualstudio.com成功下载了一个 drop

使用命令行 TfsDropDownloader.exe 我可以这样做:

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

...并获得一个空的 zip 文件,其中包含上一次成功构建的正确构建标签名称,例如 BuildDefinitionName_20130611.1.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 Service 帐户(即不是我的实时 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 列表,列出了 drop 中的每个文件,但没有 zip。

从使用 Fiddler 监视 SSL 流量到https://tfs.visualstudio.com,我看到单击“Download drop as zip”链接,我可以看到另一个端点位于:

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

...这确实给了你一个拉链。“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 回答