如何在 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);长选项对我不起作用。 如果要提示您输入密码,请省略 :&lt;password&gt;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&amp;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 包存储,因此手动从工件存储中删除批准也应该从提要中删除。工件存储的默认位置是 /system/artifacts。来源:youtrack.jetbrains.com/issue/TW-19959

以上是关于如何在 TeamCity Nuget Feed 上删除特定版本的包?的主要内容,如果未能解决你的问题,请参考以下文章

How to add the custom nuget feed to TeamCity build?

如何调试从 TeamCity 部署的我的 nuget 包?

如何托管我自己的nuget v3 Feed?

TeamCity - MSBuild无法找到NuGet引用

TeamCity Build Server无法恢复nuget包

TeamCity Nuget 安装构建步骤不适用于多个源,其中之一是 TC 的私有 NuGet 源