web-dev-qa-db-de.com

So entfernen Sie eine bestimmte Version eines Pakets in einem TeamCity-Nuget-Feed

Kann jemand eine bestimmte Version eines Pakets aus einem TeamCity-Nuget-Feed entfernen?

53
matt_dev

Dies wird jetzt über die Web-Benutzeroberfläche unterstützt

Entfernen Sie einfach den fehlerhaften Build, indem Sie den Build öffnen und Actions> Remove auswählen. Dadurch wird der Build aus der Liste in TeamCity entfernt, und es werden auch alle Build-Artefakte dieses bestimmten Builds aus dem Nuget-Feed entfernt.

40
theDmi

Ich weiß, dass dies vor langer Zeit gefragt wurde, aber ich bin immer noch auf dieses Problem gestoßen, und ich vergesse immer, wie es gemacht wird. Ich dachte mir, ich würde meine Lösung posten, die meiner Meinung nach etwas einfacher sein könnte (je nachdem, wie Sie aussehen daran). 

Grundsätzlich habe ich einen TeamCity-Build ausgeführt, der leider eine duff-Version eines Drittanbieterpakets erstellt hat, das ich mit ein paar Änderungen neu erstellen wollte. Es hat nicht funktioniert, aber es bedeutete, dass mir dieses Paket immer im Paketmanager präsentiert wurde. Es wird so bleiben, bis der Drittanbieter eine neuere Version veröffentlicht. Daher wollte ich das Paket vom TeamCity Nuget-Server löschen. Die einzige Möglichkeit, dies zu tun, war das Löschen des Builds, das auch die Artefakte löscht (in diesem Fall das duff Nuget-Paket). 

Nun konnte ich keinen Weg zum Löschen des Builds sehen, außer mit der REST - API. Daher habe ich das verwendet (ich hoffe, ich bin nicht dumm und es gibt einen einfachen Weg, Builds von der Benutzeroberfläche zu löschen.) . Ich habe Fiddler verwendet, um den DELETE-Befehl zu generieren. Dies wurde erreicht, indem einfach eine Löschanfrage gesendet wurde, die der unten gezeigten ähnelt:

Gehen Sie vom Geiger zum Composer-Fenster. Wählen Sie "LÖSCHEN" anstelle von "GET" und geben Sie Ihre TeamCity-URL in das folgende Formular ein:

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

Die Build-ID kann durch einfaches Überprüfen der URL ermittelt werden, wenn Sie das Build auswählen, das Sie aus TeamCity löschen möchten (suchen Sie nach der Nummer nach dem Abfrageparameter 'buildId'). Der einzige andere Schritt bestand darin, den Berechtigungsheader zum Befehl hinzuzufügen. Geben Sie in der Zeile unter 'User-Agent' im Fenster 'Request Headers' Folgendes ein.

Authorization: Basic (Username:Password encoded as base64)

Um Ihren Benutzernamen/Ihr Passwort als base64 zu verschlüsseln, gehen Sie im Fiddler auf Tools-> Text Wizard und geben Sie Ihre TeamCity-Details in diesem Format ein - Username: Password. Als letztes sollten Sie den 'Execute'-Button wählen und alles wird gut, wenn der Build zusammen mit dem Nuget-Paket gelöscht wird.

Das hat für mich funktioniert, aber seien Sie natürlich vorsichtig, wenn Sie das alles tun, da Sie den falschen Build nicht löschen möchten. Es kann ratsam sein, zuerst Ihren TeamCity-Server zu sichern/zu schnappen.

Hoffe das hilft jemandem.

33
King Roger

Zunächst scheint es, dass das Löschen von Ad-hoc-NuGet-Paketen in TeamCity noch nicht direkt unterstützt ist. Es gibt ein offenes Problem mit JetBrains darüber, aber derzeit ist keine Lösung geplant. Das heißt, wir haben eine Problemumgehung entwickelt, mit der wir unser spezifisches Problem überwunden haben und bei Ihrem helfen können. 

Wir hatten eine Reihe von Nupkg-Dateien, die eine falsche (beschleunigte) Version verwendeten. Sie schienen also "neuer" zu sein als die Pakete, die wir jetzt erstellen. Ohne die Möglichkeit, nur die falschen Versionen zu entfernen, setzen wir die Richtlinie "Clean Artifacts" für jede einzelne TeamCity-Build-Konfiguration auf ein kurzes Fenster (2 Tage) und führen die Bereinigung aus. Sie benötigen dazu Systemadministrator-Berechtigungen.

