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.