Integrace na Jenkins CZ


Jenkins: Obecný popis procesu
Upstream job, který je nakonfigurován nejdříve, obsahuje všechny testy určené k exekuci. Poté co je build spuštěn tímto jobem, test report s výsledky je vygenerován a pak se spustí downstream job se svým buildem (upstream build URL je také odesláno do downstream jobu).

Downstream job přebírá test report s výsledky a podle nastavených parametrů zapisuje dané výsledky do databáze.

Jenkins: Detailní konfigurace

1. Přihlašte se do Jenkins.

2. Klikněte na šipku dolů na tlačítku Jenkins v levém horním rohu, najeďte na Manage Jenkins a v submenu klikněte na Manage Plugins.



3. V záložce Available použijte vyhledávací pole Filter, najděte Parameterized Trigger plugin a nainstalujte ho.


4. Klikněte na tlačítko Jenkins vlevo nahoře, abyste se dostali zpět na seznam buildů a klikněte na menu možnost People. Jakmile se stránka načte, zkopírujte své User ID a uložte si ho bokem, budete ho potřebovat později.


5. Klikněte na odkaz vašeho User ID a klikněte v menu na možnost Configure.


6. Klikněte na tlačítko Add new Token a pak na tlačítko Generate. Zkopírujte číslo tokenu a uložte si ho bokem, budete ho potřebovat později. Klikněte na tlačítko Save.




7. Je čas založit nový projekt - tento projekt bude později zapisovat test výsledky do upstream jobu (ten musí generovat výsledky z pluginu, ve kterém jsou nastaveny seleniové testy = jUnit plugin je pro správné fungování testů, Bootstraped-multi-test-results-report plugin slouží pro zobrazování test výsledků).
Klikněte na menu možnost New Item, zadejte jméno nového projektu, klikněte na Freestyle project, klikněte na OK a na nově zobrazené stránce klikněte přímo na tlačítko Save.




8. Klikněte na tlačítko Jenkins vlevo nahoře, abyste se dostali zpět na seznam buildů.
Klikněte na váš vytvořený projekt a pak na menu možnost Configure.




9. Na záložce General zaklikněte checkbox This project is parameterized. Do nově vytvořené sekce zadejte následující detaily:
  • Name – vždy zadejte “proj_ID”
  • Default Value – project ID z JunoOne – portálové menu sekce Projekty



  • Description – je vhodné vyplnit do tohoto pole detaily, které popíší parametry z výše zmíněných polí



10. Běžte do záložky Build Triggers a zaklikněte checkbox Trigger builds remotely (e.g. from scripts). 
Toto je build trigger z konzole. 
Zadejte autentizační token – vytvořte si svůj token, který bude později použit v JunoOne, jakmile budete vytvářet “Přidat job do plánu” v sekci Projekty > Automat.






11. Běžte do záložky Post Steps, klikněte na tlačítko Add post_build step a přidejte novou sekci Trigger parameterized build on other projects.


12. Nově vytvořená sekce se objeví pod záložkou Build Settings. 
Projects to build – zadejte jméno vašeho vytvořeného projektu
Trigger when build is – vyberte možnost Complete (always trigger)



13. Klikněte na tlačítko Add Parameters a vyberte možnost Predefined parameters.
Zadejte PRE_BUILD=${BUILD_URL} do textového pole Parameters a pak klikněte na tlačítko Save.


14. Zobrazí se vám stránka projektového přehledu, která nyní obsahuje novou sekci Downstream Projects, kde se váš downstream projekt musí nastavit. Klikněte na jeho odkaz.

15. Klikněte na menu možnost Configure. 



V záložce General zaklikněte checkbox This project is parameterized a tlačítkem Add Parameter přidejte dvě sekce String Parameter (obě pole description můžou zůstat prázdné):
  • první sekce:

- Name – PRE_BUILD (toto je build, který jsme nastavili předtím v upstream jobu)
  • druhá sekce:

- Name – proj_ID
- Default Value – zadejte project ID, které musí být stejné jako předtím v upstream jobu

16. Běžte do záložky Build a tlačítkem Add Build Step vytvořte sekci Execute Shell. Každému klientovi budou vytvořeny nové specifické proměnné. Jakmile je získáte, vložte uvedený skript do sekce Execute Shell. 

Níže je příklad takového skriptu. Následující údaje jsou unikátní pro každého klienta:
Jenkins_USER – User ID, který jste si předtím uložili bokem
Jenkins_TOKEN – vygenerované číslo tokenu, které jste si předtím uložili bokem
WSO2_TOKEN – přístupový token do API (každý uživatel má jiný, bude poskytnut společností Denevy)
API adresa - nahraďte současnou API adresu na posledním řádku skriptu: "Authorization: Bearer $AUTH_TOKEN" "https://xxxx.denevy.eu/xxxx/v1/test_results"

