Wtyczka Jenkins Git: Jak zbudować określony tag?

120

Mam problemy z utworzeniem przez Jenkinsa określonego tagu. Znacznik jest częścią sparametryzowanej kompilacji, ale nie wiem, jak przekazać to do wtyczki git, aby po prostu zbudować ten tag. Zajęło mi to 3 godziny mojego dnia i przyznałem mistrzom porażkę przy przepełnieniu stacka.

sksamuel
źródło
Masz na myśli to, że różni się to od stackoverflow.com/questions/7157170/… ? (trzeci wynik google.com/… )
VonC
1
„To trwało 3 godziny mojego dnia” - nie jestem tak leniwy, że 3 godziny mojego dnia nie zawierały wszystkich linków, które mogłem znaleźć w google :)
sksamuel
1
Czy na pewno chcesz to zrobić w ten sposób? Czy zdajesz sobie sprawę, że tagowanie w git nie jest skalowane ? Może mógłbyś po prostu użyć zadania „wykonaj powłokę”, aby napisać skrypt sprawdzający znacznik / wersję, którą naprawdę chcesz?
mpontillo

Odpowiedzi:

222

Udało mi się to zrobić za pomocą parametru „branch to build”:

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

Zastąp [nazwa-tagu] nazwą swojego tagu.

Emmanuel Keller
źródło
5
Nie wiem, dlaczego to nie daje więcej + 1-ek. Ten wpis na blogu erics-notes jest cholernie zagmatwany. To jest proste i działa świetnie. Dzięki!
Cody S
3
U mnie zadziałało świetnie. Dzięki. Mój parametr został nazwany RELEASE_TAG, więc użyłem tagów / $ {RELEASE_TAG} jako wartości dla Specyfikatora gałęzi.
Wesley Womack,
3
Nie udało się uruchomić tego. Z jakiegoś powodu nie można pobrać tagu. Otrzymuję komunikat: „BŁĄD: nie można znaleźć żadnej wersji do zbudowania. Sprawdź konfigurację repozytorium i gałęzi dla tego zadania. ' Podaję tagi / 3.0.1, próbowałem też * / tags / 3.0.1. Sprawdziłem, że tag istnieje.
Lostintranslation
1
Kiedy próbuję zrobić to, co jest sugerowane w tej odpowiedzi, każda ankieta w repozytorium uruchamia kompilację. Dziennik sondowania git będzie stale pokazywał, że „Ostatnia zbudowana wersja” jest wersją tagu, ale „Najnowsza wersja zdalnej głowicy to” jest wersją najnowszej HEAD. Logika wtyczki git wydaje się porównywać te dwie wersje, które w moim repozytorium są zawsze nierówne, a zatem zawsze uruchamiana jest nowa kompilacja.
Louis
To z pewnością musi być prawidłowa odpowiedź, zadziałała i jest taka prosta. Nie sonduję jednak repozytorium, więc myślę, że nadal istnieje ten problem.
Jeremy
76

Żadna z tych odpowiedzi nie była dla mnie wystarczająca, korzystając z Jenkins CI v.1.555, wtyczki Git Client w wersji 1.6.4 i wtyczki Git 2.0.4.

Chciałem zbudować zadanie dla jednego repozytorium Git dla jednego określonego, stałego (tj. Niesparametryzowanego) tagu. Musiałem zebrać razem rozwiązanie z różnych odpowiedzi oraz wpis na blogu „Zbuduj tag Gita” cytowany przez Thilo .

  1. Upewnij się, że przekazujesz swój tag do zdalnego repozytorium za pomocą git push --tags
  2. W sekcji „Repozytorium Git” zadania, pod nagłówkiem „Zarządzanie kodami źródłowymi” kliknij opcję „Zaawansowane”.
  3. W polu Refspec dodaj następujący tekst: +refs/tags/*:refs/remotes/origin/tags/*
  4. W sekcji „Branże do zbudowania”, „Specyfikator gałęzi” wpisz */tags/<TAG_TO_BUILD>(zastępując <TAG_TO_BUILD>rzeczywistą nazwą tagu).

Dodanie Refspec okazało się dla mnie krytyczne. Chociaż wydawało się, że repozytoria git domyślnie pobierały wszystkie zdalne informacje, gdy zostawiłem je puste, wtyczka Git nie mogłaby jednak znaleźć mojego tagu. Dopiero gdy wyraźnie określiłem „pobierz zdalne tagi” w polu Refspec, wtyczka Git była w stanie zidentyfikować i zbudować z mojego tagu.

