mirror of
https://github.com/Mozilla-Actions/sccache-action.git
synced 2026-04-17 19:14:05 +08:00
Compare commits
99 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
89e9040de8 | ||
|
|
e87392bdf6 | ||
|
|
b4427f4656 | ||
|
|
e759f84286 | ||
|
|
b12911431e | ||
|
|
fb41e19ae3 | ||
|
|
83e296b04b | ||
|
|
511fd3c7f0 | ||
|
|
d4fcccfce3 | ||
|
|
aece89f750 | ||
|
|
0c4d1a08d8 | ||
|
|
103918ffd4 | ||
|
|
aa6abb83bc | ||
|
|
ab76965574 | ||
|
|
2f1ba39e7a | ||
|
|
d947000745 | ||
|
|
f2edb47f42 | ||
|
|
1e8091c415 | ||
|
|
9c0df0382a | ||
|
|
8ebd5a4380 | ||
|
|
7d0144b782 | ||
|
|
8272dac7aa | ||
|
|
e1a9194714 | ||
|
|
27a476c863 | ||
|
|
b3f939aca5 | ||
|
|
6c6e91ca40 | ||
|
|
5320dad1f6 | ||
|
|
9bdd511a9c | ||
|
|
5b7824cab2 | ||
|
|
aff01f2a9b | ||
|
|
fb137f92c9 | ||
|
|
2e7f9ec792 | ||
|
|
23439b739d | ||
|
|
fce2fb6943 | ||
|
|
323784ef1b | ||
|
|
d86fe94d33 | ||
|
|
b4fe875dd5 | ||
|
|
21a0d0809e | ||
|
|
0d25c1a7c7 | ||
|
|
1e15924c00 | ||
|
|
88c8fa114c | ||
|
|
c18c46d0d7 | ||
|
|
c255d852d7 | ||
|
|
44305b1b8e | ||
|
|
d669e98c70 | ||
|
|
7c319969e2 | ||
|
|
01a89c6f36 | ||
|
|
1d3904e27f | ||
|
|
42989ab5d5 | ||
|
|
f068537b11 | ||
|
|
ea0443cf17 | ||
|
|
da260886a4 | ||
|
|
adaee86b7e | ||
|
|
7fc1598ba7 | ||
|
|
774b16e376 | ||
|
|
cd82d33c7f | ||
|
|
60dbcfaf03 | ||
|
|
0dad365f18 | ||
|
|
3ffa7f2739 | ||
|
|
33b4920ca9 | ||
|
|
fd38c5b044 | ||
|
|
371ee17811 | ||
|
|
ff569e9dad | ||
|
|
2060212363 | ||
|
|
5007f9947f | ||
|
|
d75bd29020 | ||
|
|
7c09cf84df | ||
|
|
3259508554 | ||
|
|
c2e2e5c8e4 | ||
|
|
02967188df | ||
|
|
aefdada430 | ||
|
|
9a68c4d04b | ||
|
|
77c1aa945b | ||
|
|
87b953d7aa | ||
|
|
295ac10273 | ||
|
|
4ad3be85ad | ||
|
|
13cf7b2ba9 | ||
|
|
8417cffc2e | ||
|
|
cc6b259f50 | ||
|
|
548630134d | ||
|
|
634be340e7 | ||
|
|
5e615649da | ||
|
|
36cc091a25 | ||
|
|
af5524e1c3 | ||
|
|
d6e55aff39 | ||
|
|
27ad55f054 | ||
|
|
019ccc051d | ||
|
|
e51482ff63 | ||
|
|
419f3acf2e | ||
|
|
c3f47d0aa9 | ||
|
|
232a105d2d | ||
|
|
8c0ea93975 | ||
|
|
e042060788 | ||
|
|
7b7cc03629 | ||
|
|
5eedbfb0f0 | ||
|
|
dd95d78c93 | ||
|
|
78aedbbd3e | ||
|
|
56233b6236 | ||
|
|
4c556aab0a |
25
.github/workflows/CI.yml
vendored
25
.github/workflows/CI.yml
vendored
@@ -21,11 +21,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
- name: Setup Node.js 16.x
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 16.x
|
node-version: 18.x
|
||||||
cache: npm
|
cache: npm
|
||||||
|
|
||||||
- name: npm install
|
- name: npm install
|
||||||
@@ -37,8 +37,8 @@ jobs:
|
|||||||
- name: Build & Test
|
- name: Build & Test
|
||||||
run: npm run test
|
run: npm run test
|
||||||
|
|
||||||
test_v0_3_3:
|
test:
|
||||||
name: Test version 0.3.3
|
name: Test version
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
@@ -46,15 +46,18 @@ jobs:
|
|||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
- windows-latest
|
- windows-latest
|
||||||
- macos-latest
|
- macos-latest
|
||||||
|
version:
|
||||||
|
- ""
|
||||||
|
- v0.4.0
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set Node.js 16.x
|
- name: Set Node.js
|
||||||
uses: actions/setup-node@v3
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 16.x
|
node-version: 18.x
|
||||||
cache: npm
|
cache: npm
|
||||||
|
|
||||||
- name: npm install
|
- name: npm install
|
||||||
@@ -63,7 +66,7 @@ jobs:
|
|||||||
- name: Run sccache-cache
|
- name: Run sccache-cache
|
||||||
uses: ./
|
uses: ./
|
||||||
with:
|
with:
|
||||||
version: "v0.3.3"
|
version: ${{ matrix.version }}
|
||||||
|
|
||||||
- name: Run sccache for check
|
- name: Run sccache for check
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
80
README.md
80
README.md
@@ -3,22 +3,96 @@
|
|||||||
The [sccache](https://github.com/mozilla/sccache/
|
The [sccache](https://github.com/mozilla/sccache/
|
||||||
) action can be used in GitHub Actions workflows to integrate sccache into the build process. The sccache action is a step in a workflow that can be used to cache compilation results for subsequent builds, reducing the build time and speeding up the overall development process.
|
) action can be used in GitHub Actions workflows to integrate sccache into the build process. The sccache action is a step in a workflow that can be used to cache compilation results for subsequent builds, reducing the build time and speeding up the overall development process.
|
||||||
|
|
||||||
|
sccache can easily use GitHub actions cache with almost no configuration.
|
||||||
|
|
||||||
|
This action is available on:
|
||||||
|
https://github.com/marketplace/actions/sccache-action
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
Just copy and paste the following in your GitHub action:
|
Just copy and paste the following in your GitHub action:
|
||||||
|
|
||||||
|
### Use the latest version of sccache if no version is specified
|
||||||
|
|
||||||
```
|
```
|
||||||
- name: Run sccache-cache
|
- name: Run sccache-cache
|
||||||
uses: mozilla/sccache-action@v0.0.1
|
uses: mozilla-actions/sccache-action@v0.0.3
|
||||||
with:
|
```
|
||||||
version: "v0.3.3"
|
|
||||||
|
|
||||||
|
### Conditionally run cache and enable it
|
||||||
|
|
||||||
|
```
|
||||||
|
- name: Run sccache-cache only on non-release runs
|
||||||
|
if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
|
||||||
|
uses: mozilla-actions/sccache-action@v0.0.3
|
||||||
|
- name: Set Rust caching env vars only on non-release runs
|
||||||
|
if: github.event_name != 'release' && github.event_name != 'workflow_dispatch'
|
||||||
|
run: |
|
||||||
|
echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV
|
||||||
|
echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
|
||||||
|
```
|
||||||
|
|
||||||
|
### Specify a given version of sccache
|
||||||
|
|
||||||
|
```
|
||||||
|
- name: Run sccache-cache
|
||||||
|
uses: mozilla-actions/sccache-action@v0.0.3
|
||||||
|
with:
|
||||||
|
version: "v0.7.4"
|
||||||
|
```
|
||||||
|
|
||||||
|
### To get the execution stats
|
||||||
|
|
||||||
|
Note that using the previous declaration will automatically create a
|
||||||
|
`Post Run sccache-cache` task.
|
||||||
|
|
||||||
|
```
|
||||||
- name: Run sccache stat for check
|
- name: Run sccache stat for check
|
||||||
shell: bash
|
shell: bash
|
||||||
run: ${SCCACHE_PATH} --show-stats
|
run: ${SCCACHE_PATH} --show-stats
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Rust code
|
||||||
|
|
||||||
|
For Rust code, the following environment variables should be set:
|
||||||
|
|
||||||
|
```
|
||||||
|
env:
|
||||||
|
SCCACHE_GHA_ENABLED: "true"
|
||||||
|
RUSTC_WRAPPER: "sccache"
|
||||||
|
```
|
||||||
|
|
||||||
|
### C/C++ code
|
||||||
|
|
||||||
|
For C/C++ code, the following environment variables should be set:
|
||||||
|
|
||||||
|
```
|
||||||
|
env:
|
||||||
|
SCCACHE_GHA_ENABLED: "true"
|
||||||
|
```
|
||||||
|
|
||||||
|
With cmake, add the following argument:
|
||||||
|
|
||||||
|
```
|
||||||
|
-DCMAKE_C_COMPILER_LAUNCHER=sccache
|
||||||
|
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache
|
||||||
|
```
|
||||||
|
|
||||||
|
With configure, call it with:
|
||||||
|
```
|
||||||
|
# With gcc
|
||||||
|
./configure CC="sccache gcc" CXX="sccache gcc"
|
||||||
|
# With clang
|
||||||
|
./configure CC="sccache clang" CXX="sccache clang"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prepare a new release
|
||||||
|
|
||||||
|
1. Update the example in README.md
|
||||||
|
1. Update version in `package.json`
|
||||||
|
1. Run `npm i --package-lock-only`
|
||||||
|
1. Tag a new release
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Apache-2.0 (just like sccache)
|
Apache-2.0 (just like sccache)
|
||||||
|
|||||||
@@ -4,10 +4,12 @@ description: "Setup sccache action"
|
|||||||
author: "mozilla"
|
author: "mozilla"
|
||||||
inputs:
|
inputs:
|
||||||
version:
|
version:
|
||||||
description: "The installed sccache version."
|
description: "The installed sccache version. Use the latest version of sccache if not specified."
|
||||||
required: true
|
token:
|
||||||
|
description: "Used to pull the latest release from sccache. When running this action outside of github.com, you have to pass a personal access token for github.com."
|
||||||
|
default: ${{ github.server_url == 'https://github.com' && github.token || '' }}
|
||||||
runs:
|
runs:
|
||||||
using: "node16"
|
using: "node20"
|
||||||
main: "dist/setup/index.js"
|
main: "dist/setup/index.js"
|
||||||
post: "dist/show_stats/index.js"
|
post: "dist/show_stats/index.js"
|
||||||
branding:
|
branding:
|
||||||
|
|||||||
4
dist/setup/index.js
vendored
4
dist/setup/index.js
vendored
File diff suppressed because one or more lines are too long
4
dist/show_stats/index.js
vendored
4
dist/show_stats/index.js
vendored
File diff suppressed because one or more lines are too long
12723
package-lock.json
generated
12723
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
44
package.json
44
package.json
@@ -1,8 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "sccache-action",
|
"name": "sccache-action",
|
||||||
"version": "0.0.1",
|
"version": "0.0.5",
|
||||||
"description": "Github Action for Sccache",
|
"description": "Github Action for Sccache",
|
||||||
"main": "dist/setup/index.js",
|
"main": "dist/setup/index.js",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=16"
|
||||||
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build-dist": "ncc build lib/setup.js -m -o dist/setup/ && ncc build lib/show_stats.js -m -o dist/show_stats",
|
"build-dist": "ncc build lib/setup.js -m -o dist/setup/ && ncc build lib/show_stats.js -m -o dist/show_stats",
|
||||||
"build": "prettier --write **/*.ts && tsc && npm run build-dist",
|
"build": "prettier --write **/*.ts && tsc && npm run build-dist",
|
||||||
@@ -13,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/mozilla/sccache-action.git"
|
"url": "git+https://github.com/mozilla-actions/sccache-action.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"sccache"
|
"sccache"
|
||||||
@@ -21,28 +24,29 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/mozilla/sccache-action/issues"
|
"url": "https://github.com/mozilla-actions/sccache-action/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/mozilla/sccache-action#readme",
|
"homepage": "https://github.com/mozilla-actions/sccache-action#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.0",
|
"@actions/core": "^1.10.1",
|
||||||
"@actions/io": "^1.1.2",
|
"@actions/github": "^6.0.0",
|
||||||
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.1"
|
"@actions/tool-cache": "^2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/jest": "^27.4.1",
|
"@types/jest": "^29.5.12",
|
||||||
"@types/node": "^18.14.6",
|
"@types/node": "^20.13.0",
|
||||||
"@vercel/ncc": "^0.36.1",
|
"@typescript-eslint/eslint-plugin": "^7.8.0",
|
||||||
"jest": "^27.5.1",
|
"@typescript-eslint/parser": "^7.11.0",
|
||||||
"jest-circus": "^29.5.0",
|
"@vercel/ncc": "^0.38.1",
|
||||||
"prettier": "^2.8.4",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
"ts-jest": "^27.1.4",
|
"eslint-plugin-import": "^2.29.1",
|
||||||
"typescript": "^4.9.5",
|
"eslint-plugin-jest": "^28.5.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.54.1",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"@typescript-eslint/parser": "^5.54.1",
|
"jest": "^29.7.0",
|
||||||
"eslint-config-prettier": "^8.7.0",
|
"jest-circus": "^29.7.0",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"prettier": "^3.3.2",
|
||||||
"eslint-plugin-jest": "^27.2.1",
|
"ts-jest": "^29.1.4",
|
||||||
"eslint-plugin-prettier": "^4.2.1"
|
"typescript": "^5.4.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
43
src/setup.ts
43
src/setup.ts
@@ -19,21 +19,54 @@ import {
|
|||||||
extractZip,
|
extractZip,
|
||||||
cacheDir
|
cacheDir
|
||||||
} from '@actions/tool-cache';
|
} from '@actions/tool-cache';
|
||||||
|
import {getOctokit} from '@actions/github';
|
||||||
|
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
|
import * as crypto from 'crypto';
|
||||||
|
|
||||||
async function setup() {
|
async function setup() {
|
||||||
// TODO: we can support install latest version by default if version
|
let version = core.getInput('version');
|
||||||
// is not input.
|
if (version.length === 0) {
|
||||||
const version = core.getInput('version');
|
// If no version is specified, the latest version is used by default.
|
||||||
core.info(`try to setup sccache version: ${version}'`);
|
const token = core.getInput('token', {required: true});
|
||||||
|
const octokit = getOctokit(token);
|
||||||
|
const release = await octokit.rest.repos.getLatestRelease({
|
||||||
|
owner: 'mozilla',
|
||||||
|
repo: 'sccache'
|
||||||
|
});
|
||||||
|
version = release.data.tag_name;
|
||||||
|
}
|
||||||
|
core.info(`try to setup sccache version: ${version}`);
|
||||||
|
|
||||||
const filename = getFilename(version);
|
const filename = getFilename(version);
|
||||||
const dirname = getDirname(version);
|
const dirname = getDirname(version);
|
||||||
|
|
||||||
const downloadUrl = `https://github.com/mozilla/sccache/releases/download/${version}/${filename}`;
|
const downloadUrl = `https://github.com/mozilla/sccache/releases/download/${version}/${filename}`;
|
||||||
|
const sha256Url = `${downloadUrl}.sha256`;
|
||||||
core.info(`sccache download from url: ${downloadUrl}`);
|
core.info(`sccache download from url: ${downloadUrl}`);
|
||||||
|
|
||||||
// Download and extract.
|
// Download and extract.
|
||||||
const sccachePackage = await downloadTool(downloadUrl);
|
const sccachePackage = await downloadTool(downloadUrl);
|
||||||
|
const sha256File = await downloadTool(sha256Url);
|
||||||
|
|
||||||
|
// Calculate the SHA256 checksum of the downloaded file.
|
||||||
|
const fileBuffer = await fs.promises.readFile(sccachePackage);
|
||||||
|
const hash = crypto.createHash('sha256');
|
||||||
|
hash.update(fileBuffer);
|
||||||
|
const calculatedChecksum = hash.digest('hex');
|
||||||
|
|
||||||
|
// Read the provided checksum from the .sha256 file.
|
||||||
|
const providedChecksum = (await fs.promises.readFile(sha256File))
|
||||||
|
.toString()
|
||||||
|
.trim();
|
||||||
|
|
||||||
|
// Compare the checksums.
|
||||||
|
if (calculatedChecksum !== providedChecksum) {
|
||||||
|
core.setFailed('Checksum verification failed');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
core.info(`Correct checksum: ${calculatedChecksum}`);
|
||||||
|
|
||||||
let sccachePath;
|
let sccachePath;
|
||||||
if (getExtension() == 'zip') {
|
if (getExtension() == 'zip') {
|
||||||
@@ -56,7 +89,7 @@ async function setup() {
|
|||||||
// Expose the sccache path as env.
|
// Expose the sccache path as env.
|
||||||
core.exportVariable('SCCACHE_PATH', `${sccacheHome}/sccache`);
|
core.exportVariable('SCCACHE_PATH', `${sccacheHome}/sccache`);
|
||||||
|
|
||||||
// Expose the gha cache related variable to make users easier to
|
// Expose the gha cache related variable to make it easier for users to
|
||||||
// integrate with gha support.
|
// integrate with gha support.
|
||||||
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
|
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
|
||||||
core.exportVariable(
|
core.exportVariable(
|
||||||
|
|||||||
@@ -14,24 +14,150 @@
|
|||||||
|
|
||||||
import * as core from '@actions/core';
|
import * as core from '@actions/core';
|
||||||
import * as exec from '@actions/exec';
|
import * as exec from '@actions/exec';
|
||||||
|
import {SummaryTableRow} from '@actions/core/lib/summary';
|
||||||
|
|
||||||
|
async function get_output(command: string, args: string[]): Promise<string> {
|
||||||
|
core.debug(`get_output: ${command} ${args.join(' ')}`);
|
||||||
|
|
||||||
|
const output = await exec.getExecOutput(command, args);
|
||||||
|
// --stats-format=json does not emit a newline, which messes up group
|
||||||
|
// processing. Here we add a newline if it's missing.
|
||||||
|
if (!output.stdout.endsWith('\n')) {
|
||||||
|
process.stdout.write('\n');
|
||||||
|
}
|
||||||
|
return output.stdout.toString();
|
||||||
|
}
|
||||||
|
|
||||||
async function show_stats() {
|
async function show_stats() {
|
||||||
core.debug('start sccache show starts');
|
core.debug('start sccache show starts');
|
||||||
|
const human_stats = await core.group('Get human-readable stats', async () => {
|
||||||
const defaultListener = {
|
return get_output(`${process.env.SCCACHE_PATH}`, ['--show-stats']);
|
||||||
stdout: (data: Buffer) => {
|
|
||||||
stdout.push(data.toString());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const stdout: string[] = [];
|
|
||||||
|
|
||||||
await exec.getExecOutput(`${process.env.SCCACHE_PATH}`, ['--show-stats'], {
|
|
||||||
listeners: defaultListener
|
|
||||||
});
|
});
|
||||||
|
const json_stats = await core.group('Get JSON stats', async () => {
|
||||||
|
return get_output(`${process.env.SCCACHE_PATH}`, [
|
||||||
|
'--show-stats',
|
||||||
|
'--stats-format=json'
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
|
const stats: Stats = JSON.parse(json_stats);
|
||||||
|
const formatted_stats = format_json_stats(stats);
|
||||||
|
|
||||||
|
core.notice(formatted_stats.notice, {
|
||||||
|
title: 'sccache stats'
|
||||||
|
});
|
||||||
|
core.info('\nFull human-readable stats:');
|
||||||
|
core.info(human_stats);
|
||||||
|
|
||||||
|
core.summary.addHeading('sccache stats', 2);
|
||||||
|
core.summary.addTable(formatted_stats.table);
|
||||||
|
core.summary.addDetails(
|
||||||
|
'Full human-readable stats',
|
||||||
|
'\n\n```\n' + human_stats + '\n```\n\n'
|
||||||
|
);
|
||||||
|
core.summary.addDetails(
|
||||||
|
'Full JSON Stats',
|
||||||
|
'\n\n```json\n' + JSON.stringify(stats, null, 2) + '\n```\n\n'
|
||||||
|
);
|
||||||
|
|
||||||
|
await core.summary.write();
|
||||||
}
|
}
|
||||||
|
|
||||||
show_stats().catch(err => {
|
show_stats().catch(err => {
|
||||||
core.error(err);
|
core.error(err);
|
||||||
core.setFailed(err.message);
|
core.setFailed(err.message);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
interface Duration {
|
||||||
|
secs: number;
|
||||||
|
nanos: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Counter {
|
||||||
|
counts: {
|
||||||
|
[key: string]: number;
|
||||||
|
};
|
||||||
|
adv_counts: {
|
||||||
|
[key: string]: number;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Stats {
|
||||||
|
stats: {
|
||||||
|
compile_requests: number;
|
||||||
|
requests_executed: number;
|
||||||
|
|
||||||
|
cache_errors: Counter;
|
||||||
|
cache_hits: Counter;
|
||||||
|
cache_misses: Counter;
|
||||||
|
|
||||||
|
cache_write_errors: number;
|
||||||
|
cache_writes: number;
|
||||||
|
|
||||||
|
cache_write_duration: Duration;
|
||||||
|
cache_read_hit_duration: Duration;
|
||||||
|
compiler_write_duration: Duration;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function sum_stats(stats: Counter): number {
|
||||||
|
return Object.values(stats.counts).reduce((acc, val) => acc + val, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function format_duration(duration: Duration): string {
|
||||||
|
const ms = duration.nanos / 1e6;
|
||||||
|
return `${duration.secs}s ${ms}ms`;
|
||||||
|
}
|
||||||
|
|
||||||
|
function format_json_stats(stats: Stats): {
|
||||||
|
table: SummaryTableRow[];
|
||||||
|
notice: string;
|
||||||
|
} {
|
||||||
|
const cache_error_count = sum_stats(stats.stats.cache_errors);
|
||||||
|
const cache_hit_count = sum_stats(stats.stats.cache_hits);
|
||||||
|
const cache_miss_count = sum_stats(stats.stats.cache_misses);
|
||||||
|
const total_hits = cache_hit_count + cache_miss_count + cache_error_count;
|
||||||
|
const ratio = percentage(cache_hit_count, total_hits);
|
||||||
|
|
||||||
|
const write_duration = format_duration(stats.stats.cache_write_duration);
|
||||||
|
const read_duration = format_duration(stats.stats.cache_read_hit_duration);
|
||||||
|
const compiler_duration = format_duration(
|
||||||
|
stats.stats.compiler_write_duration
|
||||||
|
);
|
||||||
|
|
||||||
|
const notice = `${ratio}% - ${cache_hit_count} hits, ${cache_miss_count} misses, ${cache_error_count} errors`;
|
||||||
|
|
||||||
|
const table = [
|
||||||
|
[{data: 'Cache hit %', header: true}, {data: `${ratio}%`}],
|
||||||
|
[{data: 'Cache hits', header: true}, {data: cache_hit_count.toString()}],
|
||||||
|
[{data: 'Cache misses', header: true}, {data: cache_miss_count.toString()}],
|
||||||
|
[
|
||||||
|
{data: 'Cache errors', header: true},
|
||||||
|
{data: cache_error_count.toString()}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{data: 'Compile requests', header: true},
|
||||||
|
{data: stats.stats.compile_requests.toString()}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{data: 'Requests executed', header: true},
|
||||||
|
{data: stats.stats.requests_executed.toString()}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{data: 'Cache writes', header: true},
|
||||||
|
{data: stats.stats.cache_writes.toString()}
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{data: 'Cache write errors', header: true},
|
||||||
|
{data: stats.stats.cache_write_errors.toString()}
|
||||||
|
],
|
||||||
|
[{data: 'Cache write duration', header: true}, {data: write_duration}],
|
||||||
|
[{data: 'Cache read hit duration', header: true}, {data: read_duration}],
|
||||||
|
[{data: 'Compiler write duration', header: true}, {data: compiler_duration}]
|
||||||
|
];
|
||||||
|
return {table, notice};
|
||||||
|
}
|
||||||
|
|
||||||
|
function percentage(x: number, y: number): number {
|
||||||
|
return Math.round((x / y) * 100 || 0);
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user