#!/bin/bash
#Tento job se triggeruje upstream jobem. K uspesnemu behu potrebuje jen 
#'$BUILD_URL' z upstreamu. Na tento job se muze napojit x projektu a 
#data vsech se prenesou do databaze (podle api). Test report by mel byt stejny jako v Juno_automatizovane_testovanie
echo $proj_ID
echo $PRE_BUILD
################################################################################################
#tabulka automated_jobs
#tyto vars jsou potreba k stahovani reportu
Jenkins_USER=xxxxx
Jenkins_TOKEN=11xxxxxxxxxxxxxxxxxxxxxxx
WSO2_TOKEN=UDhBXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5S2ljaUZIYVlh

JOB_ID=$(echo $PRE_BUILD | cut -d'/' -f 6) #vytahnu job # z build url
JOB_NAME=$(echo $PRE_BUILD | cut -d'/' -f 5) #vytahnu project name z build url

promenna=$(curl -k --user $Jenkins_USER:$Jenkins_TOKEN --silent ${PRE_BUILD}api/xml) #do teto promenne se stahne prehled upstream jobu
JOB_START=$(echo $promenna | xmlstarlet sel -t -m '//timestamp' -v . -n) #z prehledu upstream jobu dostaneme tag <timestamp> - zacatek upstream projektu
JOB_DURATION=$(echo $promenna | xmlstarlet sel -t -m '//duration' -v . -n) #z prehledu upstream jobu dostaneme tag <duration> - doba trvani celeho jobu

let time_en=$JOB_START+$JOB_DURATION #vypocet konce upstream jobu 
time_end=$(printf "%.3f\n" $(($time_en/1000))) #prevod casu v milisekundach na sekundy
JOB_END=$(date +%FT%T -d @$time_end) #cas konce upstream jobu

#z prehledu upstream jobu dostanu result
BUILD_STATUS=$(curl -k --user $Jenkins_USER:$Jenkins_TOKEN --silent ${PRE_BUILD}api/json | jq -r '.result')

#api token
AUTH_TOKEN=`curl -k -d "grant_type=client_credentials" -H "Authorization: Basic $WSO2_TOKEN" https://api-test.denevy.eu/token | awk -F'"' '{print $4}'`
#vlozeni do databaze pomoci api a json 
curl -v -k -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "https://api-test.denevy.eu/test_juno2/v1/automated_jobs" -d '{ "job_status": "'$BUILD_STATUS'", "project_ID": "'$proj_ID'", "job_name": "'$JOB_NAME'", "job_id": '$JOB_ID', "job_time_end": "'$JOB_END'", "job_build_responsible": "'$EXECUTOR_NUMBER'", "job_url": "'$PRE_BUILD'", "job_last_duration": '$JOB_DURATION' }'
################################################################################################
#tabulka test_results

#
promenna1=$(curl -k --user $Jenkins_USER:$Jenkins_TOKEN --silent ${PRE_BUILD}testReport/api/xml) #do teto promenne se stahne test report upstream jobu

#vytahnu si z reportu data 
skipped=$(echo $promenna1 | xmlstarlet sel -t -m './/case/skipped' -v . -n) #z reportu si vytahnu <skipped> - skippnul se test?
status=$(echo $promenna1 | xmlstarlet sel -t -m './/case/status' -v . -n) #z reportu si vytahnu <status> - s jakym statusem skoncil test?
duration=$(echo $promenna1 | xmlstarlet sel -t -m './/case/duration' -v . -n) #z reportu si vytahnu <duration> - jak dlouho trval test?
name=$(echo $promenna1 | xmlstarlet sel -t -m './/case/className' -v . -n) #z reportu si vytahnu <className> - nazev testu
test_count=$(echo $promenna1 | xmlstarlet sel -t -m '//totalCount' -v . -n) #z reportu si vytahnu <totalCount> - kolik bylo celkem v upstream jobu testu

#data dam do array
arr_status=($status)
arr_name=($name)
arr_skipped=($skipped)
arr_duration=($duration)

#api token
AUTH_TOKEN=`curl -k -d "grant_type=client_credentials" -H "Authorization: Basic $WSO2_TOKEN" https://api-test.denevy.eu/token | awk -F'"' '{print $4}'`

#vlozeni do databaze pomoci api a json 
for (( i=0; i<$test_count; i++ )); do array_name_rep=${arr_name[$i]}; array_status_rep=${arr_status[$i]}; array_duration_rep=${arr_duration[$i]}; array_skipped_rep=${arr_skipped[$i]}; curl -v -k -H "Content-Type: application/json" -H "Authorization: Bearer $AUTH_TOKEN" "https://api-test.denevy.eu/test_juno2/v1/test_results" -d '{ "status": "'$array_status_rep'", "project_ID": "'$proj_ID'", "build_ID": '$JOB_ID', "test_name": "'$array_name_rep'", "duration": "'$array_duration_rep'", "skipped": "'$array_skipped_rep'", "job_name": "'$JOB_NAME'" }'; done

17. Po vložení skriptu bude sekce vypadat takto.

18. Klikněte v Jenkins na tlačítko Save.

Comments

Popular posts from this blog

DevOps tools - choose wisely!

Clutch Names Denevy As A Top Developer in the Czech Republic for 2021

Test Strategy is not only document