mirror of
https://github.com/Mozilla-Actions/sccache-action.git
synced 2026-04-09 17:51:47 +08:00
Compare commits
31 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 |
16
.github/workflows/CI.yml
vendored
16
.github/workflows/CI.yml
vendored
@@ -21,11 +21,11 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
- name: Setup Node.js 16.x
|
||||
uses: actions/setup-node@v3
|
||||
uses: actions/checkout@v4
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16.x
|
||||
node-version: 18.x
|
||||
cache: npm
|
||||
|
||||
- name: npm install
|
||||
@@ -52,12 +52,12 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set Node.js 16.x
|
||||
uses: actions/setup-node@v3
|
||||
- name: Set Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16.x
|
||||
node-version: 18.x
|
||||
cache: npm
|
||||
|
||||
- name: npm install
|
||||
|
||||
@@ -81,9 +81,9 @@ With cmake, add the following argument:
|
||||
With configure, call it with:
|
||||
```
|
||||
# With gcc
|
||||
./configure CC="sccache gcc" CXX=sccache gcc"
|
||||
./configure CC="sccache gcc" CXX="sccache gcc"
|
||||
# With clang
|
||||
./configure CC="sccache clang" CXX=sccache clang"
|
||||
./configure CC="sccache clang" CXX="sccache clang"
|
||||
```
|
||||
|
||||
## Prepare a new release
|
||||
|
||||
10
dist/setup/index.js
vendored
10
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
13010
package-lock.json
generated
13010
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
31
package.json
31
package.json
@@ -1,8 +1,11 @@
|
||||
{
|
||||
"name": "sccache-action",
|
||||
"version": "0.0.3",
|
||||
"version": "0.0.5",
|
||||
"description": "Github Action for Sccache",
|
||||
"main": "dist/setup/index.js",
|
||||
"engines": {
|
||||
"node": ">=16"
|
||||
},
|
||||
"scripts": {
|
||||
"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",
|
||||
@@ -25,25 +28,25 @@
|
||||
},
|
||||
"homepage": "https://github.com/mozilla-actions/sccache-action#readme",
|
||||
"dependencies": {
|
||||
"@actions/core": "^1.10.0",
|
||||
"@actions/github": "^5.1.1",
|
||||
"@actions/core": "^1.10.1",
|
||||
"@actions/github": "^6.0.0",
|
||||
"@actions/io": "^1.1.3",
|
||||
"@actions/tool-cache": "^2.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^27.4.1",
|
||||
"@types/node": "^20.10.6",
|
||||
"@typescript-eslint/eslint-plugin": "^5.59.9",
|
||||
"@typescript-eslint/parser": "^5.59.9",
|
||||
"@types/jest": "^29.5.12",
|
||||
"@types/node": "^20.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^7.8.0",
|
||||
"@typescript-eslint/parser": "^7.11.0",
|
||||
"@vercel/ncc": "^0.38.1",
|
||||
"eslint-config-prettier": "^9.0.0",
|
||||
"eslint-config-prettier": "^9.1.0",
|
||||
"eslint-plugin-import": "^2.29.1",
|
||||
"eslint-plugin-jest": "^27.6.0",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"jest": "^27.5.1",
|
||||
"eslint-plugin-jest": "^28.5.0",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"jest": "^29.7.0",
|
||||
"jest-circus": "^29.7.0",
|
||||
"prettier": "^2.8.8",
|
||||
"ts-jest": "^27.1.4",
|
||||
"typescript": "^4.9.5"
|
||||
"prettier": "^3.3.2",
|
||||
"ts-jest": "^29.1.4",
|
||||
"typescript": "^5.4.5"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ async function setup() {
|
||||
// Expose the sccache path as env.
|
||||
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.
|
||||
core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
|
||||
core.exportVariable(
|
||||
|
||||
@@ -14,24 +14,150 @@
|
||||
|
||||
import * as core from '@actions/core';
|
||||
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() {
|
||||
core.debug('start sccache show starts');
|
||||
|
||||
const defaultListener = {
|
||||
stdout: (data: Buffer) => {
|
||||
stdout.push(data.toString());
|
||||
}
|
||||
};
|
||||
|
||||
const stdout: string[] = [];
|
||||
|
||||
await exec.getExecOutput(`${process.env.SCCACHE_PATH}`, ['--show-stats'], {
|
||||
listeners: defaultListener
|
||||
const human_stats = await core.group('Get human-readable stats', async () => {
|
||||
return get_output(`${process.env.SCCACHE_PATH}`, ['--show-stats']);
|
||||
});
|
||||
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 => {
|
||||
core.error(err);
|
||||
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