@kitsi/action 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/action.yml +61 -0
- package/dist/capabilities/annotations.d.ts +15 -0
- package/dist/capabilities/annotations.d.ts.map +1 -0
- package/dist/capabilities/annotations.js +28 -0
- package/dist/capabilities/annotations.js.map +1 -0
- package/dist/capabilities/artifacts.d.ts +7 -0
- package/dist/capabilities/artifacts.d.ts.map +1 -0
- package/dist/capabilities/artifacts.js +36 -0
- package/dist/capabilities/artifacts.js.map +1 -0
- package/dist/capabilities/cache.d.ts +18 -0
- package/dist/capabilities/cache.d.ts.map +1 -0
- package/dist/capabilities/cache.js +75 -0
- package/dist/capabilities/cache.js.map +1 -0
- package/dist/capabilities/index.d.ts +22 -0
- package/dist/capabilities/index.d.ts.map +1 -0
- package/dist/capabilities/index.js +24 -0
- package/dist/capabilities/index.js.map +1 -0
- package/dist/capabilities/reports.d.ts +30 -0
- package/dist/capabilities/reports.d.ts.map +1 -0
- package/dist/capabilities/reports.js +155 -0
- package/dist/capabilities/reports.js.map +1 -0
- package/dist/capabilities/secrets.d.ts +8 -0
- package/dist/capabilities/secrets.d.ts.map +1 -0
- package/dist/capabilities/secrets.js +13 -0
- package/dist/capabilities/secrets.js.map +1 -0
- package/dist/capabilities/summary.d.ts +23 -0
- package/dist/capabilities/summary.d.ts.map +1 -0
- package/dist/capabilities/summary.js +52 -0
- package/dist/capabilities/summary.js.map +1 -0
- package/dist/groups.d.ts +12 -0
- package/dist/groups.d.ts.map +1 -0
- package/dist/groups.js +41 -0
- package/dist/groups.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +104576 -0
- package/dist/index.js.map +1 -0
- package/dist/post.d.ts +2 -0
- package/dist/post.d.ts.map +1 -0
- package/dist/post.js +57407 -0
- package/dist/post.js.map +1 -0
- package/dist/runner.d.ts +19 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +135 -0
- package/dist/runner.js.map +1 -0
- package/package.json +38 -0
package/action.yml
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
name: 'Kitsi'
|
|
2
|
+
description: 'Run Kitsi pipelines with native GitHub integration'
|
|
3
|
+
author: 'Kitsi'
|
|
4
|
+
branding:
|
|
5
|
+
icon: 'play-circle'
|
|
6
|
+
color: 'blue'
|
|
7
|
+
|
|
8
|
+
inputs:
|
|
9
|
+
plan:
|
|
10
|
+
description: 'Plan name to execute'
|
|
11
|
+
required: true
|
|
12
|
+
file:
|
|
13
|
+
description: 'Pipeline file path'
|
|
14
|
+
required: false
|
|
15
|
+
default: '.kitsi/pipeline.ts'
|
|
16
|
+
task:
|
|
17
|
+
description: 'Run specific task only'
|
|
18
|
+
required: false
|
|
19
|
+
timeout:
|
|
20
|
+
description: 'Execution timeout (e.g., 10m, 1h)'
|
|
21
|
+
required: false
|
|
22
|
+
default: '30m'
|
|
23
|
+
fail-fast:
|
|
24
|
+
description: 'Stop on first task failure'
|
|
25
|
+
required: false
|
|
26
|
+
default: 'true'
|
|
27
|
+
working-directory:
|
|
28
|
+
description: 'Working directory for execution'
|
|
29
|
+
required: false
|
|
30
|
+
default: '.'
|
|
31
|
+
|
|
32
|
+
outputs:
|
|
33
|
+
status:
|
|
34
|
+
description: 'Execution status (success/failed)'
|
|
35
|
+
duration:
|
|
36
|
+
description: 'Total duration in seconds'
|
|
37
|
+
tasks:
|
|
38
|
+
description: 'JSON object with per-task results'
|
|
39
|
+
|
|
40
|
+
runs:
|
|
41
|
+
using: 'composite'
|
|
42
|
+
steps:
|
|
43
|
+
- name: Setup Bun
|
|
44
|
+
uses: oven-sh/setup-bun@v1
|
|
45
|
+
with:
|
|
46
|
+
bun-version: '1.3.5'
|
|
47
|
+
- name: Run Kitsi
|
|
48
|
+
shell: bash
|
|
49
|
+
working-directory: ${{ github.workspace }}
|
|
50
|
+
run: bun "$GITHUB_ACTION_PATH/dist/index.js"
|
|
51
|
+
env:
|
|
52
|
+
INPUT_PLAN: ${{ inputs.plan }}
|
|
53
|
+
INPUT_FILE: ${{ inputs.file }}
|
|
54
|
+
INPUT_TASK: ${{ inputs.task }}
|
|
55
|
+
INPUT_TIMEOUT: ${{ inputs.timeout }}
|
|
56
|
+
INPUT_FAIL-FAST: ${{ inputs.fail-fast }}
|
|
57
|
+
INPUT_WORKING-DIRECTORY: ${{ inputs.working-directory }}
|
|
58
|
+
- name: Post Kitsi
|
|
59
|
+
if: ${{ always() }}
|
|
60
|
+
shell: bash
|
|
61
|
+
run: bun "$GITHUB_ACTION_PATH/dist/post.js"
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface AnnotateLocation {
|
|
2
|
+
file: string;
|
|
3
|
+
line?: number;
|
|
4
|
+
col?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface AnnotateOp {
|
|
7
|
+
kind: 'annotate';
|
|
8
|
+
level: 'error' | 'warning' | 'info';
|
|
9
|
+
message: string;
|
|
10
|
+
location?: AnnotateLocation;
|
|
11
|
+
}
|
|
12
|
+
export declare class GitHubAnnotationCapability {
|
|
13
|
+
emit(op: AnnotateOp): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=annotations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.d.ts","sourceRoot":"","sources":["../../src/capabilities/annotations.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B;AAED,qBAAa,0BAA0B;IACrC,IAAI,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;CA0B3B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as core from '@actions/core';
|
|
2
|
+
export class GitHubAnnotationCapability {
|
|
3
|
+
emit(op) {
|
|
4
|
+
const properties = {};
|
|
5
|
+
if (op.location) {
|
|
6
|
+
properties.file = op.location.file;
|
|
7
|
+
if (op.location.line) {
|
|
8
|
+
properties.startLine = op.location.line;
|
|
9
|
+
properties.endLine = op.location.line;
|
|
10
|
+
}
|
|
11
|
+
if (op.location.col) {
|
|
12
|
+
properties.startColumn = op.location.col;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
switch (op.level) {
|
|
16
|
+
case 'error':
|
|
17
|
+
core.error(op.message, properties);
|
|
18
|
+
break;
|
|
19
|
+
case 'warning':
|
|
20
|
+
core.warning(op.message, properties);
|
|
21
|
+
break;
|
|
22
|
+
case 'info':
|
|
23
|
+
core.notice(op.message, properties);
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=annotations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../src/capabilities/annotations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAetC,MAAM,OAAO,0BAA0B;IACrC,IAAI,CAAC,EAAc;QACjB,MAAM,UAAU,GAA8B,EAAE,CAAC;QAEjD,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACrB,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxC,UAAU,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;YACxC,CAAC;YACD,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACpB,UAAU,CAAC,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC3C,CAAC;QACH,CAAC;QAED,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACnC,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACrC,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;gBACpC,MAAM;QACV,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ArtifactDownloadOp, ArtifactUploadOp } from '@kitsi/cli';
|
|
2
|
+
export declare class GitHubArtifactCapability {
|
|
3
|
+
private client;
|
|
4
|
+
upload(op: ArtifactUploadOp, workdir: string): Promise<void>;
|
|
5
|
+
download(op: ArtifactDownloadOp): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/capabilities/artifacts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAUvE,qBAAa,wBAAwB;IACnC,OAAO,CAAC,MAAM,CAAwC;IAEhD,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5D,QAAQ,CAAC,EAAE,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAQtD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import * as artifact from '@actions/artifact';
|
|
2
|
+
import * as glob from '@actions/glob';
|
|
3
|
+
function formatBytes(bytes) {
|
|
4
|
+
if (bytes === 0)
|
|
5
|
+
return '0 B';
|
|
6
|
+
const k = 1024;
|
|
7
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
8
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
9
|
+
return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
|
|
10
|
+
}
|
|
11
|
+
export class GitHubArtifactCapability {
|
|
12
|
+
client = new artifact.DefaultArtifactClient();
|
|
13
|
+
async upload(op, workdir) {
|
|
14
|
+
const globber = await glob.create(op.patterns.join('\n'), {
|
|
15
|
+
matchDirectories: false,
|
|
16
|
+
});
|
|
17
|
+
const files = await globber.glob();
|
|
18
|
+
if (files.length === 0) {
|
|
19
|
+
throw new Error(`No files matched patterns: ${op.patterns.join(', ')}`);
|
|
20
|
+
}
|
|
21
|
+
const { size } = await this.client.uploadArtifact(op.name, files, workdir, {
|
|
22
|
+
compressionLevel: 6,
|
|
23
|
+
});
|
|
24
|
+
const normalizedSize = Number(size ?? 0);
|
|
25
|
+
const sizeBytes = Number.isFinite(normalizedSize) ? normalizedSize : 0;
|
|
26
|
+
console.log(`Uploaded artifact "${op.name}": ${files.length} files, ${formatBytes(sizeBytes)}`);
|
|
27
|
+
}
|
|
28
|
+
async download(op) {
|
|
29
|
+
const { artifact } = await this.client.getArtifact(op.name);
|
|
30
|
+
const { downloadPath } = await this.client.downloadArtifact(artifact.id, {
|
|
31
|
+
path: op.destination,
|
|
32
|
+
});
|
|
33
|
+
console.log(`Downloaded artifact "${op.name}" to ${downloadPath}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/capabilities/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAGtC,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,CAAC;IACf,MAAM,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,OAAO,wBAAwB;IAC3B,MAAM,GAAG,IAAI,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,EAAoB,EAAE,OAAe;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YACxD,gBAAgB,EAAE,KAAK;SACxB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;YACzE,gBAAgB,EAAE,CAAC;SACpB,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAEvE,OAAO,CAAC,GAAG,CACT,sBAAsB,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,MAAM,WAAW,WAAW,CAAC,SAAS,CAAC,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAsB;QACnC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,EAAE;YACvE,IAAI,EAAE,EAAE,CAAC,WAAW;SACrB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,IAAI,QAAQ,YAAY,EAAE,CAAC,CAAC;IACrE,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CacheRef } from '@kitsi/cli';
|
|
2
|
+
interface PendingCache {
|
|
3
|
+
paths: string[];
|
|
4
|
+
key: string;
|
|
5
|
+
restoredKey: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare class GitHubCacheCapability {
|
|
8
|
+
private pendingCaches;
|
|
9
|
+
mount(ref: CacheRef): Promise<boolean>;
|
|
10
|
+
private computeKey;
|
|
11
|
+
private hashFiles;
|
|
12
|
+
private hashEnv;
|
|
13
|
+
private hashValue;
|
|
14
|
+
private computeRestoreKeys;
|
|
15
|
+
getPendingCaches(): PendingCache[];
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/capabilities/cache.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAOD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAsB;IAErC,KAAK,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;YAyB9B,UAAU;YAsBV,SAAS;IAavB,OAAO,CAAC,OAAO;IAUf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,kBAAkB;IAI1B,gBAAgB,IAAI,YAAY,EAAE;CAGnC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as cache from '@actions/cache';
|
|
2
|
+
import * as core from '@actions/core';
|
|
3
|
+
import * as glob from '@actions/glob';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
export class GitHubCacheCapability {
|
|
7
|
+
pendingCaches = [];
|
|
8
|
+
async mount(ref) {
|
|
9
|
+
const path = ref.mountPath;
|
|
10
|
+
if (!path) {
|
|
11
|
+
throw new Error(`Cache "${ref.name}" has no mount path`);
|
|
12
|
+
}
|
|
13
|
+
const key = await this.computeKey(ref);
|
|
14
|
+
const restoreKeys = this.computeRestoreKeys(ref);
|
|
15
|
+
const restoredKey = await cache.restoreCache([path], key, restoreKeys);
|
|
16
|
+
const hit = restoredKey !== undefined;
|
|
17
|
+
if (hit) {
|
|
18
|
+
core.info(`Cache hit: ${restoredKey}`);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
core.info(`Cache miss, will save as: ${key}`);
|
|
22
|
+
}
|
|
23
|
+
// Track for post-run save
|
|
24
|
+
this.pendingCaches.push({ paths: [path], key, restoredKey });
|
|
25
|
+
process.env.KITSI_PENDING_CACHES = JSON.stringify(this.pendingCaches);
|
|
26
|
+
return hit;
|
|
27
|
+
}
|
|
28
|
+
async computeKey(ref) {
|
|
29
|
+
const parts = [process.env.RUNNER_OS ?? 'unknown', ref.name];
|
|
30
|
+
const key = ref.key;
|
|
31
|
+
if (key?.files && key.files.length > 0) {
|
|
32
|
+
const hash = await this.hashFiles(key.files);
|
|
33
|
+
parts.push(hash.slice(0, 16));
|
|
34
|
+
}
|
|
35
|
+
if (key?.env && key.env.length > 0) {
|
|
36
|
+
const hash = this.hashEnv(key.env);
|
|
37
|
+
parts.push(hash.slice(0, 16));
|
|
38
|
+
}
|
|
39
|
+
if (key?.value) {
|
|
40
|
+
const hash = this.hashValue(key.value);
|
|
41
|
+
parts.push(hash.slice(0, 16));
|
|
42
|
+
}
|
|
43
|
+
return parts.join('-');
|
|
44
|
+
}
|
|
45
|
+
async hashFiles(patterns) {
|
|
46
|
+
const globber = await glob.create(patterns.join('\n'));
|
|
47
|
+
const files = await globber.glob();
|
|
48
|
+
const hash = createHash('sha256');
|
|
49
|
+
for (const file of files.sort()) {
|
|
50
|
+
const contents = await readFile(file);
|
|
51
|
+
hash.update(file);
|
|
52
|
+
hash.update(contents);
|
|
53
|
+
}
|
|
54
|
+
return hash.digest('hex');
|
|
55
|
+
}
|
|
56
|
+
hashEnv(names) {
|
|
57
|
+
const hash = createHash('sha256');
|
|
58
|
+
for (const name of names.sort()) {
|
|
59
|
+
hash.update(name);
|
|
60
|
+
hash.update('=');
|
|
61
|
+
hash.update(process.env[name] ?? '__unset__');
|
|
62
|
+
}
|
|
63
|
+
return hash.digest('hex');
|
|
64
|
+
}
|
|
65
|
+
hashValue(value) {
|
|
66
|
+
return createHash('sha256').update(value).digest('hex');
|
|
67
|
+
}
|
|
68
|
+
computeRestoreKeys(ref) {
|
|
69
|
+
return [`${process.env.RUNNER_OS ?? 'unknown'}-${ref.name}-`];
|
|
70
|
+
}
|
|
71
|
+
getPendingCaches() {
|
|
72
|
+
return this.pendingCaches;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/capabilities/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { GitHubAnnotationCapability } from './annotations.js';
|
|
2
|
+
import { GitHubArtifactCapability } from './artifacts.js';
|
|
3
|
+
import { GitHubCacheCapability } from './cache.js';
|
|
4
|
+
import { GitHubReportCapability } from './reports.js';
|
|
5
|
+
import { GitHubSecretsCapability } from './secrets.js';
|
|
6
|
+
import { GitHubSummaryCapability } from './summary.js';
|
|
7
|
+
export declare class GitHubCapabilities {
|
|
8
|
+
readonly artifacts: GitHubArtifactCapability;
|
|
9
|
+
readonly cache: GitHubCacheCapability;
|
|
10
|
+
readonly summary: GitHubSummaryCapability;
|
|
11
|
+
readonly annotations: GitHubAnnotationCapability;
|
|
12
|
+
readonly secrets: GitHubSecretsCapability;
|
|
13
|
+
readonly reports: GitHubReportCapability;
|
|
14
|
+
constructor();
|
|
15
|
+
}
|
|
16
|
+
export { GitHubAnnotationCapability } from './annotations.js';
|
|
17
|
+
export { GitHubArtifactCapability } from './artifacts.js';
|
|
18
|
+
export { GitHubCacheCapability } from './cache.js';
|
|
19
|
+
export { GitHubReportCapability } from './reports.js';
|
|
20
|
+
export { GitHubSecretsCapability } from './secrets.js';
|
|
21
|
+
export { GitHubSummaryCapability } from './summary.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,SAAS,2BAAkC;IACpD,QAAQ,CAAC,KAAK,wBAA+B;IAC7C,QAAQ,CAAC,OAAO,0BAAiC;IACjD,QAAQ,CAAC,WAAW,6BAAoC;IACxD,QAAQ,CAAC,OAAO,0BAAiC;IACjD,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;;CAK1C;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { GitHubAnnotationCapability } from './annotations.js';
|
|
2
|
+
import { GitHubArtifactCapability } from './artifacts.js';
|
|
3
|
+
import { GitHubCacheCapability } from './cache.js';
|
|
4
|
+
import { GitHubReportCapability } from './reports.js';
|
|
5
|
+
import { GitHubSecretsCapability } from './secrets.js';
|
|
6
|
+
import { GitHubSummaryCapability } from './summary.js';
|
|
7
|
+
export class GitHubCapabilities {
|
|
8
|
+
artifacts = new GitHubArtifactCapability();
|
|
9
|
+
cache = new GitHubCacheCapability();
|
|
10
|
+
summary = new GitHubSummaryCapability();
|
|
11
|
+
annotations = new GitHubAnnotationCapability();
|
|
12
|
+
secrets = new GitHubSecretsCapability();
|
|
13
|
+
reports;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.reports = new GitHubReportCapability(this.summary, this.annotations);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export { GitHubAnnotationCapability } from './annotations.js';
|
|
19
|
+
export { GitHubArtifactCapability } from './artifacts.js';
|
|
20
|
+
export { GitHubCacheCapability } from './cache.js';
|
|
21
|
+
export { GitHubReportCapability } from './reports.js';
|
|
22
|
+
export { GitHubSecretsCapability } from './secrets.js';
|
|
23
|
+
export { GitHubSummaryCapability } from './summary.js';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/capabilities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,OAAO,kBAAkB;IACpB,SAAS,GAAG,IAAI,wBAAwB,EAAE,CAAC;IAC3C,KAAK,GAAG,IAAI,qBAAqB,EAAE,CAAC;IACpC,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACxC,WAAW,GAAG,IAAI,0BAA0B,EAAE,CAAC;IAC/C,OAAO,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACxC,OAAO,CAAyB;IAEzC;QACE,IAAI,CAAC,OAAO,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5E,CAAC;CACF;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { GitHubAnnotationCapability } from './annotations.js';
|
|
2
|
+
import type { GitHubSummaryCapability } from './summary.js';
|
|
3
|
+
export interface ReportOp {
|
|
4
|
+
kind: 'report';
|
|
5
|
+
reportType: 'junit' | 'coverage';
|
|
6
|
+
path: string;
|
|
7
|
+
}
|
|
8
|
+
export interface JUnitFailure {
|
|
9
|
+
testName: string;
|
|
10
|
+
message: string;
|
|
11
|
+
file?: string;
|
|
12
|
+
line?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface JUnitResult {
|
|
15
|
+
total: number;
|
|
16
|
+
passed: number;
|
|
17
|
+
skipped: number;
|
|
18
|
+
duration: number;
|
|
19
|
+
failures: JUnitFailure[];
|
|
20
|
+
}
|
|
21
|
+
export declare function parseJUnit(content: string): JUnitResult;
|
|
22
|
+
export declare class GitHubReportCapability {
|
|
23
|
+
private summary;
|
|
24
|
+
private annotations;
|
|
25
|
+
constructor(summary: GitHubSummaryCapability, annotations: GitHubAnnotationCapability);
|
|
26
|
+
process(op: ReportOp, taskName: string): Promise<void>;
|
|
27
|
+
private processJUnit;
|
|
28
|
+
private processCoverage;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=reports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/capabilities/reports.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAqFD,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAwCvD;AAED,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,WAAW;gBADX,OAAO,EAAE,uBAAuB,EAChC,WAAW,EAAE,0BAA0B;IAG3C,OAAO,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAW9C,YAAY;YAiCZ,eAAe;CAuB9B"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
3
|
+
function toNumber(value) {
|
|
4
|
+
if (value === undefined)
|
|
5
|
+
return 0;
|
|
6
|
+
if (typeof value === 'number')
|
|
7
|
+
return value;
|
|
8
|
+
return Number.parseInt(value, 10) || 0;
|
|
9
|
+
}
|
|
10
|
+
function toFloat(value) {
|
|
11
|
+
if (value === undefined)
|
|
12
|
+
return 0;
|
|
13
|
+
if (typeof value === 'number')
|
|
14
|
+
return value;
|
|
15
|
+
return Number.parseFloat(value) || 0;
|
|
16
|
+
}
|
|
17
|
+
function extractFailureMessage(failure) {
|
|
18
|
+
if (!failure)
|
|
19
|
+
return 'Unknown failure';
|
|
20
|
+
if (typeof failure === 'string')
|
|
21
|
+
return failure;
|
|
22
|
+
return failure['@_message'] || failure['#text'] || 'Unknown failure';
|
|
23
|
+
}
|
|
24
|
+
function processTestCase(testcase, failures) {
|
|
25
|
+
const testName = testcase['@_name'] || 'Unknown test';
|
|
26
|
+
if (testcase.failure) {
|
|
27
|
+
failures.push({
|
|
28
|
+
testName,
|
|
29
|
+
message: extractFailureMessage(testcase.failure),
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (testcase.error) {
|
|
33
|
+
failures.push({
|
|
34
|
+
testName,
|
|
35
|
+
message: extractFailureMessage(testcase.error),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function processTestSuite(suite, result) {
|
|
40
|
+
result.total += toNumber(suite['@_tests']);
|
|
41
|
+
result.skipped += toNumber(suite['@_skipped']);
|
|
42
|
+
result.duration += toFloat(suite['@_time']);
|
|
43
|
+
const testcases = suite.testcase;
|
|
44
|
+
if (!testcases)
|
|
45
|
+
return;
|
|
46
|
+
const cases = Array.isArray(testcases) ? testcases : [testcases];
|
|
47
|
+
for (const testcase of cases) {
|
|
48
|
+
processTestCase(testcase, result.failures);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export function parseJUnit(content) {
|
|
52
|
+
const parser = new XMLParser({
|
|
53
|
+
ignoreAttributes: false,
|
|
54
|
+
attributeNamePrefix: '@_',
|
|
55
|
+
});
|
|
56
|
+
const doc = parser.parse(content);
|
|
57
|
+
const result = {
|
|
58
|
+
total: 0,
|
|
59
|
+
passed: 0,
|
|
60
|
+
skipped: 0,
|
|
61
|
+
duration: 0,
|
|
62
|
+
failures: [],
|
|
63
|
+
};
|
|
64
|
+
// Handle <testsuites> wrapper
|
|
65
|
+
if (doc.testsuites) {
|
|
66
|
+
const suites = doc.testsuites.testsuite;
|
|
67
|
+
if (suites) {
|
|
68
|
+
const suiteArray = Array.isArray(suites) ? suites : [suites];
|
|
69
|
+
for (const suite of suiteArray) {
|
|
70
|
+
processTestSuite(suite, result);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Use aggregate counts if available
|
|
74
|
+
if (doc.testsuites['@_tests']) {
|
|
75
|
+
result.total = toNumber(doc.testsuites['@_tests']);
|
|
76
|
+
result.skipped = toNumber(doc.testsuites['@_skipped']);
|
|
77
|
+
result.duration = toFloat(doc.testsuites['@_time']);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Handle single <testsuite> at root
|
|
81
|
+
else if (doc.testsuite) {
|
|
82
|
+
processTestSuite(doc.testsuite, result);
|
|
83
|
+
}
|
|
84
|
+
// Calculate passed count
|
|
85
|
+
result.passed = result.total - result.failures.length - result.skipped;
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
export class GitHubReportCapability {
|
|
89
|
+
summary;
|
|
90
|
+
annotations;
|
|
91
|
+
constructor(summary, annotations) {
|
|
92
|
+
this.summary = summary;
|
|
93
|
+
this.annotations = annotations;
|
|
94
|
+
}
|
|
95
|
+
async process(op, taskName) {
|
|
96
|
+
switch (op.reportType) {
|
|
97
|
+
case 'junit':
|
|
98
|
+
await this.processJUnit(op.path, taskName);
|
|
99
|
+
break;
|
|
100
|
+
case 'coverage':
|
|
101
|
+
await this.processCoverage(op.path, taskName);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async processJUnit(path, taskName) {
|
|
106
|
+
const content = await fs.readFile(path, 'utf-8');
|
|
107
|
+
const result = parseJUnit(content);
|
|
108
|
+
// Create annotations for failures
|
|
109
|
+
for (const failure of result.failures) {
|
|
110
|
+
this.annotations.emit({
|
|
111
|
+
kind: 'annotate',
|
|
112
|
+
level: 'error',
|
|
113
|
+
message: `${failure.testName}: ${failure.message}`,
|
|
114
|
+
location: failure.file ? { file: failure.file, line: failure.line } : undefined,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Add to summary
|
|
118
|
+
const icon = result.failures.length === 0 ? '\u2705' : '\u274C';
|
|
119
|
+
let md = `#### Test Results ${icon}\n\n`;
|
|
120
|
+
md += `- **Total:** ${result.total}\n`;
|
|
121
|
+
md += `- **Passed:** ${result.passed}\n`;
|
|
122
|
+
md += `- **Failed:** ${result.failures.length}\n`;
|
|
123
|
+
md += `- **Skipped:** ${result.skipped}\n`;
|
|
124
|
+
md += `- **Duration:** ${result.duration}s\n`;
|
|
125
|
+
if (result.failures.length > 0) {
|
|
126
|
+
md += '\n**Failures:**\n';
|
|
127
|
+
for (const f of result.failures) {
|
|
128
|
+
md += `- \`${f.testName}\`: ${f.message}\n`;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
this.summary.writeTaskSummary(taskName, md);
|
|
132
|
+
}
|
|
133
|
+
async processCoverage(path, taskName) {
|
|
134
|
+
// Try to parse coverage summary
|
|
135
|
+
try {
|
|
136
|
+
const content = await fs.readFile(path, 'utf-8');
|
|
137
|
+
// Try JSON format (lcov-summary or similar)
|
|
138
|
+
if (path.endsWith('.json')) {
|
|
139
|
+
const data = JSON.parse(content);
|
|
140
|
+
let md = '#### Coverage Report\n\n';
|
|
141
|
+
if (data.total) {
|
|
142
|
+
md += `- **Lines:** ${data.total.lines?.pct ?? 'N/A'}%\n`;
|
|
143
|
+
md += `- **Branches:** ${data.total.branches?.pct ?? 'N/A'}%\n`;
|
|
144
|
+
md += `- **Functions:** ${data.total.functions?.pct ?? 'N/A'}%\n`;
|
|
145
|
+
md += `- **Statements:** ${data.total.statements?.pct ?? 'N/A'}%\n`;
|
|
146
|
+
}
|
|
147
|
+
this.summary.writeTaskSummary(taskName, md);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Silently ignore coverage parsing errors
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=reports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/capabilities/reports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/capabilities/secrets.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM;CAchC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as core from '@actions/core';
|
|
2
|
+
export class GitHubSecretsCapability {
|
|
3
|
+
resolve(ref) {
|
|
4
|
+
const value = process.env[ref.name];
|
|
5
|
+
if (value === undefined) {
|
|
6
|
+
throw new Error(`Secret "${ref.name}" not found. Ensure it's defined in repository secrets and passed via env in the workflow.`);
|
|
7
|
+
}
|
|
8
|
+
// Register for redaction in logs
|
|
9
|
+
core.setSecret(value);
|
|
10
|
+
return value;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/capabilities/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAOtC,MAAM,OAAO,uBAAuB;IAClC,OAAO,CAAC,GAAc;QACpB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEpC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CACb,WAAW,GAAG,CAAC,IAAI,4FAA4F,CAChH,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAEtB,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
interface SummaryOp {
|
|
2
|
+
kind: 'summary';
|
|
3
|
+
content: string;
|
|
4
|
+
}
|
|
5
|
+
interface TaskResult {
|
|
6
|
+
status: 'success' | 'failed';
|
|
7
|
+
duration: number;
|
|
8
|
+
summaries: SummaryOp[];
|
|
9
|
+
}
|
|
10
|
+
export interface PlanResult {
|
|
11
|
+
plan: string;
|
|
12
|
+
duration: number;
|
|
13
|
+
tasks: Record<string, TaskResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare class GitHubSummaryCapability {
|
|
16
|
+
private taskSummaries;
|
|
17
|
+
writePlanSummary(planName: string, result: PlanResult, totalDuration: number): Promise<void>;
|
|
18
|
+
private buildTaskSummaries;
|
|
19
|
+
private buildBufferedSummaries;
|
|
20
|
+
writeTaskSummary(taskName: string, content: string): void;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/capabilities/summary.ts"],"names":[],"mappings":"AAEA,UAAU,SAAS;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,SAAS,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACnC;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,aAAa,CAAoC;IAEnD,gBAAgB,CACpB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC;IAsBhB,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,sBAAsB;IAa9B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAM1D"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as core from '@actions/core';
|
|
2
|
+
export class GitHubSummaryCapability {
|
|
3
|
+
taskSummaries = new Map();
|
|
4
|
+
async writePlanSummary(planName, result, totalDuration) {
|
|
5
|
+
const status = Object.values(result.tasks).some((t) => t.status === 'failed')
|
|
6
|
+
? 'failed'
|
|
7
|
+
: 'success';
|
|
8
|
+
const statusIcon = status === 'success' ? '\u2705' : '\u274C';
|
|
9
|
+
let md = `## ${statusIcon} Kitsi: ${planName}\n\n`;
|
|
10
|
+
md += `**Duration:** ${totalDuration.toFixed(1)}s\n\n`;
|
|
11
|
+
md += '| Task | Status | Duration |\n';
|
|
12
|
+
md += '|------|--------|----------|\n';
|
|
13
|
+
for (const [taskName, taskResult] of Object.entries(result.tasks)) {
|
|
14
|
+
const icon = taskResult.status === 'success' ? '\u2713' : '\u2717';
|
|
15
|
+
md += `| ${taskName} | ${icon} | ${taskResult.duration.toFixed(1)}s |\n`;
|
|
16
|
+
}
|
|
17
|
+
md += this.buildTaskSummaries(result);
|
|
18
|
+
md += this.buildBufferedSummaries();
|
|
19
|
+
await core.summary.addRaw(md).write();
|
|
20
|
+
}
|
|
21
|
+
buildTaskSummaries(result) {
|
|
22
|
+
let output = '';
|
|
23
|
+
for (const [taskName, taskResult] of Object.entries(result.tasks)) {
|
|
24
|
+
if (taskResult.summaries && taskResult.summaries.length > 0) {
|
|
25
|
+
output += `\n### ${taskName}\n\n`;
|
|
26
|
+
for (const summary of taskResult.summaries) {
|
|
27
|
+
output += `${summary.content}\n\n`;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
buildBufferedSummaries() {
|
|
34
|
+
let output = '';
|
|
35
|
+
for (const [taskName, summaries] of this.taskSummaries.entries()) {
|
|
36
|
+
if (summaries.length > 0) {
|
|
37
|
+
output += `\n### ${taskName}\n\n`;
|
|
38
|
+
for (const summary of summaries) {
|
|
39
|
+
output += `${summary}\n\n`;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return output;
|
|
44
|
+
}
|
|
45
|
+
writeTaskSummary(taskName, content) {
|
|
46
|
+
// Buffer task summaries for inclusion in plan summary
|
|
47
|
+
const existing = this.taskSummaries.get(taskName) ?? [];
|
|
48
|
+
existing.push(content);
|
|
49
|
+
this.taskSummaries.set(taskName, existing);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=summary.js.map
|