@catladder/pipeline 0.0.1

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.
Files changed (80) hide show
  1. package/Dockerfile +84 -0
  2. package/dist/scripts/magic/createChildPipeline/index.d.ts +5 -0
  3. package/dist/scripts/magic/createChildPipeline/index.js +141 -0
  4. package/dist/scripts/magic/createPipeline.d.ts +14 -0
  5. package/dist/scripts/magic/createPipeline.js +80 -0
  6. package/dist/scripts/magic/index.d.ts +2 -0
  7. package/dist/scripts/magic/index.js +16 -0
  8. package/dist/scripts/magic/sample-config.d.ts +3 -0
  9. package/dist/scripts/magic/sample-config.js +77 -0
  10. package/dist/scripts/magic/types/build/docker.d.ts +2 -0
  11. package/dist/scripts/magic/types/build/docker.js +63 -0
  12. package/dist/scripts/magic/types/build/index.d.ts +6 -0
  13. package/dist/scripts/magic/types/build/index.js +8 -0
  14. package/dist/scripts/magic/types/build/node.d.ts +3 -0
  15. package/dist/scripts/magic/types/build/node.js +118 -0
  16. package/dist/scripts/magic/types/build/types.d.ts +7 -0
  17. package/dist/scripts/magic/types/build/types.js +2 -0
  18. package/dist/scripts/magic/types/config.d.ts +49 -0
  19. package/dist/scripts/magic/types/config.js +17 -0
  20. package/dist/scripts/magic/types/context.d.ts +12 -0
  21. package/dist/scripts/magic/types/context.js +2 -0
  22. package/dist/scripts/magic/types/deploy/index.d.ts +6 -0
  23. package/dist/scripts/magic/types/deploy/index.js +8 -0
  24. package/dist/scripts/magic/types/deploy/kubernetes.d.ts +3 -0
  25. package/dist/scripts/magic/types/deploy/kubernetes.js +46 -0
  26. package/dist/scripts/magic/types/deploy/types.d.ts +41 -0
  27. package/dist/scripts/magic/types/deploy/types.js +7 -0
  28. package/dist/scripts/magic/types/gitlab-types.d.ts +63 -0
  29. package/dist/scripts/magic/types/gitlab-types.js +2 -0
  30. package/dist/scripts/magic/types/index.d.ts +3 -0
  31. package/dist/scripts/magic/types/index.js +15 -0
  32. package/dist/scripts/magic.d.ts +2 -0
  33. package/dist/scripts/magic.js +43 -0
  34. package/dist/scripts/monorepoGenerate.d.ts +2 -0
  35. package/dist/scripts/monorepoGenerate.js +164 -0
  36. package/dist/scripts/printAllValues.d.ts +2 -0
  37. package/dist/scripts/printAllValues.js +58 -0
  38. package/dist/scripts/printBuildEnv.d.ts +2 -0
  39. package/dist/scripts/printBuildEnv.js +77 -0
  40. package/dist/scripts/utils/extractAllValues.d.ts +1 -0
  41. package/dist/scripts/utils/extractAllValues.js +78 -0
  42. package/dist/scripts/utils/extractBuildEnv.d.ts +5 -0
  43. package/dist/scripts/utils/extractBuildEnv.js +152 -0
  44. package/dist/scripts/utils/extractValuesFromEnvVars.d.ts +2 -0
  45. package/dist/scripts/utils/extractValuesFromEnvVars.js +63 -0
  46. package/dist/scripts/utils/extractValuesFromMr.d.ts +2 -0
  47. package/dist/scripts/utils/extractValuesFromMr.js +86 -0
  48. package/dist/tests/extractValuesFromMr.test.d.ts +1 -0
  49. package/dist/tests/extractValuesFromMr.test.js +68 -0
  50. package/package.json +21 -0
  51. package/scripts/getCommitInfo +11 -0
  52. package/scripts/kubernetesCreateSecret +8 -0
  53. package/scripts/kubernetesDelete +4 -0
  54. package/scripts/kubernetesDeploy +57 -0
  55. package/scripts/kubernetesEnsureNamespace +3 -0
  56. package/scripts/magic/createChildPipeline/index.ts +163 -0
  57. package/scripts/magic/createPipeline.ts +48 -0
  58. package/scripts/magic/index.ts +2 -0
  59. package/scripts/magic/sample-config.ts +78 -0
  60. package/scripts/magic/types/build/docker.ts +36 -0
  61. package/scripts/magic/types/build/index.ts +11 -0
  62. package/scripts/magic/types/build/node.ts +107 -0
  63. package/scripts/magic/types/build/types.ts +9 -0
  64. package/scripts/magic/types/config.ts +54 -0
  65. package/scripts/magic/types/context.ts +13 -0
  66. package/scripts/magic/types/deploy/index.ts +11 -0
  67. package/scripts/magic/types/deploy/kubernetes.ts +38 -0
  68. package/scripts/magic/types/deploy/types.ts +29 -0
  69. package/scripts/magic/types/gitlab-types.ts +77 -0
  70. package/scripts/magic/types/index.ts +3 -0
  71. package/scripts/magic.ts +51 -0
  72. package/scripts/monorepoGenerate.ts +104 -0
  73. package/scripts/printAllValues.ts +17 -0
  74. package/scripts/printBuildEnv.ts +22 -0
  75. package/scripts/utils/extractAllValues.ts +32 -0
  76. package/scripts/utils/extractBuildEnv.ts +92 -0
  77. package/scripts/utils/extractValuesFromEnvVars.ts +21 -0
  78. package/scripts/utils/extractValuesFromMr.ts +39 -0
  79. package/tests/extractValuesFromMr.test.ts +156 -0
  80. package/tsconfig.json +10 -0
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ exports.__esModule = true;
39
+ exports.extractAllValues = void 0;
40
+ var fs_1 = require("fs");
41
+ var lodash_1 = require("lodash");
42
+ var yaml_1 = require("yaml");
43
+ var extractValuesFromEnvVars_1 = require("./extractValuesFromEnvVars");
44
+ var extractValuesFromMr_1 = require("./extractValuesFromMr");
45
+ var _a = process.env, CI_PROJECT_ID = _a.CI_PROJECT_ID, CI_MERGE_REQUEST_IID = _a.CI_MERGE_REQUEST_IID;
46
+ var readYaml = function (path) {
47
+ try {
48
+ return yaml_1.parse(fs_1.readFileSync(path, { encoding: "utf-8" }));
49
+ }
50
+ catch (e) {
51
+ return {};
52
+ }
53
+ };
54
+ var extractAllValues = function (appDirectory, env) { return __awaiter(void 0, void 0, void 0, function () {
55
+ var valuesFromEnvVars, valuesDefault, valuesEnv, valuesFromMR, _a;
56
+ return __generator(this, function (_b) {
57
+ switch (_b.label) {
58
+ case 0:
59
+ valuesFromEnvVars = extractValuesFromEnvVars_1.extractValuesFromEnvVars();
60
+ valuesDefault = readYaml(appDirectory + "/values.yml");
61
+ valuesEnv = env
62
+ ? readYaml(appDirectory + "/values-" + env + ".yml")
63
+ : {};
64
+ if (!(CI_PROJECT_ID && CI_MERGE_REQUEST_IID)) return [3 /*break*/, 2];
65
+ return [4 /*yield*/, extractValuesFromMr_1.extractValuesFromMr(CI_PROJECT_ID, Number(CI_MERGE_REQUEST_IID))];
66
+ case 1:
67
+ _a = _b.sent();
68
+ return [3 /*break*/, 3];
69
+ case 2:
70
+ _a = {};
71
+ _b.label = 3;
72
+ case 3:
73
+ valuesFromMR = _a;
74
+ return [2 /*return*/, lodash_1.merge({}, valuesFromEnvVars, valuesDefault, valuesEnv, valuesFromMR)];
75
+ }
76
+ });
77
+ }); };
78
+ exports.extractAllValues = extractAllValues;
@@ -0,0 +1,5 @@
1
+ declare type EnvVars = Record<string, string>;
2
+ export declare const extractBuildEnv: (componentName: string, env: string | null, visitedReferencedApps?: {
3
+ [app: string]: EnvVars;
4
+ }) => Promise<EnvVars>;
5
+ export {};
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __read = (this && this.__read) || function (o, n) {
50
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
51
+ if (!m) return o;
52
+ var i = m.call(o), r, ar = [], e;
53
+ try {
54
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
55
+ }
56
+ catch (error) { e = { error: error }; }
57
+ finally {
58
+ try {
59
+ if (r && !r.done && (m = i["return"])) m.call(i);
60
+ }
61
+ finally { if (e) throw e.error; }
62
+ }
63
+ return ar;
64
+ };
65
+ var __importDefault = (this && this.__importDefault) || function (mod) {
66
+ return (mod && mod.__esModule) ? mod : { "default": mod };
67
+ };
68
+ exports.__esModule = true;
69
+ exports.extractBuildEnv = void 0;
70
+ var extractAllValues_1 = require("./extractAllValues");
71
+ var slugify_1 = __importDefault(require("slugify"));
72
+ var extractBuildEnv = function (componentName, env, visitedReferencedApps // this is just to avoid infinit recursion
73
+ ) {
74
+ if (visitedReferencedApps === void 0) { visitedReferencedApps = {}; }
75
+ return __awaiter(void 0, void 0, void 0, function () {
76
+ var values, _a, APP_NAME, CUSTOMER_NAME, CI_COMMIT_REF_SLUG, CI_MERGE_REQUEST_IID, CI_ENVIRONMENT_SLUG, isNotMonorepo, KUBE_APP_NAME, KUBE_APP_SLUG, CANONICAL_URL, defaultBuildEnv, publicBuildEnv, merged, fromComponents, referencedBuildEnv;
77
+ var _b, _c, _d, _e, _f;
78
+ return __generator(this, function (_g) {
79
+ switch (_g.label) {
80
+ case 0: return [4 /*yield*/, extractAllValues_1.extractAllValues(componentName, env)];
81
+ case 1:
82
+ values = _g.sent();
83
+ _a = process.env, APP_NAME = _a.APP_NAME, CUSTOMER_NAME = _a.CUSTOMER_NAME, CI_COMMIT_REF_SLUG = _a.CI_COMMIT_REF_SLUG, CI_MERGE_REQUEST_IID = _a.CI_MERGE_REQUEST_IID, CI_ENVIRONMENT_SLUG = _a.CI_ENVIRONMENT_SLUG;
84
+ isNotMonorepo = componentName === ".";
85
+ KUBE_APP_NAME = CI_MERGE_REQUEST_IID
86
+ ? componentName + "-" + CI_COMMIT_REF_SLUG
87
+ : componentName;
88
+ KUBE_APP_SLUG = isNotMonorepo
89
+ ? CI_ENVIRONMENT_SLUG
90
+ : slugify_1["default"](KUBE_APP_NAME);
91
+ CANONICAL_URL = "https://" + APP_NAME + "-" + KUBE_APP_SLUG + "." + CUSTOMER_NAME + ".panter.cloud";
92
+ defaultBuildEnv = {
93
+ KUBE_APP_NAME: KUBE_APP_NAME,
94
+ CANONICAL_URL: CANONICAL_URL,
95
+ IMAGE_PULL_SECRET: "gitlab-registry-" + componentName,
96
+ ROOT_URL: ((_b = values === null || values === void 0 ? void 0 : values.application) === null || _b === void 0 ? void 0 : _b.host) || CANONICAL_URL
97
+ };
98
+ publicBuildEnv = (_d = (_c = values === null || values === void 0 ? void 0 : values.buildEnv) === null || _c === void 0 ? void 0 : _c.public) !== null && _d !== void 0 ? _d : {};
99
+ merged = __assign(__assign({}, defaultBuildEnv), publicBuildEnv);
100
+ if (process.env.DEBUG) {
101
+ console.log({ values: values, defaultBuildEnv: defaultBuildEnv, publicBuildEnv: publicBuildEnv });
102
+ }
103
+ fromComponents = (_f = (_e = values === null || values === void 0 ? void 0 : values.buildEnv) === null || _e === void 0 ? void 0 : _e.fromComponents) !== null && _f !== void 0 ? _f : {};
104
+ return [4 /*yield*/, Object.entries(fromComponents).reduce(function (acc, _a) {
105
+ var _b = __read(_a, 2), otherApp = _b[0], mapping = _b[1];
106
+ return __awaiter(void 0, void 0, void 0, function () {
107
+ var otherBuildEnv, _c, _d;
108
+ var _e;
109
+ var _f;
110
+ return __generator(this, function (_g) {
111
+ switch (_g.label) {
112
+ case 0:
113
+ if (process.env.DEBUG) {
114
+ console.log("extract reference build env", otherApp, mapping);
115
+ }
116
+ if (!!mapping) return [3 /*break*/, 2];
117
+ return [4 /*yield*/, acc];
118
+ case 1: return [2 /*return*/, _g.sent()];
119
+ case 2:
120
+ if (!((_f = visitedReferencedApps[otherApp]) !== null && _f !== void 0)) return [3 /*break*/, 3];
121
+ _c = _f;
122
+ return [3 /*break*/, 5];
123
+ case 3: return [4 /*yield*/, exports.extractBuildEnv(otherApp, env, __assign(__assign({}, visitedReferencedApps), (_e = {}, _e[componentName] = merged, _e)))];
124
+ case 4:
125
+ _c = (_g.sent());
126
+ _g.label = 5;
127
+ case 5:
128
+ otherBuildEnv = _c;
129
+ if (process.env.DEBUG) {
130
+ console.log({ otherBuildEnv: otherBuildEnv });
131
+ }
132
+ _d = [{}];
133
+ return [4 /*yield*/, acc];
134
+ case 6:
135
+ // resolve mapping
136
+ return [2 /*return*/, __assign.apply(void 0, [__assign.apply(void 0, _d.concat([(_g.sent())])), Object.entries(mapping).reduce(function (inneracc, _a) {
137
+ var _b;
138
+ var _c = __read(_a, 2), ourKey = _c[0], otherKey = _c[1];
139
+ return (__assign(__assign({}, inneracc), (_b = {}, _b[ourKey] = otherBuildEnv[otherKey], _b)));
140
+ }, {})])];
141
+ }
142
+ });
143
+ });
144
+ }, {})];
145
+ case 2:
146
+ referencedBuildEnv = _g.sent();
147
+ return [2 /*return*/, __assign(__assign({}, merged), referencedBuildEnv)];
148
+ }
149
+ });
150
+ });
151
+ };
152
+ exports.extractBuildEnv = extractBuildEnv;
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env ts-node
2
+ export declare const extractValuesFromEnvVars: () => {};
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env ts-node
2
+ "use strict";
3
+ var __read = (this && this.__read) || function (o, n) {
4
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
5
+ if (!m) return o;
6
+ var i = m.call(o), r, ar = [], e;
7
+ try {
8
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
9
+ }
10
+ catch (error) { e = { error: error }; }
11
+ finally {
12
+ try {
13
+ if (r && !r.done && (m = i["return"])) m.call(i);
14
+ }
15
+ finally { if (e) throw e.error; }
16
+ }
17
+ return ar;
18
+ };
19
+ var __values = (this && this.__values) || function(o) {
20
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
21
+ if (m) return m.call(o);
22
+ if (o && typeof o.length === "number") return {
23
+ next: function () {
24
+ if (o && i >= o.length) o = void 0;
25
+ return { value: o && o[i++], done: !o };
26
+ }
27
+ };
28
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
29
+ };
30
+ exports.__esModule = true;
31
+ exports.extractValuesFromEnvVars = void 0;
32
+ var lodash_1 = require("lodash");
33
+ var extractValuesFromEnvVars = function () {
34
+ var e_1, _a;
35
+ var values = {};
36
+ var PREFIX = "DEFAULT_VALUE_";
37
+ try {
38
+ for (var _b = __values(Object.entries(process.env).filter(function (_a) {
39
+ var _b = __read(_a, 1), key = _b[0];
40
+ return key.startsWith(PREFIX);
41
+ })), _c = _b.next(); !_c.done; _c = _b.next()) {
42
+ var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
43
+ var path = key.replace(PREFIX, "").split("_");
44
+ var theValue = void 0;
45
+ try {
46
+ theValue = JSON.parse(value !== null && value !== void 0 ? value : "");
47
+ }
48
+ catch (e) {
49
+ theValue = value;
50
+ }
51
+ lodash_1.set(values, path, theValue);
52
+ }
53
+ }
54
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
55
+ finally {
56
+ try {
57
+ if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
58
+ }
59
+ finally { if (e_1) throw e_1.error; }
60
+ }
61
+ return values;
62
+ };
63
+ exports.extractValuesFromEnvVars = extractValuesFromEnvVars;
@@ -0,0 +1,2 @@
1
+ export declare const extractValuesFromMRMessage: (mrMessage: string) => {} | undefined;
2
+ export declare const extractValuesFromMr: (projectId: string, mergeRequestId: number) => Promise<{} | undefined>;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ exports.__esModule = true;
39
+ exports.extractValuesFromMr = exports.extractValuesFromMRMessage = void 0;
40
+ var node_1 = require("@gitbeaker/node"); // Just the Project Resource
41
+ var yaml_1 = require("yaml");
42
+ var lodash_1 = require("lodash");
43
+ var _a = process.env, GL_TOKEN = _a.GL_TOKEN, CI_SERVER_URL = _a.CI_SERVER_URL;
44
+ var gitlabApi = new node_1.Gitlab({
45
+ token: GL_TOKEN,
46
+ host: CI_SERVER_URL
47
+ });
48
+ var getMRInfo = function (projectId, mrId) { return __awaiter(void 0, void 0, void 0, function () {
49
+ return __generator(this, function (_a) {
50
+ switch (_a.label) {
51
+ case 0: return [4 /*yield*/, gitlabApi.MergeRequests.show(projectId, mrId)];
52
+ case 1: return [2 /*return*/, _a.sent()];
53
+ }
54
+ });
55
+ }); };
56
+ var extractValuesFromMRMessage = function (mrMessage) {
57
+ var codeBlocks = Array.from(mrMessage.matchAll(/```.*([^`]+)```/gm)).map(function (match) { return match[1]; });
58
+ return codeBlocks.reduce(function (values, block) {
59
+ if (values === void 0) { values = {}; }
60
+ if (block.includes("$env") || block.includes("$values"))
61
+ try {
62
+ var _a = yaml_1.parse(block), $values = _a.$values, $env = _a.$env;
63
+ if ($values)
64
+ lodash_1.merge(values, $values);
65
+ if ($env)
66
+ lodash_1.merge(values, { env: { public: $env } });
67
+ return values;
68
+ }
69
+ catch (e) {
70
+ console.warn(e);
71
+ }
72
+ }, {});
73
+ };
74
+ exports.extractValuesFromMRMessage = extractValuesFromMRMessage;
75
+ var extractValuesFromMr = function (projectId, mergeRequestId) { return __awaiter(void 0, void 0, void 0, function () {
76
+ var mrInfo;
77
+ return __generator(this, function (_a) {
78
+ switch (_a.label) {
79
+ case 0: return [4 /*yield*/, getMRInfo(projectId, mergeRequestId)];
80
+ case 1:
81
+ mrInfo = _a.sent();
82
+ return [2 /*return*/, exports.extractValuesFromMRMessage(mrInfo.description)];
83
+ }
84
+ });
85
+ }); };
86
+ exports.extractValuesFromMr = extractValuesFromMr;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ exports.__esModule = true;
3
+ var extractValuesFromMr_1 = require("../scripts/utils/extractValuesFromMr");
4
+ describe("extractValuesFromMr", function () {
5
+ describe("extractValuesFromMRMessage", function () {
6
+ it("can extract $values yaml", function () {
7
+ var result = extractValuesFromMr_1.extractValuesFromMRMessage("\n \n blabla\n\n test\n\n ```\n $values:\n application:\n host: www.foo.com\n env:\n public:\n API_KEY: fooooxxx\n BLA: \"blubb\"\n ```\n ");
8
+ expect(result).toEqual({
9
+ application: {
10
+ host: "www.foo.com"
11
+ },
12
+ env: {
13
+ public: {
14
+ API_KEY: "fooooxxx",
15
+ BLA: "blubb"
16
+ }
17
+ }
18
+ });
19
+ });
20
+ it("can handle $env as shortcut", function () {
21
+ var result = extractValuesFromMr_1.extractValuesFromMRMessage("\n \n blabla\n\n test\n\n ```\n $env:\n API_KEY: fooooxxx\n BLA: \"blubb\"\n \n ```\n ");
22
+ expect(result).toEqual({
23
+ env: {
24
+ public: {
25
+ API_KEY: "fooooxxx",
26
+ BLA: "blubb"
27
+ }
28
+ }
29
+ });
30
+ });
31
+ it("ignores language in backticks", function () {
32
+ var result = extractValuesFromMr_1.extractValuesFromMRMessage("\n \n blabla\n\n test\n\n ```yaml\n $env:\n API_KEY: fooooxxx\n BLA: \"blubb\"\n \n ```\n ");
33
+ expect(result).toEqual({
34
+ env: {
35
+ public: {
36
+ API_KEY: "fooooxxx",
37
+ BLA: "blubb"
38
+ }
39
+ }
40
+ });
41
+ });
42
+ it("can handle mixed blocks", function () {
43
+ var result = extractValuesFromMr_1.extractValuesFromMRMessage("\n \n blabla\n\n test\n\n ```\n $values:\n env:\n public:\n FOO: \"bar\"\n\n $env:\n API_KEY: fooooxxx\n BLA: \"blubb\"\n \n ```\n ");
44
+ expect(result).toEqual({
45
+ env: {
46
+ public: {
47
+ FOO: "bar",
48
+ API_KEY: "fooooxxx",
49
+ BLA: "blubb"
50
+ }
51
+ }
52
+ });
53
+ });
54
+ it("can handle multiple blocks", function () {
55
+ var result = extractValuesFromMr_1.extractValuesFromMRMessage("\n \n blabla\n\n test\n\n ```\n $values:\n env:\n public:\n FOO: \"bar\"\n\n $env:\n API_KEY: fooooxxx\n BLA: \"blubb\"\n \n ```\n\n\n fooo\n\n ```\n $values:\n env:\n public:\n FOO: \"blubb\"\n\n $env:\n TEST: test\n \n ```\n ");
56
+ expect(result).toEqual({
57
+ env: {
58
+ public: {
59
+ FOO: "blubb",
60
+ API_KEY: "fooooxxx",
61
+ BLA: "blubb",
62
+ TEST: "test"
63
+ }
64
+ }
65
+ });
66
+ });
67
+ });
68
+ });
package/package.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@catladder/pipeline",
3
+ "version": "0.0.1",
4
+ "scripts": {
5
+ "prepublish": "yarn tsc"
6
+ },
7
+ "main": "dist/scripts/magic/index.js",
8
+ "types": "dist/scripts/magic/index.d.ts",
9
+ "devDependencies": {
10
+ "@types/lodash": "^4.14.172",
11
+ "@types/node": "^16.6.1",
12
+ "@types/yargs": "^17.0.5"
13
+ },
14
+ "dependencies": {
15
+ "@gitbeaker/node": "^32.1.2",
16
+ "lodash": "^4.17.21",
17
+ "slugify": "^1.6.3",
18
+ "yaml": "^1.10.2",
19
+ "yargs": "^17.2.1"
20
+ }
21
+ }
@@ -0,0 +1,11 @@
1
+ #!/bin/bash
2
+
3
+ export BUILD_TAG="$(git describe --tags || git rev-parse HEAD)"
4
+ export BUILD_ID="$BUILD_TAG"
5
+ export BUILD_COMMIT="$(git rev-parse HEAD)"
6
+ export BUILD_TIME="$(date)"
7
+ echo "BUILD_TAG=$BUILD_TAG" >>build.env
8
+ echo "BUILD_ID=$BUILD_ID" >>build.env
9
+ echo "BUILD_COMMIT=$BUILD_COMMIT" >>build.env
10
+ echo "BUILD_TIME=$BUILD_TIME" >>build.env
11
+ echo '{"id":"'$BUILD_ID'","commit":"'$BUILD_COMMIT'","tag":"'$BUILD_TAG'","time":"'$BUILD_TIME'"}' >__build_info.json
@@ -0,0 +1,8 @@
1
+ #!/bin/bash
2
+ kubectl create secret -n "$NAMESPACE" \
3
+ docker-registry $IMAGE_PULL_SECRET \
4
+ --docker-server="$CI_REGISTRY" \
5
+ --docker-username="${CI_DEPLOY_USER:-$CI_REGISTRY_USER}" \
6
+ --docker-password="${CI_DEPLOY_PASSWORD:-$CI_REGISTRY_PASSWORD}" \
7
+ --docker-email="$GITLAB_USER_EMAIL" \
8
+ -o yaml --dry-run | kubectl replace -n "$NAMESPACE" --force -f -
@@ -0,0 +1,4 @@
1
+ #!/bin/bash
2
+ RELEASE_NAME=${CUSTOMER_NAME}-${APP_NAME}-${CI_ENVIRONMENT_SLUG}
3
+ echo "Delete $RELEASE_NAME"
4
+ helm3 uninstall "$RELEASE_NAME" --namespace "$NAMESPACE"
@@ -0,0 +1,57 @@
1
+ #!/bin/bash
2
+
3
+ echo "Deploy to kubernetes"
4
+ RELEASE_NAME=${CUSTOMER_NAME}-${APP_NAME}-${CI_ENVIRONMENT_SLUG}
5
+ echo "Release: $RELEASE_NAME"
6
+ echo "URL (canonical): $HOST_CANONICAL"
7
+ #helm3 init --client-only --stable-repo-url=https://charts.helm.sh/stable
8
+ helm3 chart pull $CI_REGISTRY/$HELM_GITLAB_CHART_PATH/$HELM_GITLAB_CHART_NAME:v$HELM_GITLAB_CHART_VERSION
9
+ helm3 chart export $CI_REGISTRY/$HELM_GITLAB_CHART_PATH/$HELM_GITLAB_CHART_NAME:v$HELM_GITLAB_CHART_VERSION -d /tmp/
10
+ # use helmArgs defined in variables
11
+ helmArgsEvaluated=$(echo $helmArgs | envsubst)
12
+
13
+ # this bash-brainfuck simply splits $helmArgs by newline to an array...
14
+ readarray -t helmArgsArray <<<"$helmArgsEvaluated"
15
+
16
+ #Log the time until selfdestruct in case of review environment
17
+ if [[ ${ENV_SHORT} == "review" ]]; then echo "NOTE - This deployment will stop itself after 2 weeks"; fi
18
+
19
+ echo "reading values files from $VALUES_PATH for $ENV_SHORT"
20
+
21
+ printAllValues.ts -d $VALUES_PATH -e $ENV_SHORT
22
+ printAllValues.ts -d $VALUES_PATH -e $ENV_SHORT >__all_values.yml
23
+
24
+ echo "doing helm upgrade"
25
+ helm3 upgrade --install "$RELEASE_NAME" /tmp/$HELM_GITLAB_CHART_NAME \
26
+ --wait \
27
+ --timeout 15m0s \
28
+ --cleanup-on-fail \
29
+ --set global.componentName="$KUBE_APP_NAME" \
30
+ --set global.ENV_SHORT="$ENV_SHORT" \
31
+ --set global.CI_COMMIT_REF_SLUG="$CI_COMMIT_REF_SLUG" \
32
+ --set global.BUILD_ID="$BUILD_ID" \
33
+ --set image.repository="$CI_REGISTRY_IMAGE" \
34
+ --set image.pullSecret="$IMAGE_PULL_SECRET" \
35
+ --set image.name="$COMPONENT_NAME" \
36
+ --set image.tag="$IMAGE_TAG" \
37
+ --set image.pullPolicy=IfNotPresent \
38
+ --set storybook.enabled=$STORYBOOK \
39
+ --set application.hostCanonical="$HOST_CANONICAL" \
40
+ --set mongodb.enabled=$MONGODB_ENABLED \
41
+ --set mongodb.backup.enabled=$MONGODB_BACKUP_ENABLED \
42
+ --set mongodb-replicaset.replicas=$MONGODB_REPLICAS \
43
+ --set mongodb-replicaset.fullnameOverride=$KUBE_APP_NAME-mongodb-replicaset \
44
+ --set mongodb-replicaset.persistentVolume.storageClass="$MONGODB_STORAGE_CLASS" \
45
+ --set mailhog.fullnameOverride=$KUBE_APP_NAME-mailhog \
46
+ --set prisma.enabled=$PRISMA_ENABLED \
47
+ --set gitlab.visualReviewEnabled="$GITLAB_VISUAL_REVIEW_ENABLED" \
48
+ --set gitlab.app="$CI_PROJECT_PATH_SLUG" \
49
+ --set gitlab.projectPath="$CI_PROJECT_PATH" \
50
+ --set gitlab.mergeRequestId="$CI_MERGE_REQUEST_IID" \
51
+ --set gitlab.projectId="$CI_PROJECT_ID" \
52
+ --set gitlab.env="$CI_ENVIRONMENT_SLUG" \
53
+ --set namespace="$NAMESPACE" \
54
+ --namespace="$NAMESPACE" \
55
+ ${helmArgsArray[@]} \
56
+ --valeues __all_values.yml
57
+ echo "Deployment successful 😻"
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ echo "Ensure Namespace $NAMESPACE"
3
+ kubectl describe namespace "$NAMESPACE" || kubectl create namespace "$NAMESPACE"