forked from niki-timofe/verdaccio
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
build: collect metrics running some benchmarks (verdaccio#2272)
- Loading branch information
1 parent
8682af5
commit 3d1d507
Showing
18 changed files
with
698 additions
and
80 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
--- | ||
name: ci - benchmark | ||
|
||
on: | ||
schedule: | ||
# 3 times day | ||
# collecting enough data to draw some graphics | ||
- cron: '0 0/8 * * *' | ||
# push: | ||
# branches: | ||
# - master | ||
jobs: | ||
prepare: | ||
name: Prepare build | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v2 | ||
- uses: actions/setup-node@v2 | ||
with: | ||
node-version: 14.x | ||
- name: install pnpm | ||
run: sudo npm i [email protected] -g | ||
- name: set store | ||
run: | | ||
mkdir ~/.pnpm-store | ||
pnpm config set store-dir ~/.pnpm-store | ||
- name: setup pnpm config registry | ||
run: pnpm config set registry https://registry.verdaccio.org | ||
- name: install dependencies | ||
run: pnpm install | ||
- name: Cache .pnpm-store | ||
uses: actions/cache@v2 | ||
with: | ||
path: ~/.pnpm-store | ||
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} | ||
restore-keys: | | ||
pnpm- | ||
- name: build | ||
run: pnpm build | ||
- name: tar packages | ||
run: | | ||
tar -czvf ${{ github.workspace }}/pkg.tar.gz -C ${{ github.workspace }}/packages . | ||
- uses: actions/upload-artifact@v2 | ||
with: | ||
name: verdaccio-artifact | ||
path: pkg.tar.gz | ||
benchmark-autocannon: | ||
needs: prepare | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
benchmark: | ||
- info | ||
- tarball | ||
verdaccioVersion: | ||
# - local | ||
- 3.13.1 | ||
- 4.12.1 | ||
- 5.1.0 | ||
name: Benchmark autocannon | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v2 | ||
- uses: actions/setup-node@v2 | ||
with: | ||
node-version: 14.x | ||
- uses: actions/download-artifact@v2 | ||
with: | ||
name: verdaccio-artifact | ||
- name: untar packages | ||
run: tar -xzvf pkg.tar.gz -C ${{ github.workspace }}/packages | ||
- name: install pnpm | ||
# require fixed version | ||
run: sudo npm i [email protected] -g | ||
- uses: actions/cache@v2 | ||
with: | ||
path: ~/.pnpm-store | ||
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} | ||
- name: install dependencies | ||
run: pnpm install | ||
- name: start registry | ||
run: ./scripts/benchmark-prepare.sh ${{matrix.verdaccioVersion}} | ||
- name: benchmark | ||
run: pnpm benchmark:api -- -v ${{matrix.verdaccioVersion}} -f ${{matrix.benchmark}} | ||
shell: bash | ||
env: | ||
DEBUG: metrics* | ||
- uses: actions/upload-artifact@v2 | ||
with: | ||
name: verdaccio-metrics | ||
path: ./api-results-${{matrix.verdaccioVersion}}-${{matrix.benchmark}}.json | ||
if-no-files-found: error | ||
retention-days: 10 | ||
- name: submit metrics | ||
run: pnpm benchmarka:submit | ||
env: | ||
DEBUG: metrics | ||
METRICS_SOURCE: autocannon | ||
METRICS_URL: ${{ secrets.METRICS_URL }} | ||
METRICS_TOKEN: ${{ secrets.METRICS_TOKEN }} | ||
METRICS_BENCHMARK: ${{matrix.benchmark}} | ||
METRICS_VERSION: ${{matrix.verdaccioVersion}} | ||
METRICS_COMMIT_HASH: ${{ github.sha }} | ||
METRICS_FILE_NAME: 'api-results' | ||
benchmark: | ||
needs: prepare | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
benchmark: | ||
- info | ||
- tarball | ||
verdaccioVersion: | ||
# future 6.x (wip) | ||
# - local (master branch) | ||
# old versions to compare same test along previous releases | ||
- 3.13.1 | ||
- 4.12.1 | ||
- 5.1.0 | ||
name: Benchmark hyperfine | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v2 | ||
- uses: actions/setup-node@v2 | ||
with: | ||
node-version: 14.x | ||
- uses: actions/download-artifact@v2 | ||
with: | ||
name: verdaccio-artifact | ||
- name: untar packages | ||
run: tar -xzvf pkg.tar.gz -C ${{ github.workspace }}/packages | ||
- name: install pnpm | ||
# require fixed version | ||
run: sudo npm i [email protected] -g | ||
- uses: actions/cache@v2 | ||
with: | ||
path: ~/.pnpm-store | ||
key: pnpm-${{ hashFiles('pnpm-lock.yaml') }} | ||
- name: install dependencies | ||
run: pnpm install | ||
- name: install hyperfine | ||
run: | | ||
wget https://github.com/sharkdp/hyperfine/releases/download/v1.11.0/hyperfine_1.11.0_amd64.deb | ||
sudo dpkg -i hyperfine_1.11.0_amd64.deb | ||
- name: start registry | ||
run: ./scripts/benchmark-prepare.sh ${{matrix.verdaccioVersion}} | ||
- name: benchmark | ||
run: ./scripts/benchmark-run.sh ${{matrix.benchmark}} | ||
# https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#using-a-specific-shell | ||
shell: bash | ||
- name: rename | ||
run: mv ./hyper-results.json ./hyper-results-${{matrix.verdaccioVersion}}-${{matrix.benchmark}}.json | ||
- uses: actions/upload-artifact@v2 | ||
with: | ||
name: verdaccio-metrics | ||
path: ./hyper-results-${{matrix.verdaccioVersion}}-${{matrix.benchmark}}.json | ||
if-no-files-found: error | ||
retention-days: 10 | ||
- name: submit metrics | ||
run: pnpm benchmarka:submit | ||
env: | ||
DEBUG: metrics | ||
METRICS_SOURCE: hyperfine | ||
METRICS_URL: ${{ secrets.METRICS_URL }} | ||
METRICS_TOKEN: ${{ secrets.METRICS_TOKEN }} | ||
METRICS_BENCHMARK: ${{matrix.benchmark}} | ||
METRICS_VERSION: ${{matrix.verdaccioVersion}} | ||
METRICS_COMMIT_HASH: ${{ github.sha }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"extends": "../../../.babelrc" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
require('./build/index.js'); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
{ | ||
"name": "@verdaccio/benchmark", | ||
"version": "1.0.0", | ||
"bin": { | ||
"verdaccio-benchmark": "./index.js" | ||
}, | ||
"private": "true", | ||
"description": "benchmark", | ||
"main": "./build/index.js", | ||
"scripts": { | ||
"build": "babel src/ --out-dir build/ --copy-files --extensions \".ts,.tsx\" --source-maps", | ||
"run": "ts-node src/init.ts" | ||
}, | ||
"keywords": [], | ||
"author": "Juan Picado <[email protected]>", | ||
"license": "MIT", | ||
"dependencies": { | ||
"clipanion": "3.0.0-rc.12", | ||
"temp-dir": "2.0.0", | ||
"get-port": "5.1.1", | ||
"semver": "7.3.5" | ||
}, | ||
"devDependencies": { | ||
"autocannon": "7.3.0", | ||
"node-fetch": "2.6.1", | ||
"ts-node": "10.0.0" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
/* eslint-disable no-console */ | ||
import { Command, Option } from 'clipanion'; | ||
import runApi from './run'; | ||
|
||
export class ApiCommand extends Command { | ||
public static paths = [['api']]; | ||
|
||
private benchmark = Option.String('-f', { | ||
description: 'benchmark to run', | ||
required: true, | ||
}); | ||
|
||
private version = Option.String('-v', { | ||
description: 'version is running', | ||
required: true, | ||
}); | ||
|
||
public async execute() { | ||
try { | ||
await runApi(this.benchmark, this.version); | ||
} catch (err) { | ||
console.error(err); | ||
process.exit(1); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
import { writeFileSync } from 'fs'; | ||
|
||
const path = require('path'); | ||
const debug = require('debug')('metrics:autocannon'); | ||
const autocannon = require('autocannon'); | ||
|
||
function getURL(benchmark) { | ||
switch (benchmark) { | ||
case 'info': | ||
return 'http://localhost:4873/jquery'; | ||
case 'tarball': | ||
return 'http://localhost:4873/jquery/-/jquery-3.6.0.tgz'; | ||
default: | ||
throw new TypeError('no benckmark supported'); | ||
} | ||
} | ||
|
||
export default async function run(benchmark, version) { | ||
try { | ||
debug('api report start'); | ||
debug('url', getURL(benchmark)); | ||
const result = await autocannon({ | ||
url: getURL(benchmark), | ||
connections: 10, | ||
pipelining: 1, | ||
duration: 10, | ||
}); | ||
const wrapResults = { | ||
results: [result], | ||
}; | ||
const reportPath = path.join(process.cwd(), `./api-results-${version}-${benchmark}.json`); | ||
debug('report path %o', reportPath); | ||
writeFileSync(reportPath, JSON.stringify(wrapResults, null, 2), 'utf-8'); | ||
debug('report ends'); | ||
} catch (err) { | ||
// eslint-disable-next-line no-console | ||
console.error(`error on process autocannon run`, err); | ||
process.exit(1); | ||
} | ||
} |
Oops, something went wrong.