如何在 TeamCity Nuget Feed 上删除特定版本的包?
Posted
技术标签:
【中文标题】如何在 TeamCity Nuget Feed 上删除特定版本的包?【英文标题】:How to remove a specific version of a package on a TeamCity Nuget Feed? 【发布时间】:2012-04-30 09:23:50 【问题描述】:有谁知道要在 TeamCity Nuget Feed 上删除特定版本的包?
【问题讨论】:
我们正在尝试使用命令行工具 (delete) 来处理此问题,但删除命令需要一个 API 密钥,而我们没有为我们的本地 TeamCity 使用一个。有没有人找到解决方案? 【参考方案1】:首先,在 TeamCity 中删除临时 NuGet 包似乎是 not directly supported。 JetBrains 有一个 open issue 关于它,但目前没有计划修复。也就是说,我们设计了一种解决方法,使我们解决了我们的具体问题,并且可能对您的问题有所帮助。
我们有一系列 nupkg 文件使用了不正确的(加速)版本。因此,它们似乎比我们现在创建的包“更新”。由于无法仅删除不正确的版本,我们将每个单独的 TeamCity 构建配置的“清理工件”策略设置为较短的窗口(2 天)并运行清理。您需要系统管理员权限才能执行此操作。
这删除了比上一个工件早一天的所有工件,并清除了我们所有的坏包。我们通过 NuGet 命令行 List
命令验证了这一点。由于更新的包是正确的,我们现在只在 NuGet 源中宣传好的包。
诚然,这是一个“精确核弹”选项,可能并不适合所有人。我希望 TeamCity 在不久的将来全面支持 NuGet 命令行 API。
【讨论】:
您在哪里可以找到“清洁工件”政策? 在管理 -> 构建历史清理(在项目下)-> 配置清理规则下找到它 这正是我在重命名项目后清理所有具有旧项目名称的包的方法。谢谢!!【参考方案2】:我知道这是很久以前问过的,但我仍然时不时地遇到这个问题,而且我总是忘记如何去做,所以我想我会发布我认为可能会稍微容易一些的解决方案(取决于你看它的方式)。
基本上,我运行了一个 TeamCity 构建,不幸的是创建了一个 3rd 方包的 duff 版本,我试图重新创建它,但做了一些修改。它没有用,但这意味着我总是在包管理器中看到这个 duff 包,并且在第 3 方发布更新版本之前它会保持这种状态。因此,我想从 TeamCity Nuget 服务器中删除包,而我能找到的唯一方法是删除构建,该构建也会删除人工制品(在本例中为 duff Nuget 包)。
现在,除了使用 REST API 之外,我看不到删除构建的方法,所以这就是我使用的方法(我希望我不是愚蠢的,实际上有一种从 UI 中删除构建的简单方法)。我使用 fiddler 来生成 DELETE 命令。这是通过简单地发布一个类似于我在下面显示的删除请求来实现的:
从 fiddler 转到 Composer 窗口。选择“DELETE”而不是“GET”,然后在下面的表格中输入您的 TeamCity 网址:
http://<server>:<port>/httpAuth/app/rest/builds/<build ID>
当您从 TeamCity 中选择要删除的构建时,只需检查 URL 即可找到构建 ID(查找“buildId”查询参数后的数字)。唯一的其他步骤是将授权标头添加到命令中。在“请求标头”窗口中的“用户代理”下方的行中输入以下内容。
Authorization: Basic (Username:Password encoded as base64)
要将您的用户名/密码编码为 base64,请转到 fiddler 中的工具->文本向导,然后以这种格式输入您的 TeamCity 详细信息 - 用户名:密码。最后,您应该选择“执行”按钮,一切顺利,构建将与 Nuget 包一起被删除。
这对我有用,但显然在执行所有这些操作时要小心,因为您不想删除错误的构建。谨慎的做法是先备份/快照您的 TeamCity 服务器。
希望这对某人有所帮助。
【讨论】:
这行得通..!可能需要运行 reindex (youtrack.jetbrains.com/issue/TW-19959#comment=27-406085) 或重启 teamcity 服务器来清理缓存的索引。 这似乎很激烈 像魅力一样工作!非常感谢。您也可以使用Postman chrome extension 来简化此操作。 我创建了一个脚本来执行此操作。在下面寻找答案。 我能够从构建历史页面中删除构建。在右上角有一个 Actions 下拉菜单,其中有一个 Remove... 选项。那成功了。我正在运行 TeamCity 8.1.5【参考方案3】:在罗杰国王的回答中,我在 Fiddler 中使用了稍微不同的请求方式。我向特定的 Teamcity 构建发出了 Get 请求,并从 Chrome 开发人员工具中获取了 http 标头。将它们复制并粘贴到 Fiddler 的请求标头框中。这样我就不必对用户名和密码进行编码了。
【讨论】:
【参考方案4】:我按照罗杰斯国王的回答创建了一个 powershell 脚本来执行此操作。
将此脚本另存为 tc_deletebuild.ps1 ...
param($build, $teamcityhost, $username, $password)
$encodedcredentials = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username+":"+$password))
Invoke-WebRequest -Uri "http://$teamcityhost/httpAuth/app/rest/builds/id:$build" -Method Delete -Headers @"Authorization"="Basic $encodedcredentials"
... 并从 powershell 执行
.\tc_deletebuild.ps1 <buildid> <host> <username> <password>
【讨论】:
查看 Dmi 的答案:现在通过 Web UI 支持此功能【参考方案5】:正如其他人所提到的,JetBrains' suggested workaround 是删除生成 工件(即 NuGet 包)的构建 - 你想删除。
使用 curl 7.3x(在 ubuntu 和 Git for Windows / msysgit 上找到),以下命令删除内部版本号 42:
curl -v -u <username>:<password> -X DELETE http://teamcity:8111/httpAuth/app/rest/builds/42
使用短选项(-X
代替-request
,-u
代替-user
);长选项对我不起作用。
如果要提示您输入密码,请省略 :<password>
。
HTTP/1.1 204 No Content
的响应表示成功。
完整文档:http://confluence.jetbrains.com/display/TCD8/REST+API#RESTAPI-Generalinformation
【讨论】:
【参考方案6】:扩展 King Roger 的答案......邮递员 REST 客户端 chrome 扩展是一种使用很少工具即可实现它的简单方法。
> HTTP GET to http://servername:port/httpAuth/app/rest/builds/
输出看起来像
<builds count="100" nextHref="/httpAuth/app/rest/builds?count=100&start=100">
<build id="48459" number="1.0.187-nightly" ... etc
在与您在 teamcity 中看到的内部版本号相同的标签上搜索您的构建 ID 的输出,然后
> HTTP DELETE to http://servername:port/httpAuth/app/rest/builds/*theid*
我不需要授权标签或任何其他标题,可能是因为我在另一个窗口中登录了 teamcity,或者我们已将 teamcity 配置为在内部打开,但您可能需要将它们弹出到 url 和标题中。
【讨论】:
【参考方案7】:这是我第三次找到这个帖子,因为我有类似的问题。事实证明,the ticket with jetbrains 很久以前就关闭了——现在 TeamCity(至少我们的 9.1 版)通过打开特定构建的详细信息直接支持这一点,单击“操作”下拉菜单,然后选择“删除... ”。这将从 TeamCity 中删除构建以及 nuget 包存储库中的工件 - 从而完全无需以稍微复杂的方式调用 REST api。
发布此内容后,我什至可能自己记住它,下次我需要这样做时。
【讨论】:
【参考方案8】:现在通过 Web UI 支持此功能
只需打开构建并选择 Actions
> Remove
即可删除有问题的构建。这会从 TeamCity 的列表中删除构建,还会从 Nuget 提要中删除该特定构建的所有构建工件。
【讨论】:
如果您有多个由构建生成的包并且只想删除其中一个包怎么办? Erik,TeamCity 的内置 NuGet 提要使用 TeamCity 工件存储作为 NuGet 包存储,因此手动从工件存储中删除批准也应该从提要中删除。工件存储的默认位置是以上是关于如何在 TeamCity Nuget Feed 上删除特定版本的包?的主要内容,如果未能解决你的问题,请参考以下文章
How to add the custom nuget feed to TeamCity build?