Skip to content

Commit 70cf949

Browse files
committed
Share data for workflow runs and jos
1 parent b189a3f commit 70cf949

17 files changed

Lines changed: 198 additions & 170 deletions

package.json

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,16 @@
107107
"light": "resources/icons/light/run.svg"
108108
}
109109
},
110+
{
111+
"command": "github-actions.explorer.poll",
112+
"category": "GitHub Actions",
113+
"title": "Poll",
114+
"when": "viewItem =~ /run/",
115+
"icon": {
116+
"dark": "resources/icons/dark/run.svg",
117+
"light": "resources/icons/light/run.svg"
118+
}
119+
},
110120
{
111121
"command": "github-actions.workflow.run.open",
112122
"category": "GitHub Actions",
@@ -285,6 +295,11 @@
285295
"command": "github-actions.workflow.run.rerun",
286296
"when": "viewItem =~ /run/ && viewItem =~ /rerunnable/"
287297
},
298+
{
299+
"command": "github-actions.explorer.poll",
300+
"when": "viewItem =~ /run/",
301+
"group": "inline"
302+
},
288303
{
289304
"command": "github-actions.settings.secret.add",
290305
"group": "inline",
@@ -364,7 +379,7 @@
364379
"package": "npm run clean && vsce package",
365380
"build": "webpack --mode production",
366381
"vscode:prepublish": "npm run build",
367-
"watch": "webpack --watch --mode development --env esbuild",
382+
"watch": "webpack --watch --mode development --env esbuild",
368383
"open-in-browser": "vscode-test-web --extensionDevelopmentPath=. .",
369384
"lint": "eslint . --ext .ts",
370385
"lint-fix": "eslint . --ext .ts --fix; prettier --config .prettierrc.json 'src/**/*.ts' '*.json' --write",
@@ -404,10 +419,11 @@
404419
"libsodium-wrappers": "^0.7.10",
405420
"ssh-config": "^3.0.0",
406421
"stream-browserify": "^3.0.0",
422+
"timers-browserify": "^2.0.12",
407423
"tunnel": "0.0.6",
408424
"util": "^0.12.1",
409425
"uuid": "^3.3.3",
410426
"vscode-languageclient": "^8.0.2",
411427
"yaml": "^1.7.2"
412428
}
413-
}
429+
}

src/commands/cancelWorkflowRun.ts

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,23 @@
11
import * as vscode from "vscode";
2-
import {GitHubRepoContext} from "../git/repository";
3-
import {WorkflowRun} from "../model";
4-
5-
interface CancelWorkflowRunLogsCommandArgs {
6-
gitHubRepoContext: GitHubRepoContext;
7-
run: WorkflowRun;
8-
}
2+
import {WorkflowRunCommandArgs} from "../treeViews/shared/workflowRunNode";
93

