Jenkins Git Plugin: Wie erstelle ich ein bestimmtes Tag?

120

Ich habe Probleme, Jenkins dazu zu bringen, ein bestimmtes Tag zu erstellen. Das Tag ist Teil eines parametrisierten Builds, aber ich weiß nicht, wie ich es an das Git-Plugin weitergeben soll, um nur dieses Tag zu erstellen. Dies hat 3 Stunden meines Tages gedauert und ich habe den Meistern beim Stapelüberlauf eine Niederlage eingeräumt.

sksamuel
quelle
Sie meinen, dies unterscheidet sich von stackoverflow.com/questions/7157170/… ? (drittes Ergebnis von google.com/… )
VonC
1
"Das hat 3 Stunden meines Tages
gedauert
1
Bist du sicher, dass du es so machen willst? Ist dir klar, dass das Markieren in Git nicht skaliert ? Vielleicht könnten Sie einfach eine "Shell ausführen" -Aufgabe verwenden, um ein Skript zu schreiben, um das Tag / die Revision zu überprüfen, die Sie wirklich wollen?
mpontillo

Antworten:

222

Ich konnte dies mithilfe des Parameters "Zweige zum Erstellen" tun:

Branch Specifier (blank for default): tags/[tag-name]

Ersetzen Sie [Tag-Name] durch den Namen Ihres Tags.

Emmanuel Keller
quelle
5
Ich weiß nicht, warum dies nicht mehr +1 hat. Dieser Erics-Notes-Blogeintrag ist verdammt verwirrend. Das ist einfach und funktioniert super. Vielen Dank!
Cody S
3
Hat super für mich funktioniert. Vielen Dank. Mein Parameter hieß RELEASE_TAG, daher habe ich tags / $ {RELEASE_TAG} als Wert für Branch Specifier verwendet.
Wesley Womack
3
Konnte dies nicht zum Laufen bringen. Aus irgendeinem Grund kann das Tag nicht ausgecheckt werden. Ich bekomme: 'FEHLER: Es konnte keine Revision zum Erstellen gefunden werden. Überprüfen Sie die Repository- und Zweigstellenkonfiguration für diesen Job. ' Ich gebe Tags / 3.0.1 an, ich habe auch versucht * / tags / 3.0.1 Ich habe überprüft, ob das Tag existiert.
Verlorene Übersetzung
1
Wenn ich versuche, das zu tun, was in dieser Antwort vorgeschlagen wird, löst jede Abfrage des Repositorys einen Build aus. Das Git-Polling-Protokoll zeigt kontinuierlich an, dass die "Last Built Revision" die Revision des Tags ist, die "Latest Remote Head Revision is" jedoch die Revision der neuesten HEAD. Die Logik des Git-Plugins scheint diese beiden Revisionen zu vergleichen, die in meinem Repository immer ungleich sind und daher immer ein neuer Build ausgelöst wird.
Louis
Dies muss sicherlich die richtige Antwort sein, es hat bei mir funktioniert und ist so einfach. Ich frage das Repo allerdings nicht ab, also gibt es wohl immer noch dieses Problem.
Jeremy
76

Keine dieser Antworten war für mich mit Jenkins CI v.1.555, Git Client Plugin v.1.6.4 und Git Plugin 2.0.4 ausreichend.

Ich wollte einen Job für ein Git-Repository für ein bestimmtes festes (dh nicht parametrisiertes) Tag erstellen. Ich musste eine Lösung aus den verschiedenen Antworten und dem von Thilo zitierten Blog-Beitrag "Build a Git Tag" zusammenstellen .

  1. Stellen Sie sicher, dass Sie Ihr Tag mit in das Remote-Repository verschieben git push --tags
  2. Klicken Sie im Abschnitt "Git Repository" Ihres Jobs unter der Überschrift "Quellcodeverwaltung" auf "Erweitert".
  3. Fügen Sie im Feld für Refspec den folgenden Text hinzu: +refs/tags/*:refs/remotes/origin/tags/*
  4. Geben Sie unter "Zu erstellende Zweige" den Begriff "Zweigspezifizierer" ein */tags/<TAG_TO_BUILD>(ersetzen Sie ihn <TAG_TO_BUILD>durch Ihren tatsächlichen Tag-Namen).

Das Hinzufügen der Refspec für mich erwies sich als kritisch. Obwohl es so aussah, als würden die Git-Repositorys standardmäßig alle Remote-Informationen abrufen, als ich sie leer ließ, konnte das Git-Plugin mein Tag dennoch nicht finden. Nur wenn ich im Feld Refspec explizit "Get the Remote Tags" angegeben habe, konnte das Git-Plugin mein Tag identifizieren und daraus erstellen.

