So parametrisieren Sie die Agentenanforderungen in TeamCity

1451
Tonny Madsen

Ist es in TeamCity möglich, die Agentenanforderungen basierend auf Projekt- oder Build-Konfigurationsparametern zu parametrieren? Kann der Wert zB %...%Substitutionen enthalten?

Ein Beispiel: Wir haben Projektparameter, env.XXX_VERSIONdie die benötigte Version des XXX-Produkts in allen Build-Konfigurationen des Projekts angeben. Wir können diesen Wert dann in den entsprechenden Build-Skripts des Projekts verwenden. (Im Laufe der Zeit erstellen wir Kopien dieses Build-Projekts für verschiedene Varianten einiger Produkte, von denen wir abhängig sind, sodass wir nun 12 verschiedene Projekte mit unterschiedlichen Werten für die Parameter haben). Jetzt möchte ich auch eine Agentenanforderung aus allen relevanten Build-Konfigurationen in das Projekt aufnehmen, sodass nur die verwendbaren Agenten berücksichtigt werden. Angesichts der Anzahl der Build-Konfigurationen und der Anzahl der varianten Projekte würde ich es jedoch vorziehen, die Anforderung nach dem Wert des Exits zu parametrieren env.XXX_VERSION. Ist das möglich?

(Heute enthalten alle unsere Agenten alle möglichen Versionen der Software, sind jedoch nicht mehr möglich. Daher benötigen wir Anforderungen an die Agenten aus den Projekten der Build-Konfigurationen.)

2
Hallo Tonny, warst du jemals in der Lage, die Anforderungen zu parametrieren? Ich finde mich in Ihrer beschriebenen Situation genau und würde gerne wissen, dass dies tatsächlich möglich ist. Leonid Usov vor 6 Jahren 0
Leonid (Entschuldigung für die späte Antwort), aber nein, wir haben keinen anderen Weg gefunden, außer die neue Kotlin DSL von 2018.1 zu verwenden. Jetzt generieren wir alle Out-Konfigurationen aus Python-Code und "installieren" sie dann über die Versioned Settings-Unterstützung ... Tonny Madsen vor 6 Jahren 0
Schön, danke für die Referenz, ich habe noch nie von dieser Option gehört. Begonnene Untersuchung Könnten Sie bitte in der Zwischenzeit kurz beschreiben, wie genau die Verwendung der versionierten Einstellungen diese Art der dynamischen Agentenauswahl ermöglicht? Fügen Sie die Agentenanforderungen irgendwie als fest codierten Konfigurationsabschnitt hinzu, der automatisch für jeden Build neu generiert wird? Leonid Usov vor 6 Jahren 0
(spät, aber ...) Genau so. Man kann sagen, dass wir beim Generieren der Konfigurationen alle Variablen auflösen. Dies bedeutet natürlich auch, dass wir alle möglichen Manipulationen vornehmen können, sodass die Substitutionen nicht "linear" sein müssen. Tonny Madsen vor 6 Jahren 0
(spät, aber ...) Dies bedeutet auch, dass wir alle möglichen Manipulationen durchführen können, sodass die Substitutionen nicht "linear" sein müssen. Wir haben die Generierung als Build-Konfiguration mit Abhängigkeiten zu allen benötigten Dateien eingerichtet. Wenn also die Konfiguration geändert wird, wird die Generierung automatisch ausgeführt. Die versionierten Einstellungen sind einfach: Die Konfiguration von TeamCity wird automatisch in einem VCS (z. B. Git) gespeichert. Dies ist in beide Richtungen möglich: Änderungen im VCS werden automatisch erkannt und TeamCity passt seine Konfiguration an. Unser Generator speichert also "einfach" das gewünschte Conf im VCS ... Tonny Madsen vor 6 Jahren 0

3 Antworten auf die Frage

2
kdtong

Es scheint, dass Sie bereits wissen, was Sie tun möchten, und das Problem ist die große Anzahl von Agenten und Konfigurationen, mit denen Sie umgehen müssen.

Warum automatisieren Sie dies nicht mithilfe der REST-API von TeamCity? Der Server von TeamCity verfügt über eine integrierte HTTP-API, mit der Sie (fast) alle Felder bearbeiten / aktualisieren können, die Sie über die Webschnittstelle verwenden könnten.

Sie können mit der API mithilfe Ihrer bevorzugten Skriptsprache interagieren. Verwenden Sie dazu HTTP-GET / PUT-Aufrufe, um Werte abzurufen und zu aktualisieren. In diesem Fall denke ich, dass es sich lohnt, ein Skript zu schreiben, um zu vermeiden, dass Sie durch die Benutzeroberfläche alle von Ihnen erwähnten Build-Konfigurationen aktualisieren müssen.

