1. Jenkins - TomekZet/mlworkshops GitHub Wiki

Jenkins to system ciągłej integracji (Continous Integration, CI) napisany w języku Java, będący kontynuacją projektu Hudson. Umożliwia on między innymi automatyczne budowanie, testowanie i wydawanie oprogramowania. Działa jako aplikacja webowa z graficznym interfejsem, umożliwiająca łatwe zarządzanie i monitorowanie wykonywanych w niej zadań.

Dzięki stosowaniu narzędzi ciągłej integracji takich jak Jenkins zespół pracujący nad projektem zyskuje:

  • wspólne środowisko do testowania zmian, replikowania błędów
  • łatwość monitorowania zmian zachodzących w oprogramowaniu
  • środowisko do integracji ze sobą części składowych (np. modułów, modeli) w jedną całość
  • automatyzację zadań, takich jak bydowanie, wydawanie, testowanie
  • środowisko, w którym można stworzyć prosty graficzny interfejs służący do uruchamiania pewnych zadań z poziomu przeglądarki

Funkcjonalność Jenkinsa może być rozszerzana za pomocą licznych wtyczek (pluginów) oferujących bardzo szerokie możliwości dostosowywania go do własnych potrzeb, a także integracji z innymi narzędziami.


Dobrą praktyką jest przygotowanie środowiska ciągłej integracji przed rozpoczęciem prac nad właściwym zadaniem/projektem. Dzięki temu możemy od początku w zautomatyzowany sposób budować i testować nasz program i śledzić generowane przez niego wyniki.


Na początku przygotujemy Jenkinsowy projekt (w angielskie wersji "Job"). Docelowo będzie on pobierał wyniki rozpoznawania mowy z innego projektu i obliczał wartości metryki WER dla tych wyników.

Na początku zajmiemy się samą konfiguracją projektu, tak, żeby już w trakcie tworzeniu skryptu obliczającego metryki można było testować jego działanie w zewnętrznym środowisku, jakim jest Jenkins.

  1. Zaloguj się na http://tzietkiewicz.vm.wmi.amu.edu.pl:8080 za pomocą konta wydziałowego (jak w laboratoriach WMI)

  2. Utwórz nowy projekt (Job)

    Istnieje kilka rodzajów projektów w Jenkinsie.

    Po kliknięciu "Nowy projekt" zobaczymy listę dostępnych rodzajów projektów. Nas interesuje projekt typu "Pipeline".

    Jako nazwę proszę wpisać "USERNAME-metrics", gdzie USERNAME proszę zastąpić swoją nazwą użytkownika

  3. Zdefiniuj Pipeline

    Projekty typu Pipeline definiuje się w pliku Jenkinsfile za pomocą skryptu napisanego w jednym z dwóch dostępnych DSL (Domain Specific Language):

    • Scripted pipeline (podzbiór języka Groovy)
    • Declarative pipeline

    Pierwszy z nich daje większe możliwości, drugi jest łatwiejszy i bardziej przejrzysty, ale ma mniejszą siłę ekpresji.

    Fragmenty kodu można również generować przy pomocy kreatora, dostępnego pod linkiem "Pipeline syntax" na stronie każdego projektu.

    Jenkinsfile może być wprowadzony bezpośrednio z poziomu przeglądarki, albo pobrany z repozytorium.

    Zacznijmy od pierwszej opcji. Jako przykładowego pipeline użyj przykładu Hello World podanego na https://jenkins.io/doc/book/pipeline/getting-started/

    Zapisz projekt i spróbuj go uruchomić (przycisk "Uruchom"/"Run" na głównej stronie projektu).

  4. Podłącz repozytorium git

    • Stwórz nowe publiczne repozytorium git na wydziałowym serwerze https://laboratoria.wmi.amu.edu.pl/uslugi/pozostale-uslugi/git/ W przypadku problemów z utworzeniem repozytorium zdalnie, może być to również dodwolne inne, publicznie dostępne repozytorium, np. na GitHub. Możesz je nazwać np. sNRINDEKSU-mlworkshops

    • Sklonuj repozytorium lokalnie zgodnie ze wskazówkami wyświetlonymi po jego utworzeniu.

    • Utwórz plik "Jenkinsfile" (zawartość taka sama jak poprzednio) i dodaj go do repozytorium.

    • W ustawieniach projektu przełącz "Pipeline definition" na "Pipeline script from SCM" i podaj ścieżkę do nowo utworzonego repozytorim.

    • Projekt powinien się uruchamiać za każdym razem, kiedy pojawią się nowe zmiany w repozytorium: "Konfiguracja" -> "Build Triggers" -> "Poll SCM"

    • W razie problemów z klonowaniem/pushowaniem repozytorium, użyj protokołu ssh zamiast https (przy kopiowaniu ścieżki do repozytorium). Będzie to wymagało skopiowania zawartości pliku ~/.ssh/id_rsa.pub i wklejenia go w ustawieniach wydziałowego gita w zakładce SSH Keys

  5. Edytuj zawartość Jenkinsfile tak, żeby realizował on następujące zadania:

    1. Sklonowanie repozytorium git (krok "checkout: Check out from version control")
    2. Kopiowanie plików z wynikami rozpoznawania mowy z artefaktów projektu ASR-eval (projekt ten symuluje prawdziwy system ASR: okresowo produkuje plik wikinews_results.txt z wynikami rozpoznawania mowy): - użyj kroku "copyArtifacts" - możesz wygenerować potrzebny kod za pomocą generatorów w "Pipeline Syntax")
    3. Wywołanie skryptu shella (krok "sh: Shell Script"). - Domyślnie tutaj znajdzie się wywołanie naszego skryptu liczącego metryki. Na razie wystarczy, że ten skrypt będzie "liczył" ilość linii w wejściowym pliku (polecenie "wc -l"). - Skrypt powinien być zapisany w repozytorium. Unikamy wpisywania treści skryptów bezpośrednio w Jenkinsfile! - Skrypt powinien zapisywać wyniki swojego działania do pliku
    4. Plik powstały w kroku 3. należy archiwizować (krok "archiveArtifacts"), tak, żeby mógł być wykorzystany przez kolejne projekty.