59

有谁知道要删除 TeamCity Nuget Feed 上特定版本的软件包?

4

8 回答 8

50

现在通过 Web UI 支持此功能

只需打开构建并选择Actions>即可删除有问题的构建Remove。这会从 TeamCity 的列表中删除构建,并且还会从 Nuget 提要中删除该特定构建的所有构建工件

于 2015-10-09T10:38:47.863 回答
35

我知道这是很久以前问过的,但我仍然时不时地遇到这个问题,而且我总是忘记怎么做,所以我想我会发布我认为可能会稍微容易一些的解决方案(取决于你的样子在它)。

基本上,我运行了一个 TeamCity 构建,不幸的是,它创建了一个 3rd 方包的 duff 版本,我试图重新创建它,但做了一些修改。它没有用,但这意味着我总是在包管理器中看到这个 duff 包,并且在第 3 方发布更新版本之前它会保持这种状态。因此,我想从 TeamCity Nuget 服务器中删除包,而我能找到的唯一方法是删除构建,该构建也会删除人工制品(在本例中为 duff Nuget 包)。

现在,除了使用 REST API 之外,我看不到删除构建的方法,所以这就是我使用的方法(我希望我不是愚蠢的,实际上有一种从 UI 中删除构建的简单方法)。我使用 fiddler 来生成 DELETE 命令。这是通过简单地发布一个类似于我在下面显示的删除请求来实现的:

从提琴手转到作曲家窗口。选择“删除”而不是“获取”,然后在下面的表格中输入您的 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 服务器可能是谨慎的做法。

希望这可以帮助某人。

于 2012-08-13T16:31:46.053 回答
17

首先, TeamCity似乎还不直接支持删除临时 NuGet 包。JetBrains存在一个未解决的问题,但目前没有计划修复。也就是说,我们设计了一种解决方法,使我们解决了我们的具体问题,并且可能对您的问题有所帮助。

我们有一系列使用不正确(加速)版本的 nupkg 文件。因此,它们似乎比我们现在创建的包“更新”。由于无法仅删除不正确的版本,我们将每个单独的 TeamCity 构建配置的“清理工件”策略设置为较短的窗口(2 天)并运行清理。您将需要系统管理员权限才能执行此操作。

这删除了比上一个工件早一天的任何工件,并清除了我们所有的坏包。我们通过 NuGet 命令行List命令验证了这一点。由于更新的包是正确的,我们现在只在我们的 NuGet 源中宣传好的包。

诚然,这是一个“精确核弹”选项,可能并不适合所有人。我希望 TeamCity 在不久的将来完全支持 NuGet 命令行 API。

于 2012-05-14T19:57:59.077 回答
8

这是我第三次找到这个帖子,因为我有类似的问题。事实证明,jetbrains 的票证很久以前就关闭了 - 现在 TeamCity(至少我们的 9.1 版)通过打开特定构建的详细信息直接支持这一点,单击“操作”下拉菜单,然后选择“删除.. ."。这将从 TeamCity 中删除构建以及从 nuget 包存储库中删除工件 - 从而完全消除以稍微复杂的方式调用 REST api 的需要。

发布了这个,我什至可能自己记得,下次我需要这样做的时候。

于 2015-08-13T09:28:44.680 回答
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>
于 2014-09-24T07:16:51.573 回答
2

正如其他人所提到的,JetBrains 建议的解决方法是删除生成您想要删除的工件的构建(即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

于 2014-11-28T22:11:28.503 回答
2

扩展罗杰国王的答案......邮递员 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 和标题中。

于 2015-01-12T02:41:06.507 回答
0

为了扩展罗杰国王的回答,我在 Fiddler 中使用了稍微不同的请求方式。我向特定的 Teamcity 构建发出了 Get 请求,并从 Chrome 开发人员工具中获取了 http 标头。将它们复制并粘贴到 Fiddler 的请求标头框中。这样我就不必对用户名和密码进行编码。

于 2014-05-15T10:44:17.360 回答