有谁知道要删除 TeamCity Nuget Feed 上特定版本的软件包?
8 回答
现在通过 Web UI 支持此功能
只需打开构建并选择Actions
>即可删除有问题的构建Remove
。这会从 TeamCity 的列表中删除构建,并且还会从 Nuget 提要中删除该特定构建的所有构建工件。
我知道这是很久以前问过的,但我仍然时不时地遇到这个问题,而且我总是忘记怎么做,所以我想我会发布我认为可能会稍微容易一些的解决方案(取决于你的样子在它)。
基本上,我运行了一个 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 服务器可能是谨慎的做法。
希望这可以帮助某人。
首先, TeamCity似乎还不直接支持删除临时 NuGet 包。JetBrains存在一个未解决的问题,但目前没有计划修复。也就是说,我们设计了一种解决方法,使我们解决了我们的具体问题,并且可能对您的问题有所帮助。
我们有一系列使用不正确(加速)版本的 nupkg 文件。因此,它们似乎比我们现在创建的包“更新”。由于无法仅删除不正确的版本,我们将每个单独的 TeamCity 构建配置的“清理工件”策略设置为较短的窗口(2 天)并运行清理。您将需要系统管理员权限才能执行此操作。
这删除了比上一个工件早一天的任何工件,并清除了我们所有的坏包。我们通过 NuGet 命令行List
命令验证了这一点。由于更新的包是正确的,我们现在只在我们的 NuGet 源中宣传好的包。
诚然,这是一个“精确核弹”选项,可能并不适合所有人。我希望 TeamCity 在不久的将来完全支持 NuGet 命令行 API。
这是我第三次找到这个帖子,因为我有类似的问题。事实证明,jetbrains 的票证很久以前就关闭了 - 现在 TeamCity(至少我们的 9.1 版)通过打开特定构建的详细信息直接支持这一点,单击“操作”下拉菜单,然后选择“删除.. ."。这将从 TeamCity 中删除构建以及从 nuget 包存储库中删除工件 - 从而完全消除以稍微复杂的方式调用 REST api 的需要。
发布了这个,我什至可能自己记得,下次我需要这样做的时候。
我按照罗杰斯国王的回答创建了一个 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>
正如其他人所提到的,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
扩展罗杰国王的答案......邮递员 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 和标题中。
为了扩展罗杰国王的回答,我在 Fiddler 中使用了稍微不同的请求方式。我向特定的 Teamcity 构建发出了 Get 请求,并从 Chrome 开发人员工具中获取了 http 标头。将它们复制并粘贴到 Fiddler 的请求标头框中。这样我就不必对用户名和密码进行编码。