Aktualizacja 2014-5-7 : Niestety, to rozwiązanie ma niepożądany efekt uboczny dla Jenkins CI (v.1.555) i mechanizm powiadomień push repozytorium Git à la Stash Webhook to Jenkins : za każdym razem, gdy aktualizowana jest dowolna gałąź w repozytorium po naciśnięciu zadania tworzenia tagów również zostaną uruchomione ponownie. Prowadzi to do wielu niepotrzebnych ponownych kompilacji tych samych zadań tagów w kółko. Próbowałem skonfigurować zadania zarówno z opcją „Wymuś sondowanie przy użyciu obszaru roboczego”, jak i bez niej, ale wydawało się, że nie przyniosło to żadnego efektu. Jedynym sposobem, w jaki mógłbym uniemożliwić Jenkinsowi tworzenie niepotrzebnych kompilacji dla zadań tagów, jest wyczyszczenie pola Refspec (tj. Usunięcie +refs/tags/*:refs/remotes/origin/tags/*).

Jeśli ktoś znajdzie bardziej eleganckie rozwiązanie, edytuj tę odpowiedź, aktualizując. Podejrzewam na przykład, że może tak się nie stało, gdyby refspec był konkretnie, +refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>a nie gwiazdką catch-all. Na razie jednak to rozwiązanie działa dla nas, po prostu usuwamy dodatkowy Refspec po pomyślnym wykonaniu zadania.

gotgenes
źródło
4
Aby "dodać następujący tekst" do refspec ... jeśli twój refspec był wcześniej +refs/heads/*:refs/remotes/origin/*, teraz będzie +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*. (Nie pracowałem zbyt wiele z refspecami, więc zajęło trochę eksperymentów, aby dowiedzieć się, że to pole jest ograniczone przestrzenią.)
driftcatcher
1
Dodatkowe +1 za to rozwiązanie. Wcześniejsze rozwiązania też mi nie odpowiadały.
whitespy 9
16

Czy nie możesz powiedzieć Jenkinsowi, aby budował z nazwy referencyjnej? Jeśli tak, to tak

refs/tags/tag-name

Ze wszystkich pytań, które widzę na temat Jenkinsa i Hudsona, sugerowałbym przejście na TeamCity. Nie musiałem edytować żadnych plików konfiguracyjnych, aby TeamCity działało.

Andrew T. Finnell
źródło
Nie jesteś pierwszą osobą, która zasugerowała miasto zespołu. Czy naprawdę jest o wiele lepiej? Mógłbym to sprawdzić.
sksamuel
1
@monkjack Wypróbowałem tę samą składnię w jednym z moich repozytoriów i zadziałało. Czy możesz wymienić swoje obecne tagi? Czy na pewno git push --tags
włożyłeś
4
Zbliżać się. Nie wypychałem tagów na odległość, ale teraz tak. Mogę teraz zmusić Jenkinsa do zbudowania, używając refs / tags / harpercollins-1.0.16, jednak zawsze nalega na budowanie głowy, niezależnie od tego, co tam umieściłem. Potwierdziłem, że pilot ma tag (można go zobaczyć w gitweb) i zrobienie migawki tego tagu potwierdza, że ​​wszystko jest tam poprawnie.
sksamuel
6
TeamCity jest prawnie zastrzeżone, przez co jest praktycznie bezużyteczne.
slang
2
O tak, przejście z darmowego narzędzia na komercyjny to właściwy wybór! Kiedy odrzutowce wymyślą na nowo koło i stworzą nowe narzędzie do śledzenia błędów, czy zaproponujesz innym przejście z bugzilli na to?
m1ld
11

Jeśli używasz potoków Jenkinsa i chcesz pobrać konkretny tag (np. TAGParametr swojej kompilacji), oto co możesz zrobić:

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
źródło
9

W najnowszym Jenkinsie (1.639 i nowszym) możesz:

  1. wystarczy podać nazwę tagu w polu „Branches to build”.
  2. w sparametryzowanej kompilacji możesz użyć parametru jako zmiennej w tym samym polu „Branches to build”, czyli $ {Branch_to_build}.
  3. możesz zainstalować wtyczkę Git Parameter, która zapewni Ci funkcjonalność poprzez wyświetlenie wszystkich dostępnych gałęzi i tagów.
m1ld
źródło
1
Rzeczywiście, samo wpisanie nazwy tagu działało również dla mnie. Chociaż dokumentacja tego dodatku we wtyczce git nadal wyraźnie mówi, że nie powinno to działać: „<tagName>: To nie działa, ponieważ tag nie zostanie rozpoznany jako tag. Zamiast tego użyj refs / tags / <tagName>."
Zitrax
To zadziałało dla mnie w Jenkins 1.532.3, właśnie podałem wersję tagu (np. 1.0.1) W gałęziach do budowania pola.
andre
9

Zrobiłem coś takiego i zadziałało:

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

wprowadź opis obrazu tutaj

Dziennik Jenkinsa potwierdził, że pobierał źródło z tagu

Sprawdzanie wersji 0b4d6e810546663e931cccb45640583b596c24b9(v0.9.5.2)

Hasan Shaik
źródło
To jest świetne do budowania wszystkich tagów, dzięki! Dodanie tego refspecbyło sztuczką, klikając przycisk Zaawansowane.
styfle
9

Ustawiam pole Advanced-> Refspec na refs/tags/[your tag name]. Wydaje się to prostsze niż różne inne sugestie dotyczące Refspec, ale dla mnie zadziałało dobrze.

AKTUALIZACJA 23.07.2014 - Właściwie po dalszych testach okazuje się, że nie działa to zgodnie z oczekiwaniami. Wygląda na to, że wersja HEAD wciąż była sprawdzana. Cofnij to jako zaakceptowaną odpowiedź. Skończyło się na tym, że otrzymałem działające rozwiązanie, śledząc post z gotgenes w tym wątku (30 marca). Wspomniany w tym poście problem niepotrzebnego wyzwalania kompilacji nie był dla mnie problemem, ponieważ moja praca jest uruchamiana z zadania nadrzędnego, a nie z odpytywania SCM.

AKTUALIZACJA KWIECIEŃ-2018 - Zwróć uwagę w komentarzach, że działa to dla jednej osoby i zgadza się z dokumentacją Jenkins.

Nebu
źródło
Chciałem tylko zauważyć, że - cztery lata po opublikowaniu tej odpowiedzi - używanie refs/tags/<tagname>jest tym, co mówi dokumentacja Jenkinsa , i dla mnie działa dobrze. Być może wtyczka zawierała błędy w czasie publikacji oryginalnego posta, ale ... od kwietnia 2018 r. To jest poprawna odpowiedź.
evadeflow
Aktualizuję mój poprzedni komentarz: Właściwie odkryłem, że mogę pominąć refs/tagsprefiks i po prostu użyć <tagname>. YMMV, ale ... do moich celów działa dobrze.
evadeflow
3

Udało mi się skłonić Jenkinsa do zbudowania tagu, ustawiając Refspec i specyfikator gałęzi zgodnie z opisem w tym poście na blogu .

Musiałem również ustawić nazwę repozytorium (w moim przypadku na „origin”), aby móc odwoływać się do niego w Refspec (w przeciwnym razie najwyraźniej używałby losowo wygenerowanej nazwy).

Thilo
źródło
2

W końcu zrobiłem:

  • stworzył nową gałąź jenkins-targeti skłonił Jenkinsa do śledzenia tego
  • scal z dowolnej gałęzi lub tagu, który chcę zbudować na jenkins-target
  • gdy kompilacja działała, testy przeszły pomyślnie itp., po prostu utwórz tag z jenkins-targetgałęzi

Nie jestem pewien, czy to zadziała dla wszystkich, mój projekt był dość mały, niezbyt wiele tagów i innych rzeczy, ale jest bardzo łatwy do zrobienia, nie musisz się bawić z refspecami i parametrami i tak dalej :-)

Hugh Perkins
źródło
Podoba mi się to bardzo proste podejście.
zochhuana
2

Możesz zbudować nawet typ tagu, na przykład 1.2.3-alpha43używając symboli wieloznacznych:

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

Specyfikator gałęzi: origin/tags/1.2.3-alpha*

Możesz również zaznaczyć opcję „Kompiluj, gdy zmiana zostanie przesłana do GitHub ”, aby wywołać wypychanie, ale musisz dodać akcję Utwórz do elementu webhook

wodospad
źródło
1

Dodając tutaj moje dwa centy, ponieważ nie widziałem odpowiedzi używającej opcji „Buduj z parametrami” w Jenkinsie.

Tutaj używam konsoli przeglądarki Jenkins CI dla projektu starwars_api i mogłem budować bezpośrednio z "Buduj z parametrami" z wartościami refs / tags / tag-name

  1. wybierz opcję „buduj z parametrami”.
  2. dodaj wartość w polu jako „refs / tags / tag_142” (nazwa_tagu = tag_142 na przykład)

build z nazwą tagu ref

anayagam
źródło