Ontwerp een GitLab CI pipeline voor geautomatiseerde performance tests
description
Met deze prompt kun je een geautomatiseerde performance testpipeline opzetten binnen GitLab CI, waardoor je continu inzicht krijgt in de prestaties van je applicatie. Dit helpt problemen vroegtijdig te signaleren en de kwaliteit te verbeteren, wat handmatige tests en inefficiënte monitoring vervangt.
prompt
Help me een GitLab CI pipeline te ontwerpen die geautomatiseerde performance tests uitvoert na elke build. Mijn projecttype of technologie stack: <voer het type project of technologie stack in>. Testtools of frameworks die ik wil gebruiken: <geef de performance testtools of frameworks op>. Specifieke performance doelen of me ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorstel voor een GitLab CI pipeline die geautomatiseerde performance tests uitvoert na elke build, met k6 voor Node.js microservices. De pipeline bevat stages voor build, testen en performance tests, inclusief rapportage via Slack en het bewaken van de prestatie- en resource-doelen.
```yaml
stages:
- build
- test
- performance
variables:
K6_SCRIPT: "perf_tests/test_script.js"
SLACK_WEBHOOK_URL: "<je_slack_webhook_url>" # Vul hier je Slack webhook in
build_job:
stage: build
image: maven:3.8.4-jdk-11
script:
- mvn package
artifacts:
paths:
- target/
test_job:
stage: test
image: maven:3.8.4-jdk-11
script:
- mvn test
performance_job:
stage: performance
image: grafana/k6:latest
script:
- |
echo "Start performance test..."
k6 run --out json=results.json $K6_SCRIPT
echo "Analyseren resultaten..."
# Parse JSON resultaten en controleer op doelen
node analyze_results.js
timeout: 10m
artifacts:
when: always
paths:
- results.json
- report.html
after_script:
- |
# Verstuur rapport naar Slack
curl -X POST -H 'Content-type: application/json' --data "$(cat report_payload.json)" $SLACK_WEBHOOK_URL
```
Daarnaast moet je een `test_script.js` maken voor k6 die de performance tests uitvoert en de metriek verzamelt. Bijvoorbeeld:
```javascript
import http from 'k6/http';
import { check } from 'k6';
export let options = {
vus: 10,
duration: '30s',
thresholds: {
'http_req_duration': ['p(95)<200'], // 95% responses onder 200ms
},
};
export default function () {
let res = http.get('http://your-microservice/endpoint');
check(res, {
'status is 200': (r) => r.status === 200,
});
}
```
En een `analyze_results.js` script dat de resultaten evalueert en rapporteert:
```javascript
const fs = require('fs');
const data = JSON.parse(fs.readFileSync('results.json', 'utf8'));
// Controleer gemiddelde responstijd
const httpReqDuration = data.metrics['http_req_duration'];
const avgRespTime = httpReqDuration?.avg;
const maxCPU = data.metrics['cpu_usage']?.max; // Als CPU gebruik wordt gemeten
let alerts = [];
if (avgRespTime && avgRespTime > 200) {
alerts.push(`Gemiddelde responstijd is te hoog: ${avgRespTime} ms`);
}
if (maxCPU && maxCPU > 70) {
alerts.push(`CPU-gebruik is te hoog: ${maxCPU}%`);
}
// Maak rapport
const report = `
Performance Test Resultaten:
- Gemiddelde responstijd: ${avgRespTime} ms
- Max CPU-gebruik: ${maxCPU} %
`;
// Verstuur rapport
const payload = {
text: alerts.length > 0 ? alerts.join('\n') : 'Performance doelen gehaald! 🎉',
attachments: [
{
title: "Test Rapport",
text: report,
}
]
};
fs.writeFileSync('report_payload.json', JSON.stringify(payload));
```
**Opmerkingen:**
- Pas de URL's en scripts aan je eigen infrastructuur aan.
- Zorg dat je de juiste metrics verzamelt en verwerkt.
- Voeg eventueel extra checks toe voor CPU-gebruik als je dat met k6 of externe tools meet.
- Test de pipeline en pas waar nodig.
Met deze opzet wordt na elke build automatisch een performance test uitgevoerd, met rapportage en controle op de gestelde doelen binnen de tijdslimiet van 10 minuten.
provider: deepseek
model: deepseek-chat
Hier is een voorgestelde GitLab CI-configuratie voor jouw Node.js microservices project met geautomatiseerde performance tests met k6:
```yaml
stages:
- build
- test
- performance
variables:
K6_DURATION: "10m" # Maximale testduur
build_job:
stage: build
script:
- npm install
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 hour
test_job:
stage: test
script:
- npm test
performance_test:
stage: performance
image: grafana/k6:latest
script:
- |
k6 run --out json=test_results.json \
--vus 10 \
--duration $K6_DURATION \
--http-debug="full" \
--summary-trend-stats="avg,min,med,max,p(90),p(95)" \
script.js
artifacts:
paths:
- test_results.json
reports:
junit: test_results.json
allow_failure: false
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
performance_validation:
stage: performance
image: node:18
script:
- |
# Valideer performance metrics
npm install -g jq
AVG_RESPONSE_TIME=$(jq '.metrics.http_req_duration.avg' test_results.json)
MAX_CPU=70
echo "Gemiddelde responstijd: ${AVG_RESPONSE_TIME}ms"
echo "Doel: < 200ms"
if (( $(echo "$AVG_RESPONSE_TIME > 200" | bc -l) )); then
echo "FOUT: Gemiddelde responstijd overschrijdt 200ms"
exit 1
fi
echo "✓ Performance doelen behaald"
needs: ["performance_test"]
# Slack notificatie
notify_slack:
stage: .post
image: curlimages/curl:latest
script:
- |
curl -X POST -H 'Content-type: application/json' \
--data "{
\"text\":\"Performance test voltooid voor $CI_PROJECT_NAME\nBranch: $CI_COMMIT_REF_NAME\nPipeline: $CI_PIPELINE_URL\nResultaat: $CI_JOB_STATUS\"
}" \
$SLACK_WEBHOOK_URL
when: always
needs: []
```
**Aanvullende bestanden die je nodig hebt:**
1. **k6 test script (script.js):**
```javascript
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
thresholds: {
http_req_duration: ['avg < 200'], // Gemiddelde responstijd < 200ms
http_req_failed: ['rate<0.01'], // Minder dan 1% fouten
},
};
export default function () {
const response = http.get('https://jouw-api-endpoint.nl/api/test');
check(response, {
'status is 200': (r) => r.status === 200,
'response time OK': (r) => r.timings.duration < 200,
});
sleep(1);
}
```
2. **Omgevingsvariabelen in GitLab:**
- `SLACK_WEBHOOK_URL`: Jouw Slack webhook URL voor notificaties
**Belangrijke aanpassingen voor jouw project:**
1. **Build commando's aangepast** van Maven naar npm voor Node.js
2. **Performance stage toegevoegd** na de test fase
3. **k6 Docker image** voor de performance tests
4. **Automatische validatie** van de performance doelen
5. **Slack notificaties** bij voltooiing
6. **Artefacten** voor testresultaten
**Installatie stappen:**
1. Voeg de k6 test script toe aan je repository
2. Configureer de Slack webhook in GitLab CI/CD variabelen
3. Pas de API endpoints aan in het k6 script
4. Stel de juiste testparameters in (VUs, duration)
De pipeline zal nu automatisch performance tests uitvoeren en rapporteren via Slack binnen de gestelde tijdslimiet van 10 minuten.