contensis-cli 1.0.0-beta.94 → 1.0.0-beta.96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/localisation/en-GB.js +25 -3
- package/dist/localisation/en-GB.js.map +2 -2
- package/dist/mappers/DevInit-to-CIWorkflow.js +325 -83
- package/dist/mappers/DevInit-to-CIWorkflow.js.map +3 -3
- package/dist/models/DevService.d.js.map +1 -1
- package/dist/services/ContensisDevService.js +27 -16
- package/dist/services/ContensisDevService.js.map +2 -2
- package/dist/util/diff.js +10 -2
- package/dist/util/diff.js.map +2 -2
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/localisation/en-GB.ts +27 -3
- package/src/mappers/DevInit-to-CIWorkflow.ts +461 -114
- package/src/models/DevService.d.ts +34 -1
- package/src/models/JsModules.d.ts +1 -0
- package/src/services/ContensisDevService.ts +28 -17
- package/src/util/diff.ts +8 -3
- package/src/version.ts +1 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
3
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
8
|
var __export = (target, all) => {
|
|
7
9
|
for (var name in all)
|
|
@@ -15,113 +17,353 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
15
17
|
}
|
|
16
18
|
return to;
|
|
17
19
|
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
18
24
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
25
|
var DevInit_to_CIWorkflow_exports = {};
|
|
20
26
|
__export(DevInit_to_CIWorkflow_exports, {
|
|
21
27
|
mapCIWorkflowContent: () => mapCIWorkflowContent
|
|
22
28
|
});
|
|
23
29
|
module.exports = __toCommonJS(DevInit_to_CIWorkflow_exports);
|
|
30
|
+
var import_inquirer = __toESM(require("inquirer"));
|
|
24
31
|
var import_jsonpath_plus = require("jsonpath-plus");
|
|
25
32
|
var import_file_provider = require("../providers/file-provider");
|
|
26
33
|
var import_diff = require("../util/diff");
|
|
27
34
|
var import_logger = require("../util/logger");
|
|
28
35
|
var import_os = require("../util/os");
|
|
29
|
-
var
|
|
30
|
-
const mapCIWorkflowContent = (cli
|
|
31
|
-
const workflowFile = (0, import_file_provider.readFile)(git.ciFilePath);
|
|
36
|
+
var import_yaml2 = require("../util/yaml");
|
|
37
|
+
const mapCIWorkflowContent = async (cli) => {
|
|
38
|
+
const workflowFile = (0, import_file_provider.readFile)(cli.git.ciFilePath);
|
|
32
39
|
if (!workflowFile)
|
|
33
40
|
return void 0;
|
|
34
|
-
const blockId = git.name;
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const workflowDoc = (0, import_yaml.parseYamlDocument)(workflowFile);
|
|
49
|
-
const workflow = workflowDoc.toJS();
|
|
50
|
-
const setWorkflowElement = (path, value) => {
|
|
51
|
-
const findPath = typeof path === "string" && path.includes(".") ? path.split(".").map((p) => Number(p) || Number(p) !== 0 ? p : Number(p)) : path;
|
|
52
|
-
if (workflowDoc.hasIn(findPath)) {
|
|
53
|
-
workflowDoc.setIn(findPath, value);
|
|
54
|
-
} else {
|
|
55
|
-
workflowDoc.addIn(findPath, value);
|
|
56
|
-
}
|
|
41
|
+
const blockId = cli.git.name;
|
|
42
|
+
const workflowDoc = (0, import_yaml2.parseYamlDocument)(workflowFile);
|
|
43
|
+
const workflowJS = workflowDoc.toJS();
|
|
44
|
+
if (cli.git.type === "github") {
|
|
45
|
+
const newWorkflow = await mapGitHubActionCIWorkflowContent(
|
|
46
|
+
cli,
|
|
47
|
+
blockId,
|
|
48
|
+
workflowDoc,
|
|
49
|
+
workflowJS
|
|
50
|
+
);
|
|
51
|
+
return {
|
|
52
|
+
existingWorkflow: workflowFile,
|
|
53
|
+
newWorkflow,
|
|
54
|
+
diff: (0, import_diff.diffFileContent)(workflowFile, newWorkflow)
|
|
57
55
|
};
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
} else if (cli.git.type === "gitlab") {
|
|
57
|
+
const newWorkflow = await mapGitLabCIWorkflowContent(
|
|
58
|
+
cli,
|
|
59
|
+
blockId,
|
|
60
|
+
workflowDoc,
|
|
61
|
+
workflowJS
|
|
62
|
+
);
|
|
63
|
+
return {
|
|
64
|
+
existingWorkflow: workflowFile,
|
|
65
|
+
newWorkflow,
|
|
66
|
+
diff: (0, import_diff.diffFileContent)(workflowFile, newWorkflow)
|
|
66
67
|
};
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const findExistingJobSteps = (path, json, resultType) => {
|
|
71
|
+
const existingJobStep = (0, import_jsonpath_plus.JSONPath)({
|
|
72
|
+
path,
|
|
73
|
+
json,
|
|
74
|
+
resultType
|
|
75
|
+
});
|
|
76
|
+
return existingJobStep;
|
|
77
|
+
};
|
|
78
|
+
const setWorkflowElement = (workflowDoc, path, value) => {
|
|
79
|
+
const findPath = typeof path === "string" && path.includes(".") ? path.split(".").map((p) => Number(p) || Number(p) !== 0 ? p : Number(p)) : path;
|
|
80
|
+
if (workflowDoc.hasIn(findPath)) {
|
|
81
|
+
workflowDoc.setIn(findPath, value);
|
|
82
|
+
} else {
|
|
83
|
+
workflowDoc.addIn(findPath, value);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
const mapGitLabCIWorkflowContent = async (cli, blockId, workflowDoc, workflowJS) => {
|
|
87
|
+
const addGitLabJobStage = {
|
|
88
|
+
stage: "push-block",
|
|
89
|
+
variables: {
|
|
90
|
+
block_id: blockId,
|
|
91
|
+
alias: cli.currentEnv,
|
|
92
|
+
project_id: cli.currentProject,
|
|
93
|
+
client_id: "$CONTENSIS_CLIENT_ID",
|
|
94
|
+
shared_secret: "$CONTENSIS_SHARED_SECRET"
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
const addAppImageUri = async () => {
|
|
98
|
+
const appImageUri = await determineAppImageUri(
|
|
99
|
+
cli,
|
|
100
|
+
Object.entries(workflowJS.variables || {}),
|
|
101
|
+
"$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME/app:build-$CI_PIPELINE_IID"
|
|
102
|
+
);
|
|
103
|
+
if (appImageUri.addVar)
|
|
80
104
|
setWorkflowElement(
|
|
81
|
-
|
|
82
|
-
|
|
105
|
+
workflowDoc,
|
|
106
|
+
`variables.${appImageUri.var}`,
|
|
107
|
+
appImageUri.uri
|
|
83
108
|
);
|
|
109
|
+
if (appImageUri.var)
|
|
110
|
+
addGitLabJobStage.variables["image_uri"] = `$${appImageUri.var}`;
|
|
111
|
+
};
|
|
112
|
+
const existingJobStep = findExistingJobSteps(
|
|
113
|
+
'$..[?(@property === "stage" && @.match(/^push-block/i))]^',
|
|
114
|
+
workflowJS,
|
|
115
|
+
"all"
|
|
116
|
+
);
|
|
117
|
+
if (existingJobStep.length) {
|
|
118
|
+
const step = existingJobStep[0];
|
|
119
|
+
const stepPath = step.path.replace("$[", "").replaceAll("][", ".").replace("]", "").replaceAll("'", "");
|
|
120
|
+
cli.log.info(
|
|
121
|
+
`Found existing Job step:
|
|
122
|
+
${stepPath}
|
|
123
|
+
stage: ${step.value.stage}
|
|
124
|
+
`
|
|
125
|
+
);
|
|
126
|
+
setWorkflowElement(
|
|
127
|
+
workflowDoc,
|
|
128
|
+
`${stepPath}.variables.alias`,
|
|
129
|
+
cli.currentEnv
|
|
130
|
+
);
|
|
131
|
+
setWorkflowElement(
|
|
132
|
+
workflowDoc,
|
|
133
|
+
`${stepPath}.variables.project_id`,
|
|
134
|
+
cli.currentProject
|
|
135
|
+
);
|
|
136
|
+
setWorkflowElement(workflowDoc, `${stepPath}.variables.block_id`, blockId);
|
|
137
|
+
setWorkflowElement(
|
|
138
|
+
workflowDoc,
|
|
139
|
+
`${stepPath}.variables.client_id`,
|
|
140
|
+
"$CONTENSIS_CLIENT_ID"
|
|
141
|
+
);
|
|
142
|
+
setWorkflowElement(
|
|
143
|
+
workflowDoc,
|
|
144
|
+
`${stepPath}.variables.shared_secret`,
|
|
145
|
+
"$CONTENSIS_SHARED_SECRET"
|
|
146
|
+
);
|
|
147
|
+
} else {
|
|
148
|
+
await addAppImageUri();
|
|
149
|
+
workflowDoc.addIn(["stages"], "push-block");
|
|
150
|
+
workflowDoc.addIn([], {
|
|
151
|
+
key: "push-to-contensis",
|
|
152
|
+
value: addGitLabJobStage
|
|
153
|
+
});
|
|
154
|
+
setWorkflowElement(
|
|
155
|
+
workflowDoc,
|
|
156
|
+
`include`,
|
|
157
|
+
"https://gitlab.zengenti.com/ops/contensis-ci/-/raw/main/push-block.yml"
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
cli.log.debug(`New file content to write
|
|
161
|
+
|
|
162
|
+
${workflowDoc}`);
|
|
163
|
+
const newWorkflow = (0, import_os.normaliseLineEndings)(
|
|
164
|
+
workflowDoc.toString({ lineWidth: 0 })
|
|
165
|
+
);
|
|
166
|
+
return newWorkflow;
|
|
167
|
+
};
|
|
168
|
+
const mapGitHubActionCIWorkflowContent = async (cli, blockId, workflowDoc, workflowJS) => {
|
|
169
|
+
const addGitHubActionJobStep = {
|
|
170
|
+
name: "Push block to Contensis",
|
|
171
|
+
id: "push-block",
|
|
172
|
+
uses: "contensis/block-push@v1",
|
|
173
|
+
with: {
|
|
174
|
+
"block-id": blockId,
|
|
175
|
+
alias: cli.currentEnv,
|
|
176
|
+
"project-id": cli.currentProject,
|
|
177
|
+
"client-id": "${{ secrets.CONTENSIS_CLIENT_ID }}",
|
|
178
|
+
"shared-secret": "${{ secrets.CONTENSIS_SHARED_SECRET }}"
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
const addAppImageUri = async () => {
|
|
182
|
+
const appImageUri = await determineAppImageUri(
|
|
183
|
+
cli,
|
|
184
|
+
Object.entries(workflowJS.env || {}),
|
|
185
|
+
"ghcr.io/${{ github.repository }}/${{ github.ref_name }}/app:build-${{ github.run_number }}"
|
|
186
|
+
);
|
|
187
|
+
if (appImageUri.addVar)
|
|
84
188
|
setWorkflowElement(
|
|
85
|
-
|
|
86
|
-
|
|
189
|
+
workflowDoc,
|
|
190
|
+
`env.${appImageUri.var}`,
|
|
191
|
+
appImageUri.uri
|
|
87
192
|
);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
193
|
+
if (appImageUri.var)
|
|
194
|
+
addGitHubActionJobStep.with["image-uri"] = `\${{ env.${appImageUri.var} }}`;
|
|
195
|
+
};
|
|
196
|
+
const existingJobStep = findExistingJobSteps(
|
|
197
|
+
'$.jobs..steps.*[?(@property === "uses" && @.match(/^contensis\\/block-push/i))]^',
|
|
198
|
+
workflowJS,
|
|
199
|
+
"all"
|
|
200
|
+
);
|
|
201
|
+
if (existingJobStep.length) {
|
|
202
|
+
const step = existingJobStep[0];
|
|
203
|
+
const stepPath = step.path.replace("$[", "").replaceAll("][", ".").replace("]", "").replaceAll("'", "");
|
|
204
|
+
cli.log.info(
|
|
205
|
+
`Found existing Job step: ${stepPath}
|
|
206
|
+
- name: ${step.value.name}
|
|
207
|
+
id: ${step.value.id}
|
|
208
|
+
`
|
|
209
|
+
);
|
|
210
|
+
setWorkflowElement(workflowDoc, `${stepPath}.with.alias`, cli.currentEnv);
|
|
211
|
+
setWorkflowElement(
|
|
212
|
+
workflowDoc,
|
|
213
|
+
`${stepPath}.with.project-id`,
|
|
214
|
+
cli.currentProject
|
|
215
|
+
);
|
|
216
|
+
setWorkflowElement(workflowDoc, `${stepPath}.with.block-id`, blockId);
|
|
217
|
+
setWorkflowElement(
|
|
218
|
+
workflowDoc,
|
|
219
|
+
`${stepPath}.with.client-id`,
|
|
220
|
+
"${{ secrets.CONTENSIS_CLIENT_ID }}"
|
|
221
|
+
);
|
|
222
|
+
setWorkflowElement(
|
|
223
|
+
workflowDoc,
|
|
224
|
+
`${stepPath}.with.shared-secret`,
|
|
225
|
+
"${{ secrets.CONTENSIS_SHARED_SECRET }}"
|
|
226
|
+
);
|
|
227
|
+
} else {
|
|
228
|
+
const existingBuildJobStep = findExistingJobSteps(
|
|
229
|
+
"$.jobs[?(@property.match(/build/i))]",
|
|
230
|
+
workflowJS,
|
|
231
|
+
"all"
|
|
232
|
+
);
|
|
233
|
+
let needs;
|
|
234
|
+
if (existingBuildJobStep.length > 1) {
|
|
235
|
+
const choices = existingBuildJobStep.map((s) => s.parentProperty);
|
|
236
|
+
choices.push(new import_inquirer.default.Separator());
|
|
237
|
+
choices.push("none");
|
|
238
|
+
({ needs } = await import_inquirer.default.prompt([
|
|
239
|
+
{
|
|
240
|
+
type: "list",
|
|
241
|
+
prefix: "\u231B",
|
|
242
|
+
message: cli.messages.devinit.ciMultipleBuildJobChoices(),
|
|
243
|
+
name: "needs",
|
|
244
|
+
choices,
|
|
245
|
+
default: choices.find(
|
|
246
|
+
(s) => typeof s === "string" && s.includes("docker")
|
|
247
|
+
)
|
|
248
|
+
}
|
|
249
|
+
]));
|
|
250
|
+
cli.log.raw("");
|
|
251
|
+
} else if (existingBuildJobStep.length === 1)
|
|
252
|
+
needs = existingBuildJobStep[0].parentProperty;
|
|
253
|
+
if (existingBuildJobStep.length === 0 || needs === "none") {
|
|
254
|
+
const choices = Object.keys(workflowJS.jobs);
|
|
255
|
+
choices.push(new import_inquirer.default.Separator());
|
|
256
|
+
choices.push("none");
|
|
257
|
+
({ needs } = await import_inquirer.default.prompt([
|
|
258
|
+
{
|
|
259
|
+
type: "list",
|
|
260
|
+
prefix: "\u231B",
|
|
261
|
+
message: cli.messages.devinit.ciMultipleJobChoices(),
|
|
262
|
+
name: "needs",
|
|
263
|
+
choices,
|
|
264
|
+
default: choices.find(
|
|
265
|
+
(j) => typeof j === "string" && j.includes("docker")
|
|
266
|
+
)
|
|
95
267
|
}
|
|
96
|
-
|
|
268
|
+
]));
|
|
269
|
+
if (needs === "none")
|
|
270
|
+
needs = void 0;
|
|
271
|
+
cli.log.raw("");
|
|
97
272
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
273
|
+
await addAppImageUri();
|
|
274
|
+
const newJob = {
|
|
275
|
+
name: "Deploy container image to Contensis",
|
|
276
|
+
"runs-on": "ubuntu-latest",
|
|
277
|
+
needs,
|
|
278
|
+
steps: [addGitHubActionJobStep]
|
|
279
|
+
};
|
|
280
|
+
workflowDoc.addIn(["jobs"], {
|
|
281
|
+
key: "deploy",
|
|
282
|
+
value: newJob
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
const workflowIsValid = (0, import_yaml2.validateWorkflowYaml)(workflowDoc.toString());
|
|
286
|
+
if (workflowIsValid === true) {
|
|
287
|
+
cli.log.success(`GitHub workflow YAML is valid`);
|
|
288
|
+
cli.log.debug(`New file content to write
|
|
102
289
|
|
|
103
|
-
${workflowDoc}`
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
`GitHub workflow YAML did not pass validation check`
|
|
114
|
-
);
|
|
115
|
-
}
|
|
116
|
-
const newWorkflow = (0, import_os.normaliseLineEndings)(
|
|
117
|
-
workflowDoc.toString({ lineWidth: 0 })
|
|
290
|
+
${workflowDoc}`);
|
|
291
|
+
} else if (Array.isArray(workflowIsValid)) {
|
|
292
|
+
(0, import_logger.logError)(
|
|
293
|
+
[
|
|
294
|
+
...workflowIsValid.map(
|
|
295
|
+
(res) => new Error(`${res.code}: ${res.detail || res.title}`)
|
|
296
|
+
),
|
|
297
|
+
workflowDoc.toString()
|
|
298
|
+
],
|
|
299
|
+
`GitHub workflow YAML did not pass validation check`
|
|
118
300
|
);
|
|
119
|
-
return {
|
|
120
|
-
existingWorkflow: workflowFile,
|
|
121
|
-
newWorkflow,
|
|
122
|
-
diff: (0, import_diff.diffFileContent)(workflowFile, newWorkflow)
|
|
123
|
-
};
|
|
124
301
|
}
|
|
302
|
+
const newWorkflow = (0, import_os.normaliseLineEndings)(
|
|
303
|
+
workflowDoc.toString({ lineWidth: 0 })
|
|
304
|
+
);
|
|
305
|
+
return newWorkflow;
|
|
306
|
+
};
|
|
307
|
+
const determineAppImageUri = async (cli, vars, defaultUri) => {
|
|
308
|
+
const imageVars = vars.filter(
|
|
309
|
+
([varname]) => varname.toLowerCase().includes("image")
|
|
310
|
+
);
|
|
311
|
+
const appImageVars = imageVars.filter(
|
|
312
|
+
([varname, value]) => !varname.toLowerCase().includes("builder_") && (varname.toLowerCase().includes("app_") || varname.toLowerCase().includes("build_") || (value == null ? void 0 : value.toLowerCase().includes("/app")))
|
|
313
|
+
);
|
|
314
|
+
const appImageUriGuess = appImageVars == null ? void 0 : appImageVars[0];
|
|
315
|
+
let appImageUri;
|
|
316
|
+
let appImageVar;
|
|
317
|
+
if (appImageUriGuess) {
|
|
318
|
+
cli.log.success(
|
|
319
|
+
`Found variable ${cli.log.standardText(
|
|
320
|
+
appImageUriGuess[0]
|
|
321
|
+
)} we'll use for pulling the block image from: ${cli.log.infoText(
|
|
322
|
+
appImageUriGuess[1]
|
|
323
|
+
)}`
|
|
324
|
+
);
|
|
325
|
+
appImageVar = appImageUriGuess[0];
|
|
326
|
+
} else {
|
|
327
|
+
const choices = vars.map((v) => v[0]);
|
|
328
|
+
const enterOwnMsg = "enter my own / use default";
|
|
329
|
+
choices.push(new import_inquirer.default.Separator());
|
|
330
|
+
choices.push(enterOwnMsg);
|
|
331
|
+
choices.push(defaultUri);
|
|
332
|
+
({ appImageVar, appImageUri } = await import_inquirer.default.prompt([
|
|
333
|
+
{
|
|
334
|
+
type: "list",
|
|
335
|
+
prefix: "\u{1F433}",
|
|
336
|
+
message: cli.messages.devinit.ciMultipleAppImageVarChoices(),
|
|
337
|
+
name: "appImageVar",
|
|
338
|
+
choices,
|
|
339
|
+
default: choices.find(
|
|
340
|
+
(v) => typeof v === "string" && v.toLowerCase().includes("image")
|
|
341
|
+
)
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
type: "input",
|
|
345
|
+
when(answers) {
|
|
346
|
+
return [enterOwnMsg, defaultUri].includes(answers.appImageVar);
|
|
347
|
+
},
|
|
348
|
+
prefix: `
|
|
349
|
+
|
|
350
|
+
\u{1F517}`,
|
|
351
|
+
message: cli.messages.devinit.ciEnterOwnAppImagePrompt(cli.git),
|
|
352
|
+
name: "appImageUri",
|
|
353
|
+
default: defaultUri
|
|
354
|
+
}
|
|
355
|
+
]));
|
|
356
|
+
cli.log.raw("");
|
|
357
|
+
if ([enterOwnMsg, defaultUri].includes(appImageVar || ""))
|
|
358
|
+
appImageVar = void 0;
|
|
359
|
+
}
|
|
360
|
+
if (appImageVar)
|
|
361
|
+
appImageUri = cli.git.type === "github" ? `\${{ env.${appImageVar} }}` : `$${appImageVar}`;
|
|
362
|
+
return {
|
|
363
|
+
addVar: !appImageVar,
|
|
364
|
+
uri: appImageUri,
|
|
365
|
+
var: appImageVar || "BUILD_IMAGE"
|
|
366
|
+
};
|
|
125
367
|
};
|
|
126
368
|
// Annotate the CommonJS export names for ESM import in node:
|
|
127
369
|
0 && (module.exports = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/mappers/DevInit-to-CIWorkflow.ts"],
|
|
4
|
-
"sourcesContent": ["import { JSONPath, JSONPathOptions } from 'jsonpath-plus';\nimport { readFile } from '~/providers/file-provider';\nimport ContensisDev from '~/services/ContensisDevService';\nimport { diffFileContent } from '~/util/diff';\nimport { GitHelper } from '~/util/git';\nimport { logError } from '~/util/logger';\nimport { normaliseLineEndings } from '~/util/os';\nimport { parseYamlDocument, validateWorkflowYaml } from '~/util/yaml';\n\ntype MappedWorkflowOutput = {\n existingWorkflow: string;\n newWorkflow: string;\n diff: string;\n};\n\nexport const mapCIWorkflowContent = (\n cli: ContensisDev,\n git: GitHelper\n): MappedWorkflowOutput | undefined => {\n // get existing workflow file\n const workflowFile = readFile(git.ciFilePath);\n if (!workflowFile) return undefined;\n\n const blockId = git.name;\n if (git.type === 'github') {\n const addGitHubActionJobStep = {\n name: 'Push block to Contensis',\n id: 'push-block',\n uses: 'contensis/block-push@v1',\n with: {\n 'block-id': blockId,\n // 'image-uri': '${{ steps.build.outputs.image-uri }}',\n alias: cli.currentEnv,\n 'project-id': cli.currentProject,\n 'client-id': '${{ secrets.CONTENSIS_CLIENT_ID }}',\n 'shared-secret': '${{ secrets.CONTENSIS_SHARED_SECRET }}',\n },\n };\n\n // parse yaml to js\n const workflowDoc = parseYamlDocument(workflowFile);\n const workflow = workflowDoc.toJS();\n const setWorkflowElement = (path: string | any[], value: any) => {\n const findPath =\n typeof path === 'string' && path.includes('.')\n ? path\n .split('.')\n .map(p => (Number(p) || Number(p) !== 0 ? p : Number(p)))\n : path;\n\n if (workflowDoc.hasIn(findPath)) {\n workflowDoc.setIn(findPath, value);\n } else {\n workflowDoc.addIn(findPath, value);\n // }\n }\n };\n const findExistingJobSteps = (\n resultType: JSONPathOptions['resultType']\n ) => {\n // look for line in job\n // jobs.x.steps[uses: contensis/block-push]\n const path =\n git.type === 'github'\n ? '$.jobs..steps.*[?(@property === \"uses\" && @.match(/^contensis\\\\/block-push/i))]^'\n : // TODO: add jsonpath for gitlab file\n '';\n\n const existingJobStep = JSONPath({\n path,\n json: workflow,\n resultType: resultType,\n });\n\n return existingJobStep;\n };\n\n const existingJobStep = findExistingJobSteps('all');\n\n // update job step\n if (existingJobStep.length) {\n //cli.log.json(existingJobStep);\n\n // The [0] index means we're only looking at updating the first instance in the file\n const step = existingJobStep[0];\n\n // Path looks like this \"$['jobs']['build']['steps'][3]\"\n // We want it to look like this \"jobs.build.steps.3\"\n const stepPath = step.path\n .replace('$[', '')\n .replaceAll('][', '.')\n .replace(']', '')\n .replaceAll(\"'\", '');\n\n cli.log.info(\n `Found existing Job step: ${stepPath}\n - name: ${step.value.name}\n id: ${step.value.id}\\n`\n );\n\n setWorkflowElement(`${stepPath}.with.alias`, cli.currentEnv);\n setWorkflowElement(`${stepPath}.with.project-id`, cli.currentProject);\n setWorkflowElement(`${stepPath}.with.block-id`, blockId);\n setWorkflowElement(\n `${stepPath}.with.client-id`,\n '${{ secrets.CONTENSIS_CLIENT_ID }}'\n );\n setWorkflowElement(\n `${stepPath}.with.shared-secret`,\n '${{ secrets.CONTENSIS_SHARED_SECRET }}'\n );\n } else {\n // create job with push step\n workflowDoc.addIn(['jobs'], {\n key: 'deploy',\n value: {\n name: 'Push image to Contensis',\n 'runs-on': 'ubuntu-latest',\n steps: [addGitHubActionJobStep],\n },\n });\n }\n\n // Workflow validation provided by @action-validator/core package\n const workflowIsValid = validateWorkflowYaml(workflowDoc.toString());\n\n if (workflowIsValid === true) {\n cli.log.debug(\n `New file content to write to ${git.ciFilePath}\\n\\n${workflowDoc}`\n );\n } else if (Array.isArray(workflowIsValid)) {\n // Errors\n logError(\n [\n ...workflowIsValid.map(\n res => new Error(`${res.code}: ${res.detail || res.title}`)\n ),\n workflowDoc.toString(),\n ],\n `GitHub workflow YAML did not pass validation check`\n );\n }\n const newWorkflow = normaliseLineEndings(\n workflowDoc.toString({ lineWidth: 0 })\n );\n\n return {\n existingWorkflow: workflowFile,\n newWorkflow,\n diff: diffFileContent(workflowFile, newWorkflow),\n };\n }\n};\n"],
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["
|
|
4
|
+
"sourcesContent": ["import inquirer from 'inquirer';\nimport { JSONPath, JSONPathOptions } from 'jsonpath-plus';\nimport { Document } from 'yaml';\nimport {\n GitHubActionPushBlockJob,\n GitHubActionPushBlockJobStep,\n GitLabPushBlockJobStage,\n} from '~/models/DevService';\nimport { readFile } from '~/providers/file-provider';\nimport ContensisDev from '~/services/ContensisDevService';\nimport { diffFileContent } from '~/util/diff';\nimport { logError } from '~/util/logger';\nimport { normaliseLineEndings } from '~/util/os';\nimport { parseYamlDocument, validateWorkflowYaml } from '~/util/yaml';\n\ntype MappedWorkflowOutput = {\n existingWorkflow: string;\n newWorkflow: string;\n diff: string;\n};\n\nexport const mapCIWorkflowContent = async (\n cli: ContensisDev\n): Promise<MappedWorkflowOutput | undefined> => {\n // get existing workflow file\n const workflowFile = readFile(cli.git.ciFilePath);\n if (!workflowFile) return undefined;\n\n const blockId = cli.git.name;\n\n // parse yaml to js\n const workflowDoc = parseYamlDocument(workflowFile);\n const workflowJS = workflowDoc.toJS();\n\n if (cli.git.type === 'github') {\n const newWorkflow = await mapGitHubActionCIWorkflowContent(\n cli,\n blockId,\n workflowDoc,\n workflowJS\n );\n return {\n existingWorkflow: workflowFile,\n newWorkflow,\n diff: diffFileContent(workflowFile, newWorkflow),\n };\n } else if (cli.git.type === 'gitlab') {\n const newWorkflow = await mapGitLabCIWorkflowContent(\n cli,\n blockId,\n workflowDoc,\n workflowJS\n );\n return {\n existingWorkflow: workflowFile,\n newWorkflow,\n diff: diffFileContent(workflowFile, newWorkflow),\n };\n }\n};\n\nconst findExistingJobSteps = (\n path: string,\n json: any,\n resultType: JSONPathOptions['resultType']\n) => {\n const existingJobStep = JSONPath({\n path,\n json,\n resultType: resultType,\n });\n\n return existingJobStep;\n};\n\nconst setWorkflowElement = (\n workflowDoc: Document,\n path: string | any[],\n value: any\n) => {\n const findPath =\n typeof path === 'string' && path.includes('.')\n ? path.split('.').map(p => (Number(p) || Number(p) !== 0 ? p : Number(p)))\n : path;\n\n if (workflowDoc.hasIn(findPath)) {\n workflowDoc.setIn(findPath, value);\n } else {\n workflowDoc.addIn(findPath, value);\n }\n};\n\nconst mapGitLabCIWorkflowContent = async (\n cli: ContensisDev,\n blockId: string,\n workflowDoc: Document,\n workflowJS: any\n) => {\n const addGitLabJobStage: GitLabPushBlockJobStage = {\n stage: 'push-block',\n variables: {\n block_id: blockId,\n alias: cli.currentEnv,\n project_id: cli.currentProject,\n client_id: '$CONTENSIS_CLIENT_ID',\n shared_secret: '$CONTENSIS_SHARED_SECRET',\n },\n };\n\n const addAppImageUri = async () => {\n // Look in document level \"variables\"\n const appImageUri = await determineAppImageUri(\n cli,\n Object.entries(workflowJS.variables || {}),\n '$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME/app:build-$CI_PIPELINE_IID'\n );\n\n if (appImageUri.addVar)\n setWorkflowElement(\n workflowDoc,\n `variables.${appImageUri.var}`,\n appImageUri.uri\n );\n\n if (appImageUri.var)\n addGitLabJobStage.variables['image_uri'] = `\\$${appImageUri.var}`;\n };\n\n // look for line in job\n // jobname[stage: push-block]\n const existingJobStep = findExistingJobSteps(\n '$..[?(@property === \"stage\" && @.match(/^push-block/i))]^',\n workflowJS,\n 'all'\n );\n\n // update job step\n if (existingJobStep.length) {\n // cli.log.json(existingJobStep);\n\n // The [0] index means we're only looking at updating the first instance in the file\n const step = existingJobStep[0];\n\n // Path looks like this \"$['job_name']\"\n // We want it to look like this \"job_name\"\n const stepPath = step.path\n .replace('$[', '')\n .replaceAll('][', '.')\n .replace(']', '')\n .replaceAll(\"'\", '');\n\n cli.log.info(\n `Found existing Job step:\n ${stepPath}\n stage: ${step.value.stage}\\n`\n );\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.alias`,\n cli.currentEnv\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.project_id`,\n cli.currentProject\n );\n setWorkflowElement(workflowDoc, `${stepPath}.variables.block_id`, blockId);\n\n // This is likely not needed when updating an existing push-block job step\n // we are assuming this is a forked/copied workflow with an already working image-uri reference\n // await addAppImageUri();\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.client_id`,\n '$CONTENSIS_CLIENT_ID'\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.variables.shared_secret`,\n '$CONTENSIS_SHARED_SECRET'\n );\n } else {\n // create job with push step\n\n // Does a series of checks and prompts to determine the correct image-uri\n // for the app container build\n await addAppImageUri();\n\n // Add the new \"job\" to the Yaml Document\n workflowDoc.addIn(['stages'], 'push-block');\n workflowDoc.addIn([], {\n key: 'push-to-contensis',\n value: addGitLabJobStage,\n });\n setWorkflowElement(\n workflowDoc,\n `include`,\n 'https://gitlab.zengenti.com/ops/contensis-ci/-/raw/main/push-block.yml'\n );\n }\n\n cli.log.debug(`New file content to write\\n\\n${workflowDoc}`);\n\n const newWorkflow = normaliseLineEndings(\n workflowDoc.toString({ lineWidth: 0 })\n );\n\n return newWorkflow;\n};\n\nconst mapGitHubActionCIWorkflowContent = async (\n cli: ContensisDev,\n blockId: string,\n workflowDoc: Document,\n workflowJS: any\n) => {\n const addGitHubActionJobStep: GitHubActionPushBlockJobStep = {\n name: 'Push block to Contensis',\n id: 'push-block',\n uses: 'contensis/block-push@v1',\n with: {\n 'block-id': blockId,\n // 'image-uri': '${{ steps.build.outputs.image-uri }}',\n alias: cli.currentEnv,\n 'project-id': cli.currentProject,\n 'client-id': '${{ secrets.CONTENSIS_CLIENT_ID }}',\n 'shared-secret': '${{ secrets.CONTENSIS_SHARED_SECRET }}',\n },\n };\n\n const addAppImageUri = async () => {\n // Look in document level \"env\" vars\n const appImageUri = await determineAppImageUri(\n cli,\n Object.entries(workflowJS.env || {}),\n 'ghcr.io/${{ github.repository }}/${{ github.ref_name }}/app:build-${{ github.run_number }}'\n );\n\n if (appImageUri.addVar)\n setWorkflowElement(\n workflowDoc,\n `env.${appImageUri.var}`,\n appImageUri.uri\n );\n // workflowDoc.addIn(['env'], { [appImageUri.var]: appImageUri.uri });\n\n if (appImageUri.var)\n addGitHubActionJobStep.with[\n 'image-uri'\n ] = `\\${{ env.${appImageUri.var} }}`;\n };\n\n // look for line in job\n // jobs.x.steps[uses: contensis/block-push]\n const existingJobStep = findExistingJobSteps(\n '$.jobs..steps.*[?(@property === \"uses\" && @.match(/^contensis\\\\/block-push/i))]^',\n workflowJS,\n 'all'\n );\n\n // update job step\n if (existingJobStep.length) {\n //cli.log.json(existingJobStep);\n\n // The [0] index means we're only looking at updating the first instance in the file\n const step = existingJobStep[0];\n\n // Path looks like this \"$['jobs']['build']['steps'][3]\"\n // We want it to look like this \"jobs.build.steps.3\"\n const stepPath = step.path\n .replace('$[', '')\n .replaceAll('][', '.')\n .replace(']', '')\n .replaceAll(\"'\", '');\n\n cli.log.info(\n `Found existing Job step: ${stepPath}\n - name: ${step.value.name}\n id: ${step.value.id}\\n`\n );\n\n setWorkflowElement(workflowDoc, `${stepPath}.with.alias`, cli.currentEnv);\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.project-id`,\n cli.currentProject\n );\n setWorkflowElement(workflowDoc, `${stepPath}.with.block-id`, blockId);\n\n // This is likely not needed when updating an existing push-block job step\n // we are assuming this is a forked/copied workflow with an already working image-uri reference\n // await addAppImageUri();\n\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.client-id`,\n '${{ secrets.CONTENSIS_CLIENT_ID }}'\n );\n setWorkflowElement(\n workflowDoc,\n `${stepPath}.with.shared-secret`,\n '${{ secrets.CONTENSIS_SHARED_SECRET }}'\n );\n } else {\n // create job with push step\n\n // is there already a job with a property name containing \"build\"?\n const existingBuildJobStep = findExistingJobSteps(\n '$.jobs[?(@property.match(/build/i))]',\n workflowJS,\n 'all'\n ) as JSONPathOptions[]; // This isn't the correct type for this object\n\n let needs: string | undefined;\n // There are multiple jobs called *build*\n if (existingBuildJobStep.length > 1) {\n // prompt which build job we should depend on before pushing the block\n const choices = existingBuildJobStep.map(s => s.parentProperty);\n choices.push(new inquirer.Separator() as any);\n choices.push('none');\n\n ({ needs } = await inquirer.prompt([\n {\n type: 'list',\n prefix: '\u231B',\n message: cli.messages.devinit.ciMultipleBuildJobChoices(),\n name: 'needs',\n choices,\n default: choices.find(\n s => typeof s === 'string' && s.includes('docker')\n ),\n },\n ]));\n cli.log.raw('');\n } else if (existingBuildJobStep.length === 1)\n // Exactly one job step found containing a property name of *build*\n // we'll assume that is the one the push-block job depends on\n needs = existingBuildJobStep[0].parentProperty;\n\n if (existingBuildJobStep.length === 0 || needs === 'none') {\n // No existing build step found or chosen, offer all job steps in prompt\n const choices = Object.keys(workflowJS.jobs);\n choices.push(new inquirer.Separator() as any);\n choices.push('none');\n\n ({ needs } = await inquirer.prompt([\n {\n type: 'list',\n prefix: '\u231B',\n message: cli.messages.devinit.ciMultipleJobChoices(),\n name: 'needs',\n choices,\n default: choices.find(\n j => typeof j === 'string' && j.includes('docker')\n ),\n },\n ]));\n if (needs === 'none') needs = undefined;\n cli.log.raw('');\n }\n\n // Does a series of checks and prompts to determine the correct image-uri\n // for the app container build\n await addAppImageUri();\n\n const newJob: GitHubActionPushBlockJob = {\n name: 'Deploy container image to Contensis',\n 'runs-on': 'ubuntu-latest',\n needs,\n steps: [addGitHubActionJobStep],\n };\n\n // Add the new \"job\" to the Yaml Document\n workflowDoc.addIn(['jobs'], {\n key: 'deploy',\n value: newJob,\n });\n }\n\n // Workflow validation provided by @action-validator/core package\n const workflowIsValid = validateWorkflowYaml(workflowDoc.toString());\n\n // We could expand validation to check for having a build step to wait for\n // or if a valid image-uri attribute is set\n if (workflowIsValid === true) {\n cli.log.success(`GitHub workflow YAML is valid`);\n cli.log.debug(`New file content to write\\n\\n${workflowDoc}`);\n } else if (Array.isArray(workflowIsValid)) {\n // Errors\n logError(\n [\n ...workflowIsValid.map(\n res => new Error(`${res.code}: ${res.detail || res.title}`)\n ),\n workflowDoc.toString(),\n ],\n `GitHub workflow YAML did not pass validation check`\n );\n }\n const newWorkflow = normaliseLineEndings(\n workflowDoc.toString({ lineWidth: 0 })\n );\n\n return newWorkflow;\n};\n\nconst determineAppImageUri = async (\n cli: ContensisDev,\n vars: [string, string][],\n defaultUri: string\n) => {\n // Determine container image-uri via variables and/or prompts\n\n // Find vars including the word \"image\"\n const imageVars = vars.filter(([varname]) =>\n varname.toLowerCase().includes('image')\n );\n // Find vars named \"image\" that include the word \"app\"\n const appImageVars = imageVars.filter(\n ([varname, value]) =>\n !varname.toLowerCase().includes('builder_') &&\n (varname.toLowerCase().includes('app_') ||\n varname.toLowerCase().includes('build_') ||\n value?.toLowerCase().includes('/app'))\n );\n\n const appImageUriGuess = appImageVars?.[0];\n\n let appImageUri: string | undefined;\n let appImageVar: string | undefined;\n\n if (appImageUriGuess) {\n cli.log.success(\n `Found variable ${cli.log.standardText(\n appImageUriGuess[0]\n )} we'll use for pulling the block image from: ${cli.log.infoText(\n appImageUriGuess[1]\n )}`\n );\n appImageVar = appImageUriGuess[0];\n } else {\n // Could not find a suitable var to use for block image-uri\n // prompt for an app image uri\n const choices = vars.map(v => v[0]);\n const enterOwnMsg = 'enter my own / use default';\n\n choices.push(new inquirer.Separator() as any);\n choices.push(enterOwnMsg);\n choices.push(defaultUri);\n\n ({ appImageVar, appImageUri } = await inquirer.prompt([\n // First question determines if an existing env variable\n // already containes the tagged app image uri\n {\n type: 'list',\n prefix: '\uD83D\uDC33',\n message: cli.messages.devinit.ciMultipleAppImageVarChoices(),\n name: 'appImageVar',\n choices,\n default: choices.find(\n v => typeof v === 'string' && v.toLowerCase().includes('image')\n ),\n },\n // Subsequent prompt allows input of an image-uri if needed\n {\n type: 'input',\n when(answers) {\n return [enterOwnMsg, defaultUri].includes(answers.appImageVar);\n },\n prefix: `\\n \\n\uD83D\uDD17`,\n message: cli.messages.devinit.ciEnterOwnAppImagePrompt(cli.git),\n name: 'appImageUri',\n default: defaultUri,\n },\n ]));\n cli.log.raw('');\n\n // this indicates a uri has been added and we will add a new var\n // to the workflow to encourage users to update the docker tag part\n // of their build workflow to use the same var as the push-block job/step\n if ([enterOwnMsg, defaultUri].includes(appImageVar || ''))\n appImageVar = undefined;\n }\n\n if (appImageVar)\n appImageUri =\n cli.git.type === 'github'\n ? `\\${{ env.${appImageVar} }}`\n : `\\$${appImageVar}`;\n\n // TODO: prompt further for image tag\n\n return {\n addVar: !appImageVar,\n uri: appImageUri,\n var: appImageVar || 'BUILD_IMAGE',\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_yaml", "inquirer"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/models/DevService.d.ts"],
|
|
4
|
-
"sourcesContent": ["export type EnvContentsToAdd = {\n ALIAS: string;\n PROJECT: string;\n ACCESS_TOKEN?: string;\n}\n"],
|
|
4
|
+
"sourcesContent": ["export type EnvContentsToAdd = {\n ALIAS: string;\n PROJECT: string;\n ACCESS_TOKEN?: string;\n};\n\nexport type GitHubActionPushBlockJobStep = {\n name: string;\n id: 'push-block';\n uses: string;\n with: {\n 'block-id': string;\n alias: string;\n 'project-id': string;\n 'client-id': string;\n 'shared-secret': string;\n 'image-uri'?: string;\n };\n};\n\nexport type GitHubActionPushBlockJob = {\n name: string;\n 'runs-on': string;\n needs?: string;\n steps: GitHubActionPushBlockJobStep[];\n};\n\nexport type GitLabPushBlockJobStage = {\n stage: string;\n variables: {\n alias: string;\n project_id: string;\n block_id: string;\n image_uri?: string;\n client_id: string;\n shared_secret: string;\n };\n};\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -45,6 +45,7 @@ var import_json = require("../util/json.formatter");
|
|
|
45
45
|
var import_os = require("../util/os");
|
|
46
46
|
var import_yaml = require("../util/yaml");
|
|
47
47
|
class ContensisDev extends import_ContensisRoleService.default {
|
|
48
|
+
git;
|
|
48
49
|
constructor(args, outputOpts, contensisOpts = {}) {
|
|
49
50
|
super(args, outputOpts, contensisOpts);
|
|
50
51
|
}
|
|
@@ -62,7 +63,7 @@ class ContensisDev extends import_ContensisRoleService.default {
|
|
|
62
63
|
const apiKeyExists = (findKey) => apiKeys == null ? void 0 : apiKeys.find(
|
|
63
64
|
(k) => k.name.trim().toLowerCase() === (findKey == null ? void 0 : findKey.trim().toLowerCase())
|
|
64
65
|
);
|
|
65
|
-
const git = new import_git.GitHelper(projectHome);
|
|
66
|
+
const git = this.git = new import_git.GitHelper(projectHome);
|
|
66
67
|
const workflowFiles = git.workflows;
|
|
67
68
|
let ciFileName = git.ciFileName;
|
|
68
69
|
const devKeyName = `${git.name} development`;
|
|
@@ -101,6 +102,7 @@ class ContensisDev extends import_ContensisRoleService.default {
|
|
|
101
102
|
({ ciFileName } = await import_inquirer.default.prompt([
|
|
102
103
|
{
|
|
103
104
|
type: "list",
|
|
105
|
+
prefix: "\u29F0",
|
|
104
106
|
message: messages.devinit.ciMultipleChoices(),
|
|
105
107
|
name: "ciFileName",
|
|
106
108
|
choices: workflowFiles,
|
|
@@ -111,7 +113,7 @@ class ContensisDev extends import_ContensisRoleService.default {
|
|
|
111
113
|
git.ciFileName = ciFileName;
|
|
112
114
|
}
|
|
113
115
|
log.raw(log.infoText(messages.devinit.ciDetails(ciFileName)));
|
|
114
|
-
const mappedWorkflow = (0, import_DevInit_to_CIWorkflow.mapCIWorkflowContent)(this
|
|
116
|
+
const mappedWorkflow = await (0, import_DevInit_to_CIWorkflow.mapCIWorkflowContent)(this);
|
|
115
117
|
log.help(messages.devinit.ciIntro(git));
|
|
116
118
|
if (!dryRun) {
|
|
117
119
|
const { confirm } = await import_inquirer.default.prompt([
|
|
@@ -129,6 +131,7 @@ class ContensisDev extends import_ContensisRoleService.default {
|
|
|
129
131
|
const { accessToken } = await import_inquirer.default.prompt([
|
|
130
132
|
{
|
|
131
133
|
type: "input",
|
|
134
|
+
prefix: "\u{1F6E1}\uFE0F",
|
|
132
135
|
message: messages.devinit.accessTokenPrompt(),
|
|
133
136
|
name: "accessToken"
|
|
134
137
|
}
|
|
@@ -199,32 +202,40 @@ class ContensisDev extends import_ContensisRoleService.default {
|
|
|
199
202
|
const envDiff = (0, import_diff.diffFileContent)(existingEnvFile || "", newEnvFileContent);
|
|
200
203
|
if (dryRun) {
|
|
201
204
|
if (envDiff) {
|
|
202
|
-
log.info(`
|
|
205
|
+
log.info(`Updating .env file ${(0, import_os.winSlash)(envFilePath)}:
|
|
206
|
+
${envDiff}`);
|
|
203
207
|
log.raw("");
|
|
204
208
|
}
|
|
205
209
|
checkpoint("skip .env file update (dry-run)");
|
|
206
210
|
} else {
|
|
207
211
|
if (envDiff)
|
|
208
|
-
log.info(`updating .env file ${envFilePath}`);
|
|
212
|
+
log.info(`updating .env file ${(0, import_os.winSlash)(envFilePath)}`);
|
|
209
213
|
(0, import_file_provider.writeFile)(envFilePath, envFileLines.join("\n"));
|
|
210
214
|
checkpoint(".env file updated");
|
|
211
215
|
log.success(messages.devinit.writeEnvFile());
|
|
212
216
|
}
|
|
217
|
+
if (mappedWorkflow == null ? void 0 : mappedWorkflow.diff) {
|
|
218
|
+
log.info(
|
|
219
|
+
`Updating ${(0, import_os.winSlash)(ciFileName)} file:
|
|
220
|
+
${mappedWorkflow.diff}`
|
|
221
|
+
);
|
|
222
|
+
log.raw("");
|
|
223
|
+
}
|
|
213
224
|
if (dryRun) {
|
|
214
|
-
if (mappedWorkflow == null ? void 0 : mappedWorkflow.diff) {
|
|
215
|
-
log.info(`updating${ciFileName} file: ${mappedWorkflow.diff}`);
|
|
216
|
-
log.raw("");
|
|
217
|
-
}
|
|
218
225
|
checkpoint("skip CI file update (dry-run)");
|
|
219
226
|
} else {
|
|
220
|
-
if (mappedWorkflow == null ? void 0 : mappedWorkflow.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
227
|
+
if (mappedWorkflow == null ? void 0 : mappedWorkflow.newWorkflow) {
|
|
228
|
+
if (mappedWorkflow == null ? void 0 : mappedWorkflow.diff) {
|
|
229
|
+
(0, import_file_provider.writeFile)(git.ciFilePath, mappedWorkflow.newWorkflow);
|
|
230
|
+
log.success(messages.devinit.writeCiFile(`./${ciFileName}`));
|
|
231
|
+
log.info(
|
|
232
|
+
messages.devinit.ciBlockTip(blockId, currentEnv, currentProject)
|
|
233
|
+
);
|
|
234
|
+
} else {
|
|
235
|
+
log.info(messages.devinit.ciFileNoChanges(`./${ciFileName}`));
|
|
236
|
+
}
|
|
237
|
+
checkpoint("CI file updated");
|
|
238
|
+
}
|
|
228
239
|
}
|
|
229
240
|
log.warning(messages.devinit.addGitSecretsIntro());
|
|
230
241
|
log.help(
|