Skip to content

Commit 46e0c62

Browse files
chore(logs): Prefix imported logs
1 parent c2b3c6d commit 46e0c62

File tree

4 files changed

+84
-101
lines changed

4 files changed

+84
-101
lines changed

.github/workflows/retrieve-logs.yml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ jobs:
88
runs-on: ubuntu-latest
99
steps:
1010
- name: Echo message
11-
run: for i in {1..5000}; do; echo "Hello $i"; sleep 0.1; done
11+
run: |
12+
for i in {1..500}
13+
do
14+
echo "Hello $i"
15+
sleep 0.1
16+
done
1217
1318
timeout:
1419
runs-on: ubuntu-latest

dist/index.js

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9765,8 +9765,7 @@ function handleLogs(args, workflowHandler) {
97659765
return __awaiter(this, void 0, void 0, function* () {
97669766
try {
97679767
const workflowRunId = yield workflowHandler.getWorkflowRunId();
9768-
const workflowLogsHandler = (0, workflow_logs_handler_1.logHandlerFactory)(args.workflowLogMode, args.token, workflowRunId, args.owner, args.repo);
9769-
yield workflowLogsHandler.handle();
9768+
yield (0, workflow_logs_handler_1.handleWorkflowLogsPerJob)(args, workflowRunId);
97709769
}
97719770
catch (e) {
97729771
core.error(`Failed to handle logs of tirggered workflow. Cause: ${e}`);
@@ -10227,82 +10226,73 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
1022710226
});
1022810227
};
1022910228
Object.defineProperty(exports, "__esModule", ({ value: true }));
10230-
exports.logHandlerFactory = void 0;
10229+
exports.handleWorkflowLogsPerJob = void 0;
1023110230
const core = __importStar(__nccwpck_require__(2186));
1023210231
const github = __importStar(__nccwpck_require__(5438));
1023310232
const debug_1 = __nccwpck_require__(1417);
10234-
function getWorkflowLogsPerJob(octokit, workflowRunId, owner, repo) {
10235-
var _a;
10233+
function handleWorkflowLogsPerJob(args, workflowRunId) {
1023610234
return __awaiter(this, void 0, void 0, function* () {
10237-
const logsPerJob = [];
10235+
const mode = args.workflowLogMode;
10236+
const token = args.token;
10237+
const owner = args.token;
10238+
const repo = args.repo;
10239+
const handler = logHandlerFactory(mode);
10240+
if (handler == null) {
10241+
return;
10242+
}
10243+
const octokit = github.getOctokit(token);
1023810244
const runId = workflowRunId;
1023910245
const response = yield octokit.rest.actions.listJobsForWorkflowRun({
1024010246
owner: owner,
1024110247
repo: repo,
1024210248
run_id: runId
1024310249
});
10244-
(0, debug_1.debug)('Jobs in workflow', response);
10250+
yield handler.handleJobList(response.data.jobs);
1024510251
for (const job of response.data.jobs) {
1024610252
try {
1024710253
const jobLog = yield octokit.rest.actions.downloadJobLogsForWorkflowRun({
1024810254
owner: owner,
1024910255
repo: repo,
1025010256
job_id: job.id,
1025110257
});
10252-
(0, debug_1.debug)(`Job ${job.id} log`, jobLog);
10253-
logsPerJob.push({
10254-
job: job,
10255-
logs: (_a = jobLog.data) === null || _a === void 0 ? void 0 : _a.toString()
10256-
});
10258+
yield handler.handleJobLogs(job, jobLog.data);
1025710259
}
1025810260
catch (error) {
10259-
(0, debug_1.debug)('Job log download error', error);
10260-
logsPerJob.push({
10261-
job: job,
10262-
error: error instanceof Error ? error : new Error(`${error}`)
10263-
});
10261+
yield handler.handleError(job, error);
1026410262
}
1026510263
}
10266-
return logsPerJob;
1026710264
});
1026810265
}
10269-
class NoOpLogsHandler {
10270-
handle() {
10266+
exports.handleWorkflowLogsPerJob = handleWorkflowLogsPerJob;
10267+
class PrintLogsHandler {
10268+
handleJobList(jobs) {
1027110269
return __awaiter(this, void 0, void 0, function* () {
10270+
(0, debug_1.debug)('Retrieving logs for jobs in workflow', jobs);
1027210271
});
1027310272
}
10274-
}
10275-
class PrintLogsHandler {
10276-
constructor(token, workflowRunId, owner, repo) {
10277-
this.workflowRunId = workflowRunId;
10278-
this.owner = owner;
10279-
this.repo = repo;
10280-
// Get octokit client for making API calls
10281-
this.octokit = github.getOctokit(token);
10273+
handleJobLogs(job, logs) {
10274+
return __awaiter(this, void 0, void 0, function* () {
10275+
core.startGroup(`Logs of job '${job.name}'`);
10276+
core.info(escapeImportedLogs(logs));
10277+
core.endGroup();
10278+
});
1028210279
}
10283-
handle() {
10280+
handleError(job, error) {
1028410281
return __awaiter(this, void 0, void 0, function* () {
10285-
const logsPerJob = yield getWorkflowLogsPerJob(this.octokit, this.workflowRunId, this.owner, this.repo);
10286-
for (const jobLogs of logsPerJob) {
10287-
core.info(`::group::Logs of job '${jobLogs.job.name}'`);
10288-
if (jobLogs.logs) {
10289-
core.info(jobLogs.logs);
10290-
}
10291-
if (jobLogs.error) {
10292-
core.warning(jobLogs.error);
10293-
}
10294-
core.info(`::endgroup::`);
10295-
}
10282+
core.warning(escapeImportedLogs(error.message));
1029610283
});
1029710284
}
1029810285
}
10299-
function logHandlerFactory(mode, token, workflowRunId, owner, repo) {
10286+
function logHandlerFactory(mode) {
1030010287
switch (mode) {
10301-
case 'print': return new PrintLogsHandler(token, workflowRunId, owner, repo);
10302-
default: return new NoOpLogsHandler();
10288+
case 'print': return new PrintLogsHandler();
10289+
default: return null;
1030310290
}
1030410291
}
10305-
exports.logHandlerFactory = logHandlerFactory;
10292+
function escapeImportedLogs(str) {
10293+
return str.replace(/^/mg, "| ")
10294+
.replace(/^(##\[[^\]]+\])/gm, "| $1");
10295+
}
1030610296

1030710297

1030810298
/***/ }),

src/main.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as core from '@actions/core'
99
import * as github from '@actions/github'
1010
import { formatDuration, getArgs, isTimedOut, sleep } from './utils';
1111
import { WorkflowHandler, WorkflowRunConclusion, WorkflowRunResult, WorkflowRunStatus } from './workflow-handler';
12-
import { logHandlerFactory } from './workflow-logs-handler';
12+
import { handleWorkflowLogsPerJob } from './workflow-logs-handler';
1313

1414

1515

@@ -64,8 +64,7 @@ function computeConclusion(start: number, waitForCompletionTimeout: number, resu
6464
async function handleLogs(args: any, workflowHandler: WorkflowHandler) {
6565
try {
6666
const workflowRunId = await workflowHandler.getWorkflowRunId()
67-
const workflowLogsHandler = logHandlerFactory(args.workflowLogMode, args.token, workflowRunId, args.owner, args.repo);
68-
await workflowLogsHandler.handle();
67+
await handleWorkflowLogsPerJob(args, workflowRunId);
6968
} catch(e: any) {
7069
core.error(`Failed to handle logs of tirggered workflow. Cause: ${e}`);
7170
}

src/workflow-logs-handler.ts

Lines changed: 42 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,30 @@ import { debug } from './debug';
44

55
interface JobInfo {
66
name: string,
7-
id: string
8-
}
9-
interface JobLogs {
10-
job: JobInfo,
11-
logs?: string,
12-
error?: Error
7+
id: number
138
}
149

1510

16-
async function getWorkflowLogsPerJob(octokit: any, workflowRunId: number, owner: string, repo: string): Promise<Array<JobLogs>> {
17-
const logsPerJob: Array<JobLogs> = []
11+
export async function handleWorkflowLogsPerJob(args: any, workflowRunId: number): Promise<void> {
12+
const mode = args.workflowLogMode;
13+
const token = args.token;
14+
const owner = args.owner;
15+
const repo = args.repo;
16+
17+
const handler = logHandlerFactory(mode);
18+
if (handler == null) {
19+
return;
20+
}
1821

22+
const octokit = github.getOctokit(token);
1923
const runId = workflowRunId;
2024
const response = await octokit.rest.actions.listJobsForWorkflowRun({
2125
owner: owner,
2226
repo: repo,
2327
run_id: runId
2428
});
2529

26-
debug('Jobs in workflow', response);
30+
await handler.handleJobList(response.data.jobs);
2731

2832
for (const job of response.data.jobs) {
2933
try {
@@ -32,65 +36,50 @@ async function getWorkflowLogsPerJob(octokit: any, workflowRunId: number, owner:
3236
repo: repo,
3337
job_id: job.id,
3438
});
35-
debug(`Job ${job.id} log`, jobLog);
36-
37-
logsPerJob.push({
38-
job: job,
39-
logs: jobLog.data?.toString()
40-
});
41-
} catch (error) {
42-
debug('Job log download error', error);
43-
logsPerJob.push({
44-
job: job,
45-
error: error instanceof Error ? error : new Error(`${error}`)
46-
});
39+
await handler.handleJobLogs(job, jobLog.data as string);
40+
} catch (error: any) {
41+
await handler.handleError(job, error);
4742
}
4843
}
49-
50-
return logsPerJob;
5144
}
5245

5346

5447

55-
export interface WorkflowLogHandler {
56-
handle(): Promise<void>
57-
}
5848

59-
class NoOpLogsHandler implements WorkflowLogHandler {
60-
async handle(): Promise<void> {
61-
}
49+
50+
51+
interface WorkflowLogHandler {
52+
handleJobList(jobs: Array<JobInfo>): Promise<void>
53+
handleJobLogs(job: JobInfo, logs: string): Promise<void>
54+
handleError(job: JobInfo, error: Error): Promise<void>
6255
}
6356

6457
class PrintLogsHandler implements WorkflowLogHandler {
65-
private octokit: any;
66-
67-
constructor(token: string,
68-
private workflowRunId: number,
69-
private owner: string,
70-
private repo: string) {
71-
// Get octokit client for making API calls
72-
this.octokit = github.getOctokit(token);
58+
59+
async handleJobList(jobs: Array<JobInfo>): Promise<void> {
60+
debug('Retrieving logs for jobs in workflow', jobs);
7361
}
7462

75-
async handle(): Promise<void> {
76-
const logsPerJob = await getWorkflowLogsPerJob(this.octokit, this.workflowRunId, this.owner, this.repo);
77-
78-
for (const jobLogs of logsPerJob) {
79-
core.info(`::group::Logs of job '${jobLogs.job.name}'`);
80-
if (jobLogs.logs) {
81-
core.info(jobLogs.logs);
82-
}
83-
if (jobLogs.error) {
84-
core.warning(jobLogs.error);
85-
}
86-
core.info(`::endgroup::`);
87-
}
63+
async handleJobLogs(job: JobInfo, logs: string): Promise<void> {
64+
core.startGroup(`Logs of job '${job.name}'`);
65+
core.info(escapeImportedLogs(logs));
66+
core.endGroup();
67+
68+
}
69+
70+
async handleError(job: JobInfo, error: Error): Promise<void> {
71+
core.warning(escapeImportedLogs(error.message));
8872
}
8973
}
9074

91-
export function logHandlerFactory(mode: string, token: string, workflowRunId: number, owner: string, repo: string): WorkflowLogHandler {
75+
function logHandlerFactory(mode: string): WorkflowLogHandler | null {
9276
switch(mode) {
93-
case 'print': return new PrintLogsHandler(token, workflowRunId, owner, repo);
94-
default: return new NoOpLogsHandler();
77+
case 'print': return new PrintLogsHandler();
78+
default: return null;
9579
}
80+
}
81+
82+
function escapeImportedLogs(str: string): string {
83+
return str.replace(/^/mg, "| ")
84+
.replace(/##\[([^\]]+)\]/gm, "##<$1>")
9685
}

0 commit comments

Comments
 (0)