Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions change/change-e38ab074-9193-4447-95c9-467ed1f4ebb6.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"changes": [
{
"type": "patch",
"comment": "chore: add Github Actions Reporter",
"packageName": "@lage-run/cli",
"email": "sanajmi@microsoft.com",
"dependentChangeType": "patch"
},
{
"type": "minor",
"comment": "chore: add Github Actions Reporter",
"packageName": "@lage-run/reporters",
"email": "sanajmi@microsoft.com",
"dependentChangeType": "patch"
}
]
}
2 changes: 1 addition & 1 deletion packages/cli/src/__tests__/customReporter.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ describe("initializeReporters with custom reporters", () => {
customReporters
)
).rejects.toThrowErrorMatchingInlineSnapshot(
`"Invalid --reporter option: "nonExistentReporter123". Supported reporters are: json, azureDevops, npmLog, verboseFileLog, vfl, adoLog, fancy, default"`
`"Invalid --reporter option: "nonExistentReporter123". Supported reporters are: json, azureDevops, npmLog, verboseFileLog, vfl, adoLog, githubActions, gha, fancy, default"`
);
});

Expand Down
49 changes: 48 additions & 1 deletion packages/cli/src/__tests__/initializeReporters.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Logger, type Reporter } from "@lage-run/logger";
import { AdoReporter, BasicReporter, ChromeTraceEventsReporter, LogReporter } from "@lage-run/reporters";
import { AdoReporter, BasicReporter, ChromeTraceEventsReporter, GithubActionsReporter, LogReporter } from "@lage-run/reporters";
import fs from "fs";
import isInteractive from "is-interactive";
import os from "os";
Expand All @@ -11,16 +11,33 @@ jest.mock("is-interactive", () => jest.fn(() => true));
describe("initializeReporters", () => {
let tmpDir: string;
let reporters: Reporter[] | undefined;
let savedGithubActions: string | undefined;
let savedTfBuild: string | undefined;

beforeAll(() => {
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "lage-"));
});

beforeEach(() => {
// Save and clear CI env vars so default-reporter tests are environment-independent
savedGithubActions = process.env.GITHUB_ACTIONS;
savedTfBuild = process.env.TF_BUILD;
delete process.env.GITHUB_ACTIONS;
delete process.env.TF_BUILD;
});

afterEach(async () => {
for (const reporter of reporters || []) {
reporter.cleanup?.();
}
reporters = undefined;
// Restore CI env vars
if (savedGithubActions !== undefined) {
process.env.GITHUB_ACTIONS = savedGithubActions;
}
if (savedTfBuild !== undefined) {
process.env.TF_BUILD = savedTfBuild;
}
});

afterAll(() => {
Expand Down Expand Up @@ -115,4 +132,34 @@ describe("initializeReporters", () => {
expect(reporters.length).toBe(1);
expect(reporters).toContainEqual(expect.any(AdoReporter));
});

it("should auto-detect GitHub Actions and use GithubActionsReporter", async () => {
process.env.GITHUB_ACTIONS = "true";
const logger = new Logger();
reporters = await initializeReporters(logger, {
concurrency: 1,
grouped: false,
logLevel: "info",
progress: false,
reporter: [],
verbose: false,
});
expect(reporters.length).toBe(1);
expect(reporters).toContainEqual(expect.any(GithubActionsReporter));
});

it("should auto-detect Azure DevOps and use AdoReporter", async () => {
process.env.TF_BUILD = "True";
const logger = new Logger();
reporters = await initializeReporters(logger, {
concurrency: 1,
grouped: false,
logLevel: "info",
progress: false,
reporter: [],
verbose: false,
});
expect(reporters.length).toBe(1);
expect(reporters).toContainEqual(expect.any(AdoReporter));
});
});
15 changes: 14 additions & 1 deletion packages/cli/src/commands/createReporter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { LogLevel } from "@lage-run/logger";
import {
JsonReporter,
AdoReporter,
GithubActionsReporter,
LogReporter,
ProgressReporter,
BasicReporter,
Expand Down Expand Up @@ -40,6 +41,10 @@ export async function createReporter(
case "adoLog":
return new AdoReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });

case "githubActions":
case "gha":
return new GithubActionsReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });

case "npmLog":
case "old":
return new LogReporter({ grouped, logLevel: verbose ? LogLevel.verbose : logLevel });
Expand Down Expand Up @@ -78,7 +83,15 @@ export async function createReporter(
}
}

// Default reporter behavior
// Default reporter behavior - auto-detect CI environments
if (process.env.GITHUB_ACTIONS) {
return new GithubActionsReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel });
}

if (process.env.TF_BUILD) {
return new AdoReporter({ grouped: true, logLevel: verbose ? LogLevel.verbose : logLevel });
}

if (progress && isInteractive() && !(logLevel >= LogLevel.verbose || verbose || grouped)) {
return new BasicReporter({ concurrency, version });
}
Expand Down
4 changes: 4 additions & 0 deletions packages/cli/src/types/ReporterInitOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ export type BuiltInReporterName =
| "json"
| "azureDevops"
| "adoLog"
| "githubActions"
| "gha"
| "npmLog"
| "old"
| "verboseFileLog"
Expand All @@ -23,6 +25,8 @@ const shouldListBuiltInReporters: Record<BuiltInReporterName, boolean> = {
verboseFileLog: true,
vfl: true,
adoLog: true,
githubActions: true,
gha: true,
fancy: true,
default: true,
// Not encouraged
Expand Down
Loading