💩
GitHub Actionsでk6を動かす
モチベーション
インターネット上で開発者がカジュアルに実行できる環境が欲しかったので、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の画面からボタンひとつで実行できるようになります!
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で編集を提案
Discussion