Dadurch wurden alle Artefakte entfernt, die einen Tag älter waren als das letzte, und alle unsere fehlerhaften Pakete wurden entfernt. Wir haben dies über den Befehl List des Befehls NuGet überprüft. Da die aktuelleren Pakete korrekt sind, bewerben wir nur noch gute Pakete in unserem NuGet-Feed.

Zugegeben, dies ist eine "Präzisions-Nuke" -Option und funktioniert möglicherweise nicht für alle. Ich hoffe, dass TeamCity die Befehlszeilen-API von NuGet in naher Zukunft vollständig unterstützt.

16
SethO

Es ist jetzt das dritte Mal, dass ich diesen Beitrag finde, weil ich ein ähnliches Problem habe. Es stellt sich heraus, dass das Ticket mit Jetbrains vor langer Zeit geschlossen wurde - und TeamCity jetzt (zumindest unsere Version 9.1) dies direkt unterstützt, indem Sie die Details für einen bestimmten Build öffnen, auf das Dropdown-Menü "Aktionen" klicken und auswählen "Löschen...". Dadurch werden sowohl der Build aus TeamCity als auch die Artefakte aus dem Nuget-Paket-Repository entfernt. Dadurch ist es nicht mehr erforderlich, das REST -API auf leicht gewundene Weise aufzurufen.

Nachdem ich dies gepostet habe, erinnere ich mich vielleicht selbst daran, wenn ich das nächste Mal das tun muss.

8
Jan Hansen

Ich habe ein Powershell-Skript erstellt, um dies entsprechend der Antwort von King Rogers zu tun.

Speichern Sie dieses Skript als 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"}

... und von Powershell mit ausführen

.\tc_deletebuild.ps1 <buildid> <Host> <username> <password>
4

Die Antwort von King Roger erweitern ... Die Chrome-Erweiterung des Postboten REST -Clients ist eine einfache Möglichkeit, dies mit wenig Werkzeug zu erreichen.

> HTTP GET to http://servername:port/httpAuth/app/rest/builds/

Die Ausgabe wird aussehen

<builds count="100" nextHref="/httpAuth/app/rest/builds?count=100&amp;start=100">
    <build id="48459" number="1.0.187-nightly" ... etc

Suchen Sie in der Ausgabe nach Ihrer Build-ID, und zwar an demselben Tag wie die Build-Nummer, die Sie in Teamcity sehen

> HTTP DELETE to http://servername:port/httpAuth/app/rest/builds/*theid*

Ich brauchte keine Autorisierungs-Tags oder andere Header, möglicherweise war ich in einem anderen Fenster in teamcity angemeldet oder wir haben teamcity so konfiguriert, dass sie intern geöffnet sind.

2
MattWazEre

Wie bereits erwähnt, ist JetBrains 'vorgeschlagener Workaround das Löschen der Builds, die das Artefakt-- erzeugt haben, dh das NuGet-Paket-- das Sie löschen wollen.

Mit curl 7.3x (gefunden auf Ubuntu und Git für Windows/msysgit) löscht der folgende Befehl die Build-Nummer 42:

curl -v -u <username>:<password> -X DELETE http://teamcity:8111/httpAuth/app/rest/builds/42
  • Verwendet short-Optionen (-X anstelle von -request, -u anstelle von -user); Die langen Optionen haben für mich nicht funktioniert.
  • Lassen Sie :<password> aus, wenn Sie zur Eingabe Ihres Passworts aufgefordert werden sollen.
  • Die Antwort von HTTP/1.1 204 No Content zeigt Erfolg an.

Vollständige Dokumentation: http://confluence.jetbrains.com/display/TCD8/REST+API#RESTAPI-Allgemeine Informationen

2
Justin M. Keyes

In Erwiderung auf King Rogers Antwort habe ich in Fiddler eine etwas andere Art benutzt, die Anfrage zu schreiben. Ich habe eine Get-Anfrage an einen bestimmten Teamcity-Build gestellt und http-Header von Chrome Developer Tool übernommen. Kopierte sie und fügte sie in das Feld für Anforderungskopfzeilen von Fiddler ein. Auf diese Weise musste ich Benutzername und Passwort nicht verschlüsseln.

0
user1369721