从托管的Team Foundation Service下载构建删除

时间:2013-06-12 09:55:53

标签: continuous-integration build-automation continuous-deployment azure-devops

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

不幸的是,丢弃网址并不明显,但可以使用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:未经授权。

1 个答案:

答案 0 :(得分:6)

我通过使用备用凭据来实现它,但我还必须通过不同的路径访问REST API。

当前TfsDropDownloader构建一个如下所示的网址:

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我看到点击“下载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;
}

这对我来说暂时有用。希望这可以帮助其他人解决同样的问题!