Skip to content

Commit 8f13582

Browse files
authored
Merge pull request #104 from github/joshmgross/env-secrets
Support creating and modifying environment secrets
2 parents 80ad2e8 + 6d81685 commit 8f13582

6 files changed

Lines changed: 82 additions & 52 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,11 @@
323323
{
324324
"command": "github-actions.settings.secret.add",
325325
"group": "inline",
326-
"when": "viewItem == 'secrets'"
326+
"when": "viewItem == 'secrets' || viewItem == 'environment-secrets'"
327327
},
328328
{
329329
"command": "github-actions.settings.secret.update",
330-
"when": "viewItem == 'repo-secret'",
330+
"when": "viewItem == 'repo-secret' || viewItem == 'env-secret'",
331331
"group": "inline@1"
332332
},
333333
{
@@ -337,7 +337,7 @@
337337
},
338338
{
339339
"command": "github-actions.settings.secret.delete",
340-
"when": "viewItem == 'repo-secret'",
340+
"when": "viewItem == 'repo-secret' || viewItem == 'env-secret' ",
341341
"group": "inline@2"
342342
},
343343
{

src/commands/secrets/addSecret.ts

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import * as vscode from "vscode";
2-
import {GitHubRepoContext} from "../../git/repository";
32
import {encodeSecret} from "../../secrets";
3+
import {EnvironmentSecretsCommandArgs} from "../../treeViews/settings/environmentSecretsNode";
4+
import {RepoSecretsCommandArgs} from "../../treeViews/settings/repoSecretsNode";
5+
import {GitHubRepoContext} from "../../git/repository";
46

5-
interface AddSecretCommandArgs {
6-
gitHubRepoContext: GitHubRepoContext;
7-
}
7+
type AddSecretCommandArgs = RepoSecretsCommandArgs | EnvironmentSecretsCommandArgs;
88

99
export function registerAddSecret(context: vscode.ExtensionContext) {
1010
context.subscriptions.push(
1111
vscode.commands.registerCommand("github-actions.settings.secret.add", async (args: AddSecretCommandArgs) => {
12-
const gitHubContext = args.gitHubRepoContext;
12+
const {gitHubRepoContext} = args;
1313

1414
const name = await vscode.window.showInputBox({
1515
prompt: "Enter name for new secret"
@@ -23,29 +23,56 @@ export function registerAddSecret(context: vscode.ExtensionContext) {
2323
prompt: "Enter the new secret value"
2424
});
2525

26-
if (value) {
27-
try {
28-
const keyResponse = await gitHubContext.client.actions.getRepoPublicKey({
29-
owner: gitHubContext.owner,
30-
repo: gitHubContext.name
31-
});
32-
33-
const key_id = keyResponse.data.key_id;
34-
const key = keyResponse.data.key;
35-
36-
await gitHubContext.client.actions.createOrUpdateRepoSecret({
37-
owner: gitHubContext.owner,
38-
repo: gitHubContext.name,
39-
secret_name: name,
40-
key_id: key_id,
41-
encrypted_value: await encodeSecret(key, value)
42-
});
43-
} catch (e) {
44-
await vscode.window.showErrorMessage((e as Error).message);
26+
if (!value) {
27+
return;
28+
}
29+
30+
try {
31+
if ("environment" in args) {
32+
await createOrUpdateEnvSecret(gitHubRepoContext, args.environment.name, name, value);
33+
} else {
34+
await createOrUpdateRepoSecret(gitHubRepoContext, name, value);
4535
}
36+
} catch (e) {
37+
await vscode.window.showErrorMessage((e as Error).message);
4638
}
4739

4840
await vscode.commands.executeCommand("github-actions.explorer.refresh");
4941
})
5042
);
5143
}
44+
45+
export async function createOrUpdateRepoSecret(context: GitHubRepoContext, name: string, value: string) {
46+
const keyResponse = await context.client.actions.getRepoPublicKey({
47+
owner: context.owner,
48+
repo: context.name
49+
});
50+
51+
await context.client.actions.createOrUpdateRepoSecret({
52+
owner: context.owner,
53+
repo: context.name,
54+
secret_name: name,
55+
key_id: keyResponse.data.key_id,
56+
encrypted_value: await encodeSecret(keyResponse.data.key, value)
57+
});
58+
}
59+
60+
export async function createOrUpdateEnvSecret(
61+
context: GitHubRepoContext,
62+
environment: string,
63+
name: string,
64+
value: string
65+
) {
66+
const keyResponse = await context.client.actions.getEnvironmentPublicKey({
67+
repository_id: context.id,
68+
environment_name: environment
69+
});
70+
71+
await context.client.actions.createOrUpdateEnvironmentSecret({
72+
repository_id: context.id,
73+
environment_name: environment,
74+
secret_name: name,
75+
key_id: keyResponse.data.key_id,
76+
encrypted_value: await encodeSecret(keyResponse.data.key, value)
77+
});
78+
}

src/commands/secrets/deleteSecret.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import {SecretCommandArgs} from "../../treeViews/settings/secretNode";
44
export function registerDeleteSecret(context: vscode.ExtensionContext) {
55
context.subscriptions.push(
66
vscode.commands.registerCommand("github-actions.settings.secret.delete", async (args: SecretCommandArgs) => {
7-
const gitHubContext = args.gitHubRepoContext;
8-
const secret = args.secret;
7+
const {gitHubRepoContext, secret, environment} = args;
8+
99
const acceptText = "Yes, delete this secret";
1010
try {
1111
await vscode.window
@@ -16,11 +16,19 @@ export function registerDeleteSecret(context: vscode.ExtensionContext) {
1616
)
1717
.then(async answer => {
1818
if (answer === acceptText) {
19-
await gitHubContext.client.actions.deleteRepoSecret({
20-
owner: gitHubContext.owner,
21-
repo: gitHubContext.name,
22-
secret_name: secret.name
23-
});
19+
if (environment) {
20+
await gitHubRepoContext.client.actions.deleteEnvironmentSecret({
21+
repository_id: gitHubRepoContext.id,
22+
environment_name: environment.name,
23+
secret_name: secret.name
24+
});
25+
} else {
26+
await gitHubRepoContext.client.actions.deleteRepoSecret({
27+
owner: gitHubRepoContext.owner,
28+
repo: gitHubRepoContext.name,
29+
secret_name: secret.name
30+
});
31+
}
2432
}
2533
});
2634
} catch (e) {

src/commands/secrets/updateSecret.ts

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import * as vscode from "vscode";
2-
import {encodeSecret} from "../../secrets";
32
import {SecretCommandArgs} from "../../treeViews/settings/secretNode";
3+
import {createOrUpdateEnvSecret, createOrUpdateRepoSecret} from "./addSecret";
44

55
export function registerUpdateSecret(context: vscode.ExtensionContext) {
66
context.subscriptions.push(
77
vscode.commands.registerCommand("github-actions.settings.secret.update", async (args: SecretCommandArgs) => {
8-
const gitHubContext = args.gitHubRepoContext;
9-
const secret = args.secret;
8+
const {gitHubRepoContext, secret, environment} = args;
109

1110
const value = await vscode.window.showInputBox({
1211
prompt: "Enter the new secret value"
@@ -17,21 +16,11 @@ export function registerUpdateSecret(context: vscode.ExtensionContext) {
1716
}
1817

1918
try {
20-
const keyResponse = await gitHubContext.client.actions.getRepoPublicKey({
21-
owner: gitHubContext.owner,
22-
repo: gitHubContext.name
23-
});
24-
25-
const key_id = keyResponse.data.key_id;
26-
const key = keyResponse.data.key;
27-
28-
await gitHubContext.client.actions.createOrUpdateRepoSecret({
29-
owner: gitHubContext.owner,
30-
repo: gitHubContext.name,
31-
secret_name: secret.name,
32-
key_id: key_id,
33-
encrypted_value: await encodeSecret(key, value)
34-
});
19+
if (environment) {
20+
await createOrUpdateEnvSecret(gitHubRepoContext, environment.name, secret.name, value);
21+
} else {
22+
await createOrUpdateRepoSecret(gitHubRepoContext, secret.name, value);
23+
}
3524
} catch (e) {
3625
await vscode.window.showErrorMessage((e as Error).message);
3726
}

src/treeViews/settings/environmentSecretsNode.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@ import {Environment} from "../../model";
44
import {EmptyNode} from "./emptyNode";
55
import {SecretNode} from "./secretNode";
66

7+
export type EnvironmentSecretsCommandArgs = Pick<EnvironmentSecretsNode, "gitHubRepoContext" | "environment">;
8+
79
export class EnvironmentSecretsNode extends vscode.TreeItem {
810
constructor(public readonly gitHubRepoContext: GitHubRepoContext, public readonly environment: Environment) {
911
super("Secrets", vscode.TreeItemCollapsibleState.Collapsed);
1012

1113
this.iconPath = new vscode.ThemeIcon("lock");
14+
15+
this.contextValue = "environment-secrets";
1216
}
1317

1418
async getSecrets(): Promise<(SecretNode | EmptyNode)[]> {

src/treeViews/settings/repoSecretsNode.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import {GitHubRepoContext} from "../../git/repository";
33
import {EmptyNode} from "./emptyNode";
44
import {SecretNode} from "./secretNode";
55

6+
export type RepoSecretsCommandArgs = Pick<RepoSecretsNode, "gitHubRepoContext">;
7+
68
export class RepoSecretsNode extends vscode.TreeItem {
79
constructor(public readonly gitHubRepoContext: GitHubRepoContext) {
810
super("Repository Secrets", vscode.TreeItemCollapsibleState.Collapsed);

0 commit comments

Comments
 (0)