Klimas7

Moje miejsce w sieci – Wyznania fizyka, programisty

W poprzednim wpisie przedstawiłem w jaki sposób wykonać prosty kalkulator w oparciu o projekt na Jenkinsie.
Tak jak sygnalizowałem kalkulator oparty na skrypcie napisanym w bash’u jest dosyć odporny na błędne dane wprowadzane przez użytkownika. Wynika to z natury zastosowanego rozwiązania, czyli bc.
Rozwiązanie w oparciu o skrypt groovy nie jest już tak odporne na błędne dane. Oczywiście można walidację przenieść do skryptu ale w tym przypadku było by to mało odkrywcze. Dlatego preferowanym rozwiązaniem będzie dodanie takich parametrów zadnia, które zapewnią walidację wprowadzanych danych oraz kontrolę danych w uruchomionym zadaniu. Uwaga! Jakiekolwiek walidacje parametrów nie blokują uruchomienia zadania, dlatego potrzebna jest kontrola w już uruchomionym zadaniu.
Jak już wspomniałem w poprzednim wpisie Jenkins posiada bardzo dużą 🙂 liczbę wtyczek. Przedstawione przeze mnie założenia spełnia wtyczka Validating String Parameter. Teraz można zamienić dotychczasowe parametry na te które zostaną zdefiniowane przy pomocy zainstalowanej wtyczki.
jenkins_kalkulator_job1
Oprócz standardowych opcji znanych z String parameter dostępne są dwie dodatkowe. Wyrażenie regularne które musi spełniać wprowadzana wartość oraz tekst komunikatu przy wprowadzeniu niepoprawnej wartości. W przypadku kalkulatora ma być możliwe wprowadzanie tylko liczb całkowitych.
jenkins_kalkulator_job1
Jeżeli mimo walidacji uruchomimy zadnie otrzymamy.
jenkins_kalkulator_job1
Oczywiście zgodnie z założeniami nasze build zakończy się porażką.
Dodatkowo w tym miejscu chciałbym zwrócić uwagę na pewien aspekt konfiguracyjny. Adres www pod jakim „mamy” wystartowanego Jenkinsa ma być zgodny z tym co jest wpisane w konfiguracji Jenkinsa.
W moim przypadku localhost (127.0.0.1) jest tożsame z xps15 (pod takim właśnie adresem dostępny jest Jenkins) dlatego w konfiguracji powinien być podany adres.
jenkins_kalkulator_job1
Jeżeli w przeglądarce będziemy używać innego adresu niż tego podanego w konfiguracji to część funkcjonalności oferowanych przez wtyczki/Jenkinsa może w niektórych przeglądarkach nie działać prawidłowo. Przykładowo w Chrome otrzymamy błąd No ‚Access-Control-Allow-Origin’ header is present on the requested resource oraz nie pojawi się komunikat z walidacją!
jenkins_kalkulator_job1

W ostatnich dniach w ramach inicjatywy CaseWeek miałem przyjemność prowadzić warsztaty z Jenkinsa.
W trakcie przygotowań stwierdziłem że oprócz standardowych możliwości warto pokazać jak pisać wtyczki do Jenkinsa, w tym miejscu powstał problem, co taka przykładowa wtyczka miała by robić. Jaki wybrać przykład aby zaprezentować jak najwięcej elementów konfiguracyjnych.
Przyznam szczerze długo nie mogłem wpaść na jakiś sensowny pomysł, który by zawierał wystarczająco dużo elementów konfiguracyjnych tak aby było to warte zaprezentowania, ale jednak eureka – Kalkulator!
Każdy pewnie ucząc się jakiegoś języka programowania pisał swój własny, najprostszy kalkulator, to właśnie stworzenie prostego kalkulatora miało pokazać jak tworzy się wtyczki.

Założenia jakie przyjąłem na sam początek to:
1. Globalna konfiguracja – zmienna globalna
1a. Pole tekstowe z wyborem systemu liczbowego w jakim ma być wypisywany wynik działania kalkulatora: hex, oct, bin, dec
2. Parametry zadania
2a. Dwa pola tekstowe do wprowadzania liczb całkowitych
2b. Pole wyboru z rodzajem działania, do wyboru spośród: +, -, *, /
3. Build step
3a. Skrypt w bash’u lub/oraz skrypt w groovy’m który oblicz wynik działania i prezentuje go na standardowe wyjście.

