如何在TeamCity Nuget Feed上删除特定版本的软件包?

时间:2012-04-18 21:29:41

标签: teamcity nuget nuget-package nuget-server teamcity-7.0

有没有人知道在TeamCity Nuget Feed上删除特定版本的软件包?

8 个答案:

答案 0 :(得分:41)

现在通过Web UI

支持此功能

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

答案 1 :(得分:33)

我知道这是很久以前的问题,但我仍然偶尔遇到这个问题,我总是忘记怎么做,所以我想我会发布我的解决方案,我认为可能会稍微容易一些(取决于什么你看它的方式)。

基本上,我运行了一个TeamCity构建,不幸的是我创建了一个第三方软件包的duff版本,我尝试重新创建但有一些修改。它没有用,但这意味着我总是在包管理器中提供这个duff包,它将保持这样,直到第三方发布更新的版本。因此我想从TeamCity Nuget服务器中删除该包,我唯一能找到的方法是删除构建,这也会删除文物(在这种情况下为duff Nuget包)。

现在,除了使用REST API之外,我无法看到删除构建的方法,因此我使用的是什么(我希望我不是傻瓜,实际上有一种简单的方法从UI删除构建)。我使用fiddler生成DELETE命令。只需发布类似于我在下面显示的删除请求即可实现此目的:

从fiddler转到Composer窗口。选择'删除'而不是' GET'并在下面的表格中输入您的TeamCity网址:

http://<server>:<port>/httpAuth/app/rest/builds/<build ID>

只需在选择要从TeamCity中删除的构建时检查URL即可找到构建ID(查找&#39; buildId&#39;查询参数后面的数字)。唯一的另一个步骤是将授权标头添加到命令中。在下面的行中输入以下内容&#39; User-Agent&#39;在“请求标头”窗口中。

Authorization: Basic (Username:Password encoded as base64)

要将您的用户名/密码编码为base64,请转到fiddler中的Tools-&gt; Text Wizard,然后以此格式输入您的TeamCity详细信息 - 用户名:密码。最后,您应该选择&#39;执行&#39;按钮和所有正常的构建将与Nuget包一起删除。

这对我有用,但在做这一切时显然要小心,因为你不想删除错误的构建。首先备份/快照您的TeamCity服务器可能是谨慎的。

希望这有助于某人。

答案 2 :(得分:16)

首先,在TeamCity中删除ad-hoc NuGet包似乎是not directly supported。关于JetBrains有一个open issue,但目前没有计划修复。也就是说,我们设计了一种解决方案,让我们解决了我们的具体问题,并可能对您有所帮助。

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

这删除了比最后一个工件旧一天的所有工件,并清除了所有坏包。我们通过NuGet命令行List命令验证了这一点。由于最近的软件包是正确的,我们现在只在NuGet Feed中宣传好的软件包。

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

答案 3 :(得分:8)

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

发布这个之后,我甚至可能会记住它,下次我需要这样做。

答案 4 :(得分:4)

我创建了一个powershell脚本来按照King Rogers的回答来做到这一点。

将此脚本另存为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>

答案 5 :(得分:2)

正如其他人所提到的,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 :(得分:2)

扩展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 :(得分:0)

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