continuous-integration - 从托管的 Team Foundation Service 下载构建 drop

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

使用 tfs.visualstudio.com 上的托管 Team Foundation 服务,可以在构建定义中选择“将构建输出复制到服务器”,这会创建放置文件夹的 zip,可以通过团队网站通过 https 下载使用权。我真的需要自动下载这个 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:未授权。

最佳答案

我通过使用备用凭据让它工作,但我还必须通过不同的路径访问 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

我得到了 drop 中每个文件的一个很好的 JSON 列表,但没有 zip。

从监视 SSL 流量到 https://tfs.visualstudio.com使用 Fiddler,我看到单击“下载 zip 格式”链接我可以看到还有另一个端点:

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

...这确实给了你一个 zipper 。 “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;
}

这暂时对我有用。希望这可以帮助遇到同样问题的其他人!

关于continuous-integration - 从托管的 Team Foundation Service 下载构建 drop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17062581/

相关文章:

ios - 是否可以将Bamboo用于iOS CI?

azure-devops - 代理池和部署池

java - TeamCity 和挂起的 Git merge 分支提交保持构建失败的测试

jenkins - Docker 云自动构建

android - 将 InstrumentationTestRunner 和 AndroidJUnitRunner 与 Robotium 和 Espresso 一起使用

continuous-integration - 有什么比用于 .Net CI 的 CruiseControl 更好的吗?

java - 使用ant自动构建系统

visual-studio - 如何暂时安全地忽略 TFS 中的文件/更改

continuous-integration - 使用存档时忽略 xcodebuild 参数

python - 如何使用 travis-ci.org 测试需要键盘输入的项目?