Rozważam ostatnio użycie skryptu potokowego Jenkinsa, jedno pytanie brzmi, że nie wymyśliłem inteligentnego sposobu na stworzenie wewnętrznego kodu narzędzi wielokrotnego użytku, wyobraź sobie, mam wspólną funkcję helloworld
które będą używane przez wiele zadań związanych z potokami, więc mam nadzieję stworzyć utils.jar
może wstrzyknąć go do ścieżki klasy pracy.
Zauważam, że Jenkins ma podobną koncepcję z globalna biblioteka, ale moje obawy dotyczące tej wtyczki:
Ponieważ jest to wtyczka, musimyzainstaluj / zaktualizuj go za pomocą menedżera wtyczek jenkins, a następnie może wymagać ponownego uruchomienia, aby zastosować zmianę, to nie jest to, co chcę zobaczyć, ponieważ utils może się zmienić, dodaj zawsze, mamy nadzieję, że będzie dostępny natychmiast.
Po drugie, jest to oficjalna wspólna biblioteka jenkins, nie chcę (lub nie będą nas stosować) umieścić prywatny kod w repozytorium jenkins.
Czy masz jakiś dobry pomysł?
Odpowiedzi:
27 dla odpowiedzi nr 1The Wspólne biblioteki (docs) pozwala na zrobienie Twój kod dostępny dla wszystkich skryptów rurociągów. Nie musisz budować wtyczki do tego i nie musisz ponownie uruchamiać Jenkinsa.
Na przykład. to jest moja Biblioteka i to plik Jenkinsfile to nazywa tę wspólną funkcję.
EDIT (luty 2017):
Dostęp do biblioteki można uzyskać za pośrednictwem wewnętrznego serwera Git firmy Jenkins lub za pomocą innych środków (np. Przez szefa kuchni) na serwerze (wciąż możliwe, ale bardzo nieuchwytne).workflow-lib/
katalog w Jenkins katalog domowy użytkownika.
Globalną bibliotekę można skonfigurować za pomocą następujących środków:
- na
@Library("github.com/...")
adnotacja wJenkinsfile
wskazując adres URL udostępnionej repo biblioteki. - skonfigurowany na poziomie folderu zadań Jenkins.
- skonfigurowany w konfiguracji Jenkinsa jako biblioteka globalna, z tą zaletą, że kod jest zaufany, tj. nie podlega bezpieczeństwu skryptów.
Mieszanką pierwszej i ostatniej metody byłaby nieobciążona biblioteka współużytkowana, która jest następnie żądana tylko przy użyciu jej nazwy w Jenkinsfile
: @Library("mysharedlib")
.
8 dla odpowiedzi № 2
W zależności od tego, jak często planujesz ponowne użycie kodu, możesz także załadować funkcję (lub zestaw funkcji) jako część innego potoku.
{
// ...your pipeline code...
git "http://urlToYourGit/projectContainingYourScript"
pipeline = load "global-functions.groovy"
pipeline.helloworld() // Call one of your defined function
// ...some other pipeline code...
}
To rozwiązanie może wydawać się nieco kłopotliwew porównaniu do StephenKinga, ale to, co lubię w tym rozwiązaniu, to to, że moje globalne funkcje są zobowiązane do Gita i każdy może je łatwo modyfikować bez (prawie) jakiejkolwiek wiedzy o Jenkinsie, tylko podstawy Groovy.
W skrypcie Groovy jesteś load
ing, upewnij się, że dodasz return this
na samym końcu. Umożliwi to późniejsze wykonywanie połączeń. W przeciwnym razie po ustawieniu pipeline = load global-functions.groovy
, zmienna zostanie ustawiona na null
.
1 dla odpowiedzi nr 3
Oto rozwiązanie, którego obecnie używamy w celu ponownego użycia kodu Jenkinsfile:
node {
curl_cmd = "curl -H "Accept: application/vnd.github.v3.raw" -H "Authorization: token ${env.GITHUB_TOKEN}" https://raw.githubusercontent.com/example/foobar/master/shared/Jenkinsfile > Jenkinsfile.t
sh "${curl_cmd}"
load "Jenkinsfile.tmp"
}
Mogę być trochę brzydki, ale działa niezawodnie, a ponadto pozwala nam wstawić kod specyficzny dla repozytorium przed lub po współdzielonym kodzie.