Skip to content

Commit e1cb5d8

Browse files
committed
Trigger workflow_dispatch events
1 parent bbda66f commit e1cb5d8

File tree

8 files changed

+250
-120
lines changed

8 files changed

+250
-120
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@
22

33
All notable changes to the "vscode-github-actions" extension will be documented in this file.
44

5-
## [vNext] - not yet released
5+
## [v.10.0]
66

77
- Fixes error when trying to open expired logs (#19)
88
- Removed login command, authorization is now handled via the GitHub authentication provider (#50)
99
- Fixes error where extension can not be enabled/disabled per workspace (#50)
10+
- Support for validating `workflow_dispatch` events
11+
- Support for triggering `workflow_dispatch` workflows
1012

1113
## [v0.9.0]
1214
- Updated `github-actions-parser` dependency to fix a number of auto-complete and validation bugs

package-lock.json

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
"displayName": "GitHub Actions",
44
"publisher": "cschleiden",
55
"icon": "resources/logo.png",
6+
"license": "MIT",
67
"repository": {
78
"url": "https://github.com/cschleiden/vscode-github-actions"
89
},
910
"description": "GitHub Actions workflows and runs for github.com hosted repositories in VS Code",
10-
"version": "0.9.0",
11+
"version": "0.10.0",
1112
"engines": {
1213
"vscode": "^1.48.0"
1314
},
@@ -75,7 +76,7 @@
7576
"command": "github-actions.explorer.triggerRun",
7677
"category": "GitHub Actions",
7778
"title": "Trigger workflow",
78-
"when": "viewItem =~ /workflow/ && viewItem =~ /rdispatch/",
79+
"when": "viewItem =~ /workflow/ && viewItem =~ /dispatch/",
7980
"icon": {
8081
"dark": "resources/icons/dark/run.svg",
8182
"light": "resources/icons/light/run.svg"
@@ -305,7 +306,7 @@
305306
"rimraf": "^3.0.1",
306307
"ts-loader": "^6.2.1",
307308
"tslint": "^5.20.0",
308-
"typescript": "^3.6.4",
309+
"typescript": "4.1.3",
309310
"vsce": "1.75.0",
310311
"vscode-test": "^1.2.2",
311312
"webpack": "^4.44.1",
@@ -315,7 +316,7 @@
315316
"@octokit/rest": "^18.0.0",
316317
"atob": "^2.1.2",
317318
"btoa": "^1.2.1",
318-
"github-actions-parser": "^0.9.0",
319+
"github-actions-parser": "0.10.1",
319320
"js-yaml": "^3.14.0",
320321
"ssh-config": "^3.0.0",
321322
"tunnel": "0.0.6",

src/extension.ts

Lines changed: 129 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
import * as vscode from "vscode";
2-
import { enableOrgFeatures } from "./auth/auth";
3-
import { initConfiguration } from "./configuration/configuration";
4-
import { getGitHubContext, GitHubContext } from "./git/repository";
5-
import { LogScheme } from "./logs/constants";
6-
import { WorkflowStepLogProvider } from "./logs/fileProvider";
7-
import { WorkflowStepLogFoldingProvider } from "./logs/foldingProvider";
8-
import { updateDecorations } from "./logs/formatProvider";
9-
import { getLogInfo } from "./logs/logInfoProvider";
10-
import { buildLogURI } from "./logs/scheme";
11-
import { WorkflowStepLogSymbolProvider } from "./logs/symbolProvider";
2+
3+
import { GitHubContext, getGitHead, getGitHubContext } from "./git/repository";
124
import {
135
OrgSecret,
146
RepoSecret,
@@ -17,17 +9,24 @@ import {
179
WorkflowRun,
1810
WorkflowStep,
1911
} from "./model";
20-
import { initPinnedWorkflows } from "./pinnedWorkflows/pinnedWorkflows";
21-
import { encodeSecret } from "./secrets";
22-
import { initWorkflowDocumentTracking } from "./tracker/workflowDocumentTracker";
23-
import { initResources } from "./treeViews/icons";
12+
import { getWorkflowUri, parseWorkflow } from "./workflow/workflow";
13+
14+
import { LogScheme } from "./logs/constants";
2415
import { SettingsTreeProvider } from "./treeViews/settings";
16+
import { WorkflowStepLogFoldingProvider } from "./logs/foldingProvider";
17+
import { WorkflowStepLogProvider } from "./logs/fileProvider";
18+
import { WorkflowStepLogSymbolProvider } from "./logs/symbolProvider";
2519
import { ActionsExplorerProvider as WorkflowsTreeProvider } from "./treeViews/workflows";
20+
import { buildLogURI } from "./logs/scheme";
21+
import { enableOrgFeatures } from "./auth/auth";
22+
import { encodeSecret } from "./secrets";
23+
import { getLogInfo } from "./logs/logInfoProvider";
2624
import { init } from "./workflow/diagnostics";
27-
import {
28-
getRepositoryDispatchTypes,
29-
getWorkflowUri,
30-
} from "./workflow/workflow";
25+
import { initConfiguration } from "./configuration/configuration";
26+
import { initPinnedWorkflows } from "./pinnedWorkflows/pinnedWorkflows";
27+
import { initResources } from "./treeViews/icons";
28+
import { initWorkflowDocumentTracking } from "./tracker/workflowDocumentTracker";
29+
import { updateDecorations } from "./logs/formatProvider";
3130

3231
export function activate(context: vscode.ExtensionContext) {
3332
// Prefetch git repository origin url
@@ -97,10 +96,7 @@ export function activate(context: vscode.ExtensionContext) {
9796
vscode.commands.registerCommand(
9897
"github-actions.explorer.triggerRun",
9998
async (args) => {
100-
let event_type: string | undefined;
101-
10299
let workflowUri: vscode.Uri | null = null;
103-
104100
const wf: Workflow = args.wf;
105101
if (wf) {
106102
workflowUri = getWorkflowUri(wf.path);
@@ -112,47 +108,130 @@ export function activate(context: vscode.ExtensionContext) {
112108
return;
113109
}
114110

115-
const event_types = getRepositoryDispatchTypes(workflowUri.fsPath);
116-
if (event_types?.length > 0) {
117-
const custom_type = "✐ Enter custom type";
118-
const selection = await vscode.window.showQuickPick(
119-
[custom_type, ...event_types],
111+
// Parse
112+
const gitHubContext: GitHubContext =
113+
args.gitHubContext || (await getGitHubContext());
114+
const workflow = await parseWorkflow(workflowUri, gitHubContext);
115+
if (!workflow) {
116+
return;
117+
}
118+
119+
let selectedEvent: string | undefined;
120+
if (
121+
workflow.on.workflow_dispatch !== undefined &&
122+
workflow.on.repository_dispatch !== undefined
123+
) {
124+
selectedEvent = await vscode.window.showQuickPick(
125+
["repository_dispatch", "workflow_dispatch"],
120126
{
121-
placeHolder: "Select an event_type to dispatch",
127+
placeHolder: "Which event to trigger?",
122128
}
123129
);
124-
125-
if (selection === undefined) {
130+
if (!selectedEvent) {
126131
return;
127-
} else if (selection != custom_type) {
128-
event_type = selection;
129132
}
130133
}
131134

132-
if (event_type === undefined) {
133-
event_type = await vscode.window.showInputBox({
134-
prompt: "Enter `event_type` to dispatch to the repository",
135-
value: "default",
135+
if (
136+
(!selectedEvent || selectedEvent === "workflow_dispatch") &&
137+
workflow.on.workflow_dispatch !== undefined
138+
) {
139+
const ref = await vscode.window.showInputBox({
140+
prompt: "Enter ref to trigger workflow on",
141+
value: (await getGitHead()) || gitHubContext.defaultBranch,
136142
});
137-
}
138143

139-
if (event_type) {
140-
const gitHubContext: GitHubContext =
141-
args.gitHubContext || (await getGitHubContext());
142-
await gitHubContext.client.repos.createDispatchEvent({
143-
owner: gitHubContext.owner,
144-
repo: gitHubContext.name,
145-
event_type,
146-
client_payload: {},
147-
});
144+
if (ref) {
145+
// Inputs
146+
let inputs: { [key: string]: string } | undefined;
147+
const definedInputs = workflow.on.workflow_dispatch.inputs;
148+
if (definedInputs) {
149+
inputs = {};
150+
151+
for (const definedInput of Object.keys(definedInputs)) {
152+
const value = await vscode.window.showInputBox({
153+
prompt: `Value for input ${definedInput} ${
154+
definedInputs[definedInput].required ? "[required]" : ""
155+
}`,
156+
value: definedInputs[definedInput].default,
157+
});
158+
if (!value && definedInputs[definedInput].required) {
159+
vscode.window.showErrorMessage(
160+
`Input ${definedInput} is required`
161+
);
162+
return;
163+
}
164+
165+
if (value) {
166+
inputs[definedInput] = value;
167+
}
168+
}
169+
}
148170

149-
vscode.window.setStatusBarMessage(
150-
`GitHub Actions: Repository event '${event_type}' dispatched`,
151-
2000
152-
);
171+
try {
172+
await gitHubContext.client.actions.createWorkflowDispatch({
173+
owner: gitHubContext.owner,
174+
repo: gitHubContext.name,
175+
workflow_id: wf.id,
176+
ref,
177+
inputs,
178+
});
179+
180+
vscode.window.setStatusBarMessage(
181+
`GitHub Actions: Workflow event dispatched`,
182+
2000
183+
);
184+
} catch (error) {
185+
vscode.window.showErrorMessage(
186+
`Could not create workflow dispatch: ${error.message}`
187+
);
188+
}
189+
}
190+
} else if (
191+
(!selectedEvent || selectedEvent === "repository_dispatch") &&
192+
workflow.on.repository_dispatch !== undefined
193+
) {
194+
let event_type: string | undefined;
195+
const event_types = workflow.on.repository_dispatch.types;
196+
if (Array.isArray(event_types) && event_types?.length > 0) {
197+
const custom_type = "✐ Enter custom type";
198+
const selection = await vscode.window.showQuickPick(
199+
[custom_type, ...event_types],
200+
{
201+
placeHolder: "Select an event_type to dispatch",
202+
}
203+
);
204+
205+
if (selection === undefined) {
206+
return;
207+
} else if (selection != custom_type) {
208+
event_type = selection;
209+
}
210+
}
153211

154-
workflowTreeProvider.refresh();
212+
if (event_type === undefined) {
213+
event_type = await vscode.window.showInputBox({
214+
prompt: "Enter `event_type` to dispatch to the repository",
215+
value: "default",
216+
});
217+
}
218+
219+
if (event_type) {
220+
await gitHubContext.client.repos.createDispatchEvent({
221+
owner: gitHubContext.owner,
222+
repo: gitHubContext.name,
223+
event_type,
224+
client_payload: {},
225+
});
226+
227+
vscode.window.setStatusBarMessage(
228+
`GitHub Actions: Repository event '${event_type}' dispatched`,
229+
2000
230+
);
231+
}
155232
}
233+
234+
workflowTreeProvider.refresh();
156235
}
157236
)
158237
);

0 commit comments

Comments
 (0)