Kodeloka
  1. Kodeloka
  2. Kelas k6
  3. Materi

Modul 13 · Modul 13 dari 15

k6 di CI/CD: Quality Gate Otomatis

Memasang k6 di pipeline sebagai gerbang mutu, memilih tes mana yang jalan kapan, dan mencegah pipeline jadi lambat atau flaky.

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:

KapanJenis tesDurasiTujuan
Setiap commit / PRSmoke test< 1 menitSkrip masih valid, tak ada error dasar
Merge ke mainLoad test ringan5–10 menitDeteksi regresi performa
Nightly (terjadwal)Load + stress penuh30–60 menitValidasi kapasitas menyeluruh
Sebelum rilis besarSoak + spike2–8 jamKesiapan produksi
Manual / on-demandBreakpointSampai jebolPerencanaan 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-minutes agar job yang tergantung tidak menyandera pipeline berjam-jam.