Strategi: Tes Mana Jalan Kapan
Kesalahan umum adalah menjalankan load test 30 menit di setiap commit. Pipeline jadi lambat, developer frustrasi, dan akhirnya tesnya dimatikan. Bagi berdasarkan tujuan:
| Kapan | Jenis tes | Durasi | Tujuan |
|---|---|---|---|
| Setiap commit / PR | Smoke test | < 1 menit | Skrip masih valid, tak ada error dasar |
Merge ke main | Load test ringan | 5–10 menit | Deteksi regresi performa |
| Nightly (terjadwal) | Load + stress penuh | 30–60 menit | Validasi kapasitas menyeluruh |
| Sebelum rilis besar | Soak + spike | 2–8 jam | Kesiapan produksi |
| Manual / on-demand | Breakpoint | Sampai jebol | Perencanaan kapasitas |
GitHub Actions
.github/workflows/performa.ymlyaml
name: Uji Performa
on:
pull_request:
branches: [main]
push:
branches: [main]
schedule:
- cron: '0 18 * * *' # 01:00 WIB setiap hari
workflow_dispatch: # tombol jalankan manual
inputs:
profil:
description: 'Profil beban'
type: choice
options: [smoke, load, stress, spike]
default: smoke
jobs:
smoke:
# Cepat: jalan di setiap PR
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- name: Pasang k6
uses: grafana/setup-k6-action@v1
with:
k6-version: '1.0.0' # sematkan versi agar hasil sebanding
- name: Jalankan smoke test
uses: grafana/run-k6-action@v1
with:
path: ./perf-tests/scenarios/smoke.js
flags: --vus 2 --duration 30s --summary-export=ringkasan.json
env:
BASE_URL: ${{ secrets.STAGING_URL }}
TEST_PASSWORD: ${{ secrets.TEST_PASSWORD }}
- name: Unggah hasil
if: always()
uses: actions/upload-artifact@v4
with:
name: hasil-smoke
path: ringkasan.json
load:
# Lebih berat: hanya di main dan jadwal malam
if: github.event_name != 'pull_request'
runs-on: ubuntu-latest
timeout-minutes: 45
steps:
- uses: actions/checkout@v5
- uses: grafana/setup-k6-action@v1
- name: Jalankan load test
run: |
k6 run \
--tag build=${{ github.run_number }} \
--tag commit=${{ github.sha }} \
--summary-export=hasil.json \
./perf-tests/scenarios/load.js
env:
BASE_URL: ${{ secrets.STAGING_URL }}
- name: Bandingkan dengan baseline
run: node ./perf-tests/bandingkan.js baseline.json hasil.json
- name: Beri komentar di PR bila ada regresi
if: failure()
run: echo "Performa memburuk — lihat artefak untuk detail"GitLab CI
.gitlab-ci.ymlyaml
stages: [test, performa]
smoke-performa:
stage: performa
image:
name: grafana/k6:1.0.0
entrypoint: [""]
variables:
BASE_URL: $STAGING_URL
script:
- k6 run --vus 2 --duration 30s
--summary-export=ringkasan.json
perf-tests/scenarios/smoke.js
artifacts:
when: always
paths: [ringkasan.json]
expire_in: 30 days
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"⛔ Jangan menghasilkan beban besar dari runner CI bersama
GitHub-hosted runner (2 vCPU, 7 GB RAM) hanya sanggup beberapa ratus VU sebelum runner itu sendiri menjadi bottleneck. Hasilnya akan berfluktuasi liar antar-eksekusi karena Anda berbagi mesin dengan pengguna lain.
Aturannya: runner CI untuk smoke test saja. Load test sungguhan harus dijalankan dari mesin khusus (self-hosted runner, VM cloud) atau layanan terdistribusi.
Menjaga Pipeline Tidak Flaky
- Sematkan versi k6.
grafana/k6:1.0.0, bukan:latest. - Gunakan lingkungan yang stabil. Staging yang dipakai bersamaan dengan tim QA manual akan memberi hasil acak.
- Beri toleransi pada threshold CI. p95 di CI boleh lebih longgar daripada SLO produksi, karena infrastruktur staging biasanya lebih kecil.
- Jalankan warm-up. Beberapa detik pertama selalu lebih lambat (cold start, cache dingin). Gunakan ramp-up, bukan beban mendadak.
- Batasi waktu.
timeout-minutesagar job yang tergantung tidak menyandera pipeline berjam-jam.