Starten en stoppen van processes op Gitlab-CI

Ik, als software ontwikkelaar heb graag dat mijn nieuwe code dat ik toevoeg aan de code-base, dat deze getest worden om te voorkomen dat de nieuwe toevoegingen ook nieuwe bugs opleveren. Hiervoor heeft gitlab.com een mooi stukje service gemaakt om je code op te bouwen. te testen en eventueel te deployen naar de acceptatie omgeving. Om bijvoorbeeld de end-2-end testen uit te voeren moet je soms wat backend processen te starten met bijvoorbeeld “npm run start” en hier lopen vele mensen vast. Want dit is een process dat niet meer stopt en daarom dus ook niet naar de testen zal gaan.

Gitlab geeft je meerdere oplossingen aan die je zou kunnen implementeren en ik beschrijf er maar een. Laten wij een voorbeeld van een script dat je zou willen testen opsommen:

In .gitlab-ci.yml zou je het volgende hebben staan wat je wilt dat er moet gebeuren:.

job:
before_script:
- npm ci
- npm run start
script:
- npm run test
after_script:
-npm run stop

Maar dit zal niet gaan werken als er in je “npm run start” bijvoorbeeld een node-webserver gestart wordt die moet blijven draaien, dan blijt de script bji dat process en zal nooit bij de tests komen En bij erg wat complexe systemen, zoals waar ik werk waar ik makkelijk 3, en soms zelfs meer, processen op de achtergrond heb draaien. En juist bij het ontwikkelen van dit soort complexe systemen dan wil je de integratie met elkaar, goed getest hebben en zeker zijn van je werk.

De hamvraag is dus eigenlijk hoe start je een process op dat blijft draaien en kan gestopt worden wanneer jij dat wilt met een mooie exit code zodat het before_script afsluit en de volgende stap wordt uitgevoerd.

Ik heb een folder en een bestand aangemaakt in mijn repository.

/scripts/serverstart-ci.sh
--------------------------------------------------------------
#!/bin/bash
# Start de node-server en schrijf alle output naar nodeserver.log
npm run start > nodeserver.log 2>&1 &

# Wacht tot de server gestart is en klaar voor interactie. In mijn geval, webpack bericht.
while ! grep -q "Compiled successfully." nodeserver.log;
do
  sleep .1
done
# Vertel de gebruiker dat de server opgestart is
echo -e "Server Started\n"
# Exit met code 0.
exit 0
-------------------------------------------------------------

Daarna even nog chmod -x scripts/serverstart-ci.sh

En in de .gitlab-ci.yml heb ik
job_test:
stage: test
before_script:
- npm ci
- ./scripts/serverstart-ci.sh
script:
- npm run test
after_script:
- kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

De after_script ruimt de node-processen op en laat de server weer vrij.

En zo kan ik bijvoorbeeld mijn e2e testen runnen in zowel Selenium-WebDriver als sindskort ook met TestCafe op gitlab.  

Nawoord: Ja, er zijn veel meer methodes om dit probleem met scripts, die moeten blijven draaien op de achtergrond, om deze te starten of te stoppen. Via Services of External bijvoorbeeld. De bedoeling van deze blog is/was om te laten zien dat dit ook een andere mogelijkheid is die je snel kan toepassen zonder al te veel aanpassingen aan je gitlab-ci script