Update 2014-5-7 : Leider hat diese Lösung einen unerwünschten Nebeneffekt für Jenkins CI (v.1.555) und den Push-Benachrichtigungsmechanismus des Git-Repositorys à la Stash Webhook an Jenkins : Jedes Mal, wenn ein Zweig im Repository aktualisiert wird Bei einem Push werden die Tag-Build-Jobs ebenfalls erneut ausgelöst. Dies führt dazu, dass immer wieder dieselben Tag-Jobs unnötig neu erstellt werden. Ich habe versucht, die Jobs mit und ohne die Option "Abfrage über Arbeitsbereich erzwingen" zu konfigurieren, und es schien keine Auswirkung zu haben. Die einzige Möglichkeit, Jenkins daran zu hindern, unnötige Builds für die Tag-Jobs zu erstellen, besteht darin, das Feld Refspec zu löschen (dh das Feld zu löschen +refs/tags/*:refs/remotes/origin/tags/*).

Wenn jemand eine elegantere Lösung findet, bearbeiten Sie diese Antwort bitte mit einem Update. Ich vermute zum Beispiel, dass dies möglicherweise nicht passieren würde, wenn die Referenzspezifikation +refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>nicht das Sternchen- Sammelelement wäre . Im Moment funktioniert diese Lösung jedoch für uns. Wir entfernen nur die zusätzliche Refspec, nachdem der Job erfolgreich war.

gotgenes
quelle
4
So fügen Sie der Referenz "den folgenden Text hinzu" ... wenn Ihre Referenz zuvor war +refs/heads/*:refs/remotes/origin/*, wird dies jetzt der Fall sein +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*. (Ich habe nicht viel mit Refspecs gearbeitet, daher waren einige Experimente erforderlich, um herauszufinden, dass dieses Feld durch Leerzeichen begrenzt ist.)
Driftcatcher
1
Eine zusätzliche +1 für diese Lösung. Die vorherigen Lösungen haben auch bei mir nicht funktioniert.
Whitespy9
16

Kannst du Jenkins nicht sagen, dass er aus einem Ref-Namen bauen soll? Wenn ja, dann ist es

refs/tags/tag-name

Bei all den Fragen, die ich zu Jenkins und Hudson sehe, würde ich vorschlagen, zu TeamCity zu wechseln. Ich musste keine Konfigurationsdateien bearbeiten, damit TeamCity funktioniert.

Andrew T Finnell
quelle
Sie sind nicht die erste Person, die Teamstadt vorschlägt. Ist es wirklich so viel besser? Ich könnte es überprüfen.
sksamuel
1
@monkjack Ich habe die gleiche Syntax auf einem meiner Repos ausprobiert und es hat funktioniert. Können Sie Ihre aktuellen Tags auflisten? Sind Sie sicher, dass Sie dieses Tag speziell auf das Remote-Repo mitgit push --tags
Andrew T Finnell
4
Rückt näher. Ich habe die Tags nicht auf Remote geschoben, aber jetzt bin ich es. Ich kann Jenkins jetzt mit refs / tags / harpercollins-1.0.16 zum Bauen bringen, aber es besteht immer darauf, den Kopf zu bauen, unabhängig davon, was ich dort eingefügt habe. Ich habe bestätigt, dass die Fernbedienung das Tag hat (kann es in gitweb sehen), und ein Schnappschuss dieses Tags bestätigt, dass alles richtig darin ist.
sksamuel
6
TeamCity ist proprietär und daher ziemlich nutzlos.
Slang
2
Oh ja, der Wechsel vom kostenlosen Tool zum kommerziellen ist die richtige Wahl! Wenn Jetbrains das Rad neu erfinden und einen neuen Bug-Tracker erstellen, schlagen Sie anderen vor, von Bugzilla zu diesem zu wechseln?
2.
11

Wenn Sie Jenkins-Pipelines verwenden und ein bestimmtes Tag (z. B. einen TAGParameter Ihres Builds) auschecken möchten, können Sie Folgendes tun:

stage('Checkout') {
  steps {
    checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'YOUR_GIT_REPO_URL.git', credentialsId: 'YOUR_GIT_CREDENTIALS_ID' ]], branches: [[name: 'refs/tags/${TAG}']]], poll: false
  }
}
Vincent de Lagabbe
quelle
9

In einem neuesten Jenkins (1.639 und höher) können Sie:

  1. Geben Sie einfach den Namen des Tags in ein Feld 'Zu erstellende Zweige' ein.
  2. In einem parametrisierten Build können Sie Parameter als Variable in demselben Feld 'Zu erstellende Zweige' verwenden, dh $ {Branch_to_build}.
  3. Sie können das Git Parameter Plugin installieren , das Ihnen Funktionen bietet, indem Sie alle verfügbaren Zweige und Tags auflisten.
m1ld
quelle
1
In der Tat hat es auch für mich funktioniert, nur einen Tag-Namen einzugeben. Obwohl die Dokumentation dazu im Git-Plugin immer noch ausdrücklich besagt,
Zitrax
Dies funktionierte für mich in Jenkins 1.532.3. Ich habe gerade die Tag-Version (z. B. 1.0.1) in den zu erstellenden Zweigen angegeben.
Andre
9

Ich habe so etwas gemacht und es hat funktioniert:

Source Code Management

 Git    
    Repositories    


 Advance

Name: ref
Refspec : +refs/tags/*:refs/remotes/origin/tags/* 

 Branches to build  
 Branch Specifier (blank for 'any') : v0.9.5.2

Geben Sie hier die Bildbeschreibung ein

Jenkins Protokoll bestätigte, dass die Quelle vom Tag abgerufen wurde

0b4d6e810546663e931cccb45640583b596c24b9Auschecken der Revision (v0.9.5.2)

Hasan Shaik
quelle
Dies ist großartig, um alle Tags zu erstellen, danke! Das Hinzufügen von refspecwar der Trick durch Klicken auf die Schaltfläche Erweitert.
Styfle
9

Ich habe das Feld Erweitert-> Refspec auf gesetzt refs/tags/[your tag name]. Dies scheint einfacher zu sein als die verschiedenen anderen Vorschläge für Refspec, aber es hat für mich gut funktioniert.

UPDATE 23/7/2014 - Nach weiteren Tests stellte sich heraus, dass dies nicht wie erwartet funktioniert hat. Es scheint, dass die HEAD-Version noch ausgecheckt wurde. Bitte machen Sie dies als akzeptierte Antwort rückgängig. Am Ende habe ich eine funktionierende Lösung gefunden, indem ich dem Beitrag von gotgenes in diesem Thread (30. März) gefolgt bin . Das in diesem Beitrag erwähnte Problem des unnötigen Auslösens von Builds war für mich kein Problem, da mein Job von einem Upstream-Job ausgelöst wird und nicht von der Abfrage von SCM.

UPDATE APR-2018 - Beachten Sie in den Kommentaren, dass dies für eine Person funktioniert und mit der Dokumentation von Jenkins übereinstimmt.

Nebu
quelle
Just zu beachten wollte , dass vier Jahre nach dieser Antwort gepostet betriebener wurde refs/tags/<tagname>ist , was die Jenkins Dokumentation sagt verwendet werden soll, und es funktioniert gut für mich. Vielleicht war das Plugin zum Zeitpunkt des ursprünglichen Post Buggy, aber ... ab April 2018 dies ist die richtige Antwort.
Evadeflow
Aktualisieren meines vorherigen Kommentars: Eigentlich habe ich festgestellt, dass ich das refs/tagsPräfix weglassen und einfach verwenden kann <tagname>. YMMV, aber ... es funktioniert gut für meine Zwecke.
Evadeflow
3

Ich konnte Jenkins dazu bringen, ein Tag zu erstellen, indem ich Refspec und Branch Specifier wie in diesem Blog-Beitrag beschrieben einstellte .

Ich musste auch den Repository-Namen (in meinem Fall auf "Ursprung") setzen, damit ich ihn in der Refspec referenzieren konnte (andernfalls würde anscheinend ein zufällig generierter Name verwendet).

Thilo
quelle
2

Was ich am Ende getan habe war:

  • hat einen neuen Zweig erstellt jenkins-target und ließ Jenkins das verfolgen
  • Zusammenführen von dem Zweig oder Tag, auf den ich bauen möchte jenkins-target
  • Sobald der Build funktioniert hat, Tests bestanden wurden usw., erstellen Sie einfach ein Tag aus dem jenkins-targetZweig

Ich bin mir nicht sicher, ob dies für alle funktionieren wird, mein Projekt war ziemlich klein, nicht zu viele Tags und so, aber es ist kinderleicht, ich muss nicht mit Refspecs und Parametern und so herumspielen :-)

Hugh Perkins
quelle
Ich mag diesen sehr einfachen Ansatz.
Zochhuana
2

Sie können sogar einen Tag-Typ erstellen, z. B. 1.2.3-alpha43mithilfe von Platzhaltern:

Refspec: +refs/tags/*:refs/remotes/origin/tags/*

Zweigspezifizierer: origin/tags/1.2.3-alpha*

Sie können auch " Erstellen, wenn eine Änderung an GitHub gesendet wird " ankreuzen , um den Push auszulösen. Sie müssen dem Webhook jedoch die Aktion "Erstellen" hinzufügen

Flussfall
quelle
1

Fügen Sie hier meine zwei Cent hinzu, da ich keine Antwort gesehen habe, die die Option "Mit Parametern erstellen" in Jenkins verwendet.

Hier verwende ich die Jenkins CI-Browserkonsole für das Projekt starwars_api und konnte direkt mit "Build with parameters" mit dem Wert refs / tags / tag-name erstellen

  1. Wählen Sie die Option "Mit Parametern erstellen".
  2. Mehrwert in das Feld als "refs / tags / tag_142" (tag_name = tag_142 für mein Beispiel)

Build mit Ref-Tag-Namen

Anayagam
quelle