104
export function registerCancelWorkflowRun(context: vscode.ExtensionContext) {
115
context.subscriptions.push(
12-
vscode.commands.registerCommand(
13-
"github-actions.workflow.run.cancel",
14-
async (args: CancelWorkflowRunLogsCommandArgs) => {
15-
const gitHubContext = args.gitHubRepoContext;
16-
const run = args.run;
6+
vscode.commands.registerCommand("github-actions.workflow.run.cancel", async (args: WorkflowRunCommandArgs) => {
7+
const gitHubContext = args.gitHubRepoContext;
8+
const run = args.run;
179

18-
try {
19-
await gitHubContext.client.actions.cancelWorkflowRun({
20-
owner: gitHubContext.owner,
21-
repo: gitHubContext.name,
22-
run_id: run.id
23-
});
24-
} catch (e) {
25-
await vscode.window.showErrorMessage(`Could not cancel workflow: '${(e as Error).message}'`);
26-
}
27-
28-
await vscode.commands.executeCommand("github-actions.explorer.refresh");
10+
try {
11+
await gitHubContext.client.actions.cancelWorkflowRun({
12+
owner: gitHubContext.owner,
13+
repo: gitHubContext.name,
14+
run_id: run.run.id
15+
});
16+
} catch (e) {
17+
await vscode.window.showErrorMessage(`Could not cancel workflow: '${(e as Error).message}'`);
2918
}
30-
)
19+
20+
await vscode.commands.executeCommand("github-actions.explorer.refresh");
21+
})
3122
);
3223
}
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,26 @@ import {GitHubRepoContext} from "../git/repository";
33
import {updateDecorations} from "../logs/formatProvider";
44
import {getLogInfo} from "../logs/logInfoProvider";
55
import {buildLogURI} from "../logs/scheme";
6-
import {WorkflowJob, WorkflowStep} from "../model";
6+
import {WorkflowStep} from "../model";
7+
import {WorkflowJob} from "../store/workflowRun";
78

8-
export interface OpenWorkflowRunLogsCommandArgs {
9+
export interface OpenWorkflowJobLogsCommandArgs {
910
gitHubRepoContext: GitHubRepoContext;
1011
job: WorkflowJob;
1112
step?: WorkflowStep;
1213
}
1314

14-
export function registerOpenWorkflowRunLogs(context: vscode.ExtensionContext) {
15+
export function registerOpenWorkflowJobLogs(context: vscode.ExtensionContext) {
1516
context.subscriptions.push(
16-
vscode.commands.registerCommand("github-actions.workflow.logs", async (args: OpenWorkflowRunLogsCommandArgs) => {
17+
vscode.commands.registerCommand("github-actions.workflow.logs", async (args: OpenWorkflowJobLogsCommandArgs) => {
1718
const gitHubRepoContext = args.gitHubRepoContext;
1819
const job = args.job;
1920
const step = args.step;
2021
const uri = buildLogURI(
21-
`%23${job.run_id} - ${job.name}`,
22+
`%23${job.job.run_id} - ${job.job.name}`,
2223
gitHubRepoContext.owner,
2324
gitHubRepoContext.name,
24-
job.id
25+
job.job.id
2526
);
2627

2728
const doc = await vscode.workspace.openTextDocument(uri);

src/commands/openWorkflowRun.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import * as vscode from "vscode";
2-
import {WorkflowRun} from "../model";
3-
4-
interface OpenWorkflowRunCommandArgs {
5-
run: WorkflowRun;
6-
}
2+
import {WorkflowRunCommandArgs} from "../treeViews/shared/workflowRunNode";
73

84
export function registerOpenWorkflowRun(context: vscode.ExtensionContext) {
95
context.subscriptions.push(
10-
vscode.commands.registerCommand("github-actions.workflow.run.open", async (args: OpenWorkflowRunCommandArgs) => {
6+
vscode.commands.registerCommand("github-actions.workflow.run.open", async (args: WorkflowRunCommandArgs) => {
117
const run = args.run;
12-
const url = run.html_url;
8+
const url = run.run.html_url;
139
await vscode.env.openExternal(vscode.Uri.parse(url));
1410
})
1511
);

src/commands/rerunWorkflowRun.ts

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,23 @@
11
import * as vscode from "vscode";
2-
3-
import {GitHubRepoContext} from "../git/repository";
4-
import {WorkflowRun} from "../model";
5-
6-
interface ReRunWorkflowRunLogsCommandArgs {
7-
gitHubRepoContext: GitHubRepoContext;
8-
run: WorkflowRun;
9-
}
2+
import {WorkflowRunCommandArgs} from "../treeViews/shared/workflowRunNode";
103

114
export function registerReRunWorkflowRun(context: vscode.ExtensionContext) {
125
context.subscriptions.push(
13-
vscode.commands.registerCommand(
14-
"github-actions.workflow.run.rerun",
15-
async (args: ReRunWorkflowRunLogsCommandArgs) => {
16-
const gitHubContext = args.gitHubRepoContext;
17-
const run = args.run;
6+
vscode.commands.registerCommand("github-actions.workflow.run.rerun", async (args: WorkflowRunCommandArgs) => {
7+
const gitHubContext = args.gitHubRepoContext;
8+
const run = args.run;
189

19-
try {
20-
await gitHubContext.client.actions.reRunWorkflow({
21-
owner: gitHubContext.owner,
22-
repo: gitHubContext.name,
23-
run_id: run.id
24-
});
25-
} catch (e) {
26-
await vscode.window.showErrorMessage(`Could not rerun workflow: '${(e as Error).message}'`);
27-
}
28-
29-
await vscode.commands.executeCommand("github-actions.explorer.refresh");
10+
try {
11+
await gitHubContext.client.actions.reRunWorkflow({
12+
owner: gitHubContext.owner,
13+
repo: gitHubContext.name,
14+
run_id: run.run.id
15+
});
16+
} catch (e) {
17+
await vscode.window.showErrorMessage(`Could not rerun workflow: '${(e as Error).message}'`);
3018
}
31-
)
19+
20+
await vscode.commands.executeCommand("github-actions.explorer.refresh");
21+
})
3222
);
3323
}

src/extension.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as vscode from "vscode";
22

3-
import {init as initLogger, log, logDebug} from "./log";
3+
import {init as initLogger, log, logDebug, revealLog} from "./log";
44

55
import {registerCancelWorkflowRun} from "./commands/cancelWorkflowRun";
66
import {registerOpenWorkflowFile} from "./commands/openWorkflowFile";
7+
import {registerOpenWorkflowJobLogs} from "./commands/openWorkflowJobLogs";
78
import {registerOpenWorkflowRun} from "./commands/openWorkflowRun";
8-
import {registerOpenWorkflowRunLogs} from "./commands/openWorkflowRunLogs";
99
import {registerPinWorkflow} from "./commands/pinWorkflow";
1010
import {registerReRunWorkflowRun} from "./commands/rerunWorkflowRun";
1111
import {registerAddSecret} from "./commands/secrets/addSecret";
@@ -20,9 +20,9 @@ import {LogScheme} from "./logs/constants";
2020
import {WorkflowStepLogProvider} from "./logs/fileProvider";
2121
import {WorkflowStepLogFoldingProvider} from "./logs/foldingProvider";
2222
import {WorkflowStepLogSymbolProvider} from "./logs/symbolProvider";
23-
import {WorkflowRun} from "./model";
2423
import {initPinnedWorkflows} from "./pinnedWorkflows/pinnedWorkflows";
2524
import {RunStore} from "./store/store";
25+
import {WorkflowRun} from "./store/workflowRun";
2626
import {initWorkflowDocumentTracking} from "./tracker/workflowDocumentTracker";
2727
import {CurrentBranchTreeProvider} from "./treeViews/currentBranch";
2828
import {initResources} from "./treeViews/icons";
@@ -70,7 +70,7 @@ export async function activate(context: vscode.ExtensionContext) {
7070
vscode.commands.registerCommand(
7171
"github-actions.explorer.poll",
7272
(args: {gitHubRepoContext: GitHubRepoContext; run: WorkflowRun}) => {
73-
store.pollRun(args.run.id, args.gitHubRepoContext, 2000, 10);
73+
store.pollRun(args.run.run.id, args.gitHubRepoContext, 2000, 100);
7474
}
7575
);
7676

@@ -113,7 +113,7 @@ export async function activate(context: vscode.ExtensionContext) {
113113

114114
registerOpenWorkflowRun(context);
115115
registerOpenWorkflowFile(context);
116-
registerOpenWorkflowRunLogs(context);
116+
registerOpenWorkflowJobLogs(context);
117117
registerTriggerWorkflowRun(context);
118118
registerReRunWorkflowRun(context);
119119
registerCancelWorkflowRun(context);
@@ -149,6 +149,10 @@ export async function activate(context: vscode.ExtensionContext) {
149149
await initLanguageServer(context);
150150

151151
log("...initialized");
152+
153+
if (!PRODUCTION) {
154+
revealLog();
155+
}
152156
}
153157

154158
export function deactivate(): Thenable<void> | undefined {

src/log.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,26 @@ export function init() {
1212
logger = vscode.window.createOutputChannel("GitHub Actions");
1313
}
1414

15-
export function log(...values: string[]) {
15+
export function log(...values: unknown[]) {
1616
logger.appendLine(values.join(" "));
1717
}
1818

19-
export function logDebug(...values: string[]) {
19+
export function logDebug(...values: unknown[]) {
2020
if (level > LogLevel.Debug) {
2121
return;
2222
}
2323

2424
logger.appendLine(values.join(" "));
2525
}
2626

27-
export function logError(e: Error, ...values: string[]) {
27+
export function logError(e: Error, ...values: unknown[]) {
2828
logger.appendLine(values.join(" "));
2929
logger.appendLine(e.message);
3030
if (e.stack) {
3131
logger.appendLine(e.stack);
3232
}
3333
}
34+
35+
export function revealLog() {
36+
logger.show();
37+
}

src/store/store.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import {setInterval} from "timers";
22
import {EventEmitter} from "vscode";
33
import {GitHubRepoContext} from "../git/repository";
4-
import {logDebug} from "../log";
5-
import {WorkflowRun} from "../model";
4+
import {log, logDebug} from "../log";
5+
import * as model from "../model";
6+
import {WorkflowRun} from "./workflowRun";
67

78
export interface RunStoreEvent {
89
run: WorkflowRun;
@@ -20,12 +21,25 @@ export class RunStore extends EventEmitter<RunStoreEvent> {
2021
private runs = new Map<number, WorkflowRun>();
2122
private updaters = new Map<number, Updater>();
2223

23-
/**
24-
* Update the given run and inform any listener
25-
*/
26-
updateRun(run: WorkflowRun) {
27-
this.runs.set(run.id, run);
24+
getRun(runId: number): WorkflowRun | undefined {
25+
return this.runs.get(runId);
26+
}
27+
28+
addRun(gitHubRepoContext: GitHubRepoContext, runData: model.WorkflowRun): WorkflowRun {
29+
let run = this.runs.get(runData.id);
30+
if (!run) {
31+
run = new WorkflowRun(gitHubRepoContext, runData);
32+
33+
log("Adding run: ", runData.id, runData.updated_at);
34+
} else {
35+
run.updateRun(runData);
36+
37+
log("Updating run: ", runData.id, runData.updated_at);
38+
}
39+
40+
this.runs.set(runData.id, run);
2841
this.fire({run});
42+
return run;
2943
}
3044

3145
/**
@@ -66,6 +80,6 @@ export class RunStore extends EventEmitter<RunStoreEvent> {
6680
});
6781

6882
const run = result.data;
69-
this.updateRun(run);
83+
this.addRun(updater.repoContext, run);
7084
}
7185
}

src/store/workflowRun.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import {GitHubRepoContext} from "../git/repository";
2+
import {logDebug} from "../log";
3+
import * as model from "../model";
4+
5+
export class WorkflowRun {
6+
private _gitHubRepoContext: GitHubRepoContext;
7+
private _run: model.WorkflowRun;
8+
private _jobs: Promise<WorkflowJob[]> | undefined;
9+
10+
constructor(gitHubRepoContext: GitHubRepoContext, run: model.WorkflowRun) {
11+
this._gitHubRepoContext = gitHubRepoContext;
12+
this._run = run;
13+
}
14+
15+
get run(): model.WorkflowRun {
16+
return this._run;
17+
}
18+
19+
updateRun(run: model.WorkflowRun) {
20+
if (this._run.updated_at !== run.updated_at) {
21+
// Run has changed, reset jobs
22+
this._jobs = undefined;
23+
}
24+
25+
this._run = run;
26+
}
27+
28+
jobs(): Promise<WorkflowJob[]> {
29+
if (!this._jobs) {
30+
this._jobs = this.fetchJobs();
31+
}
32+
33+
return this._jobs;
34+
}
35+
36+
private async fetchJobs(): Promise<WorkflowJob[]> {
37+
logDebug("Getting workflow jobs");
38+
39+
const result = await this._gitHubRepoContext.client.actions.listJobsForWorkflowRun({
40+
owner: this._gitHubRepoContext.owner,
41+
repo: this._gitHubRepoContext.name,
42+
run_id: this.run.id
43+
});
44+
45+
const resp = result.data;
46+
const jobs: model.WorkflowJob[] = resp.jobs;
47+
return jobs.map(j => new WorkflowJob(this._gitHubRepoContext, j));
48+
}
49+
}
50+
51+
export class WorkflowJob {
52+
readonly job: model.WorkflowJob;
53+
private gitHubRepoContext: GitHubRepoContext;
54+
55+
constructor(gitHubRepoContext: GitHubRepoContext, job: model.WorkflowJob) {
56+
this.gitHubRepoContext = gitHubRepoContext;
57+
this.job = job;
58+
}
59+
}

0 commit comments

Comments
 (0)