💩

GitHub Actionsでk6を動かす

2023/07/26に公開

モチベーション

インターネット上で開発者がカジュアルに実行できる環境が欲しかったので、GitHub Actionsを使ってみました!

k6用のEC2立てたりECSのtask作ったりLambda作ったりも検討しましたが、選ばれたのはyaml書くだけのActionsでした🍵
(今回はインターネットからパブリックにアクセスできるサーバーに負荷を送るためVPCの中で実行したいなどの制限もありませんでした)

k6はjsでシナリオ書けるので愛用してます😘

実装

Actionsのファイル

k6-basic-loadtest.yaml
name: K6 Basic LoadTest
on:
  # 手動実行
  workflow_dispatch:

jobs:
  build:
    name: Run k6 test
    runs-on: ubuntu-latest
    timeout-minutes: 300
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Run k6
        # 公式が公開してるActionsのパッケージ
        # https://github.com/grafana/k6-action
        uses: grafana/k6-action@v0.3.0
        with:
          # 下記参照
          filename: k6/workload.js
        env:
          # 最近秘匿じゃない変数をvarsで参照できるようになった
          # https://docs.github.com/ja/actions/learn-github-actions/variables#using-the-vars-context-to-access-configuration-variable-values
          SOME_VAR: ${{ vars.SOME_VAR }}
          SOME_SECRET: ${{ secrets.SOME_SECRET }}

これだけ、ポイントは on: workflow_dispatch: です!
これするとこんな感じでActionsの画面からボタンひとつで実行できるようになります!

Image from Gyazo

k6のシナリオファイルです
jsでかけるのが最高

k6/workload.js

import { check, sleep } from "k6";

import http from 'k6/http';

export const options = {
  stages: [
    { duration: '10m', target: 100 },
    { duration: '20m', target: 1000 },
    { duration: '80m', target: 10000 },
  ],
};

const query = `
query TopPage {
  feedPage(first: 1) {
    edges {
      cursor
      node {
        id
        name
        picture
      }
    }
  }
}
`;

const headers = {
  'Content-Type': 'application/json',
  'Authorization': `Bearer ${__ENV.SOME_SECRET}`
};

export function setup() {
  if (__ENV.SOME_SECRET === undefined) {
    throw new Error('TOKEN is undefined')
  }
}

export default function () {
  const res = http.post(
    "https://my-owesome-api.com/graphql",
    JSON.stringify({ query }),
    { headers },
  );

  check(res, {
    'no errors': (r) => r.status === 200,
  })
  sleep(3)
}

同時接続10000人想定の雑なシナリオ

今後

実行結果をどっかに出力して確認するとかやっていきたい

GitHubで編集を提案
ispec

Discussion