-
Notifications
You must be signed in to change notification settings - Fork 88
Expand file tree
/
Copy pathmain.ts
More file actions
113 lines (95 loc) · 3.18 KB
/
Copy pathmain.ts
File metadata and controls
113 lines (95 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import { resolve } from 'path';
import * as core from '@actions/core';
import {
ConfigMap,
LocalProgramArgs,
LocalWorkspace,
LocalWorkspaceOptions,
} from '@pulumi/pulumi/automation';
import invariant from 'ts-invariant';
import YAML from 'yaml';
import { Commands, makeConfig } from './config';
import { environmentVariables } from './libs/envs';
import { handlePullRequestMessage } from './libs/pr';
import * as pulumiCli from './libs/pulumi-cli';
import { login } from './login';
const main = async () => {
const config = await makeConfig();
core.debug('Configuration is loaded');
await pulumiCli.downloadCli(config.options.pulumiVersion);
await login(config.cloudUrl, environmentVariables.PULUMI_ACCESS_TOKEN);
const workDir = resolve(
environmentVariables.GITHUB_WORKSPACE,
config.workDir,
);
core.debug(`Working directory resolved at ${workDir}`);
const stackArgs: LocalProgramArgs = {
stackName: config.stackName,
workDir: workDir,
};
const stackOpts: LocalWorkspaceOptions = {};
if (config.secretsProvider != '') {
stackOpts.secretsProvider = config.secretsProvider;
}
const stack = await (config.upsert
? LocalWorkspace.createOrSelectStack(stackArgs, stackOpts)
: LocalWorkspace.selectStack(stackArgs, stackOpts));
const onOutput = (msg: string) => {
core.debug(msg);
core.info(msg);
};
if (config.configMap != '') {
const configMap: ConfigMap = YAML.parse(config.configMap);
await stack.setAllConfig(configMap);
}
if (config.refresh) {
core.startGroup(`Refresh stack on ${config.stackName}`);
await stack.refresh({ onOutput });
core.endGroup();
}
core.startGroup(`pulumi ${config.command} on ${config.stackName}`);
const actions: Record<Commands, () => Promise<string>> = {
up: () => stack.up({ onOutput, ...config.options }).then((r) => r.stdout),
update: () =>
stack.up({ onOutput, ...config.options }).then((r) => r.stdout),
refresh: () =>
stack.refresh({ onOutput, ...config.options }).then((r) => r.stdout),
destroy: () =>
stack.destroy({ onOutput, ...config.options }).then((r) => r.stdout),
cancel: async () => { await stack.cancel(); return "" },
preview: async () => {
const { stdout, stderr } = await stack.preview(config.options);
onOutput(stdout);
onOutput(stderr);
return stdout;
},
};
core.debug(`Running action ${config.command}`);
const output = await actions[config.command]();
core.debug(`Done running action ${config.command}`);
core.setOutput('output', output);
const outputs = await stack.outputs();
for (const [outKey, outExport] of Object.entries(outputs)) {
core.setOutput(outKey, outExport.value);
if (outExport.secret) {
core.setSecret(outExport.value);
}
}
if (config.commentOnPr && config.isPullRequest) {
core.debug(`Commenting on pull request`);
invariant(config.githubToken, 'github-token is missing.');
handlePullRequestMessage(config, output);
}
core.endGroup();
};
(async () => {
try {
await main();
} catch (err) {
if (err.message.stderr) {
core.setFailed(err.message.stderr);
} else {
core.setFailed(err.message);
}
}
})();