Sie schreiben ein einzelnes Skript (in der von Ihnen verwendeten Skriptsprache), die Sie einmal ausführen können, um alle Agentenanforderungen festzulegen. Pseudocode folgt

  1. Durchlaufen Sie die Projekte in TeamCity

Holen Sie sich die Liste der Projekte

curl -i -H "Accept: application/json" http://teamcity/httpAuth/app/rest/projects --user username:password 
  1. Holen Sie sich den XXX_VERSIONParameter aus den Projekten.

Alle Projekte durchlaufen, alle Parameter abrufen und unsere XXX_VERSION analysieren

curl http://teamcity/app/rest/projects/id:PROJECT_NAME/parameters 
  1. Legen Sie die Agentenanforderung in den Build-Konfigurationen fest.

Legen Sie für jede Build-Konfiguration in jedem Projekt die Agentenanforderungen für die Build-Konfiguration mit dem analysierten Wert XX_VERSION fest

curl -X PUT http://teamcity/httpAuth/app/rest/buildTypes/<buildTypeLocator>/agent-requirements/<id> --user username:password 

Dies ist die allgemeine Idee, die jedoch nicht vollständig ist. Durch die Verwendung dieses Skripts sparen Sie viel Zeit bei der Verwaltung über die TeamCity-Benutzeroberfläche.

https://confluence.jetbrains.com/display/TCD9/REST+API

Ich kann nicht sehen, wie das funktionieren würde. Bitte erläutern sie noch weiter. Tonny Madsen vor 8 Jahren 0
Tonny, ich habe ein paar zusätzliche Details aktualisiert. Sie müssen mich entschuldigen, dass es nicht vollständig ist. Ich hoffe, es hilft oder bringt Sie zumindest auf den richtigen Weg. kdtong vor 8 Jahren 0
0
Animesh Patra

Sie können erzwingen, dass TeamCity auf einem bestimmten Agenten basiert, ohne alle anderen verbundenen Agenten zu deaktivieren.

Hier ist wie:

Gehe zu Build-Konfigurationseinstellungen

Nächste Agentenanforderungen

Jetzt müssen Sie eine explizite Anforderung für einen bestimmten Agenten festlegen :

Parametername: system.agent.name

Zustand: gleichwertig

Wert: YOUR_SPECIFIC_AGENT_NAME

Sie können dies auch versuchen:

Durchsuchen Sie: TeamCity -> Verwaltung -> Agenten -> Agenten auswählen -> Registerkarte Kompatible Konfigurationen, dann Konfigurationsrichtlinie für aktuellen Lauf, dann Nur zugewiesene Konfigurationen ausführen und auf + Konfigurationen zuweisen klicken und beenden.

Bitte lassen Sie mich wissen, wenn dies hilft.

Vielen Dank.

Dies erfordert jedoch leider ein gewisses Mikromanagement, das wir vermeiden möchten. Wir haben 10 Agenten, bei denen 8-9 für die Build-Konfigurationen eines bestimmten Projekts geeignet sein könnte. Wir müssen also 23 Build-Konfigurationen mal 12 Projekte durchlaufen und diese Agent.name-Anforderung für jedes von ihnen festlegen. Nicht so gut. Und noch schlimmer, wir werden mehr Agenten bekommen und die Konfiguration aller Agenten kontinuierlich ändern. Tonny Madsen vor 8 Jahren 0
-1
Andrew Kolbus

Ich konnte keinen Weg finden, um den Wert mit %...%Substitutionen zu parametrieren, aber ich fand eine Problemumgehung. Es ist nicht ideal, aber es funktioniert für meinen kleinen Anwendungsfall.

Anwendungsfall: Ich erstelle Build-Konfigurationen aus einer Vorlage und brauche jede Build-Konfiguration, um nur auf einem einzelnen Computer ausgeführt zu werden. Ich wollte teamcity.agent.name equals %buildAgentName%in der Vorlage tun, damit TeamCity mich auffordert, den Parameter einzugeben, wenn ich die Build-Konfiguration aus der Vorlage erstelle.

Lösung: Anstatt einen Parameter zu verwenden, füge ich nur eine Zeichenfolge ein, die mit keinem Agentennamen übereinstimmt, z teamcity.agent.name equals replaceThisWithActualAgentName. B. in der Vorlage. Ich werde nicht zur Eingabe des Parameters aufgefordert, dies verhindert jedoch, dass die Build-Konfiguration versehentlich auf dem falschen Computer ausgeführt wird, bis ich die Agentenanforderung überschreibe.

Ich bin nicht sicher, ob dies Ihren Anwendungsfall löst, aber ich poste es hier, falls es für jemand anderen hilfreich ist.