Oczywiście na sam początek najbardziej naiwna wersja w której (lekką ręką) zakładam ze użytkownik wprowadził dane prawidłowo. W związku z czym nie potrzebujemy żadnych walidacji. Dodatkowym założeniem jest to że w przypadku dzielenia przez 0 jako rezultat działania ma być wyświetlone ‚nan’.

Zacznę od dodania zmiennej globalnej którą nazwę numeral_system przechodzimy do Jenkins -> Zarządzaj Jenkinsem -> Skonfiguruj system zaznaczamy opcję Environment variables i do dajemy zgodnie z tym co na zrzucie.
jenkins_global_config
Następnie dodajemy nowe projekt typu Freestyle project nazwijmy go Kalkulator. Zaznaczamy opcję To zadanie jest sparametryzowane i dodajemy kolejno dwa parametry typu String z domyślną wartością 0 oraz jeden parametr typu Choice.
jenkins_kalkulator_job
W pierwszej wersji logika kalkulatora zostanie zrealizowana w bash’u. Jako Build step dodajemy Execute shell i wpisujemy poniższy skrypt.

#!/bin/bash

function convertNumericalSystem(){
  case ${numeral_system} in
    "hex") convertNumber=$(echo "ibase=10;obase=16;$1"|bc);;
    "oct") convertNumber=$(echo "ibase=10;obase=8;$1"|bc);;
    "bin") convertNumber=$(echo "ibase=10;obase=2;$1"|bc);;
    *) convertNumber=$1 
  esac
  echo $convertNumber
}

if [[ ${operation} = '/' && ${second} = '0' ]]; then
  answer='nan'
else    
  answer=$(echo "${first}${operation}${second}"|bc)
  answer=$(convertNumericalSystem $answer)
fi    

echo ${first} ${operation} ${second} = ${answer}

W wyniku kilku testowych uruchomień dostajemy:
jenkins_kalkulator_job1
jenkins_kalkulator_job1
jenkins_kalkulator_job1
jenkins_kalkulator_job1
jenkins_kalkulator_job1

W przypadku wpisania niepoprawnych wartości (np. liter lub innego ciągu znaków) otrzymamy przekłamany wynik ponieważ bc traktuje je jako nazwy zmiennych które domyślnie mają wartość 0.
Należy zwrócić uwagę że dostęp do zmiennych globalnych jak i parametrów zadania odbywa się w taki sam sposób poprzez konstrukcję ${NAZWA}.

Przejdźmy teraz do kolejnej implementacji czyli kalkulatora w napisanego groovym. Tutaj przyjmuję założenie że zainstalowana jest wtyczka Scriptler.
Wybieramy: Jenkins -> Scriptler -> Add a new Script gdzie definiujemy poszczególne parametry.
jenkins_kalkulator_job1
Treści samego skryptu nie zamieszczałem tutaj (aby nie przedłużać) jest on dostępny na GitHub. Istotne jest zaznaczenie opcji Permission jeśli tego nie zrobimy to skryptu nie będzie można wybrać w zadaniu. Dodatkowo należy zwrócić uwagę na sposób pobrania zmiennej globalnej Jenkins’a, nie jest to tak oczywiste jak w przypadku bash’a. Natomiast do parametrów zadania możemy odwoływać się jak do najzwyklejszych zmiennych skryptu.
Mając tak przygotowany skrypt możemy w konfiguracji naszego zadania dodać kolejny krok wykonania (Build step) czyli Scriptler script. Aby przekazać parametry zadania do skryptu należy zaznaczyć opcję Propagate Job params to script.
jenkins_kalkulator_job1

W kolejnych częściach pokażę jak dodać parametry zadania które są walidowane w trakcie wprowadzania i wykonania zadania oraz przejdę do meritum czyli tworzenia wtyczki.