@catladder/cli 1.13.0 → 1.15.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 (37) hide show
  1. package/dist/apps/cli/commands/project/commandConfigSecrets.d.ts +2 -1
  2. package/dist/apps/cli/commands/project/commandConfigSecrets.js +54 -36
  3. package/dist/apps/cli/commands/project/commandConfigSecrets.js.map +1 -1
  4. package/dist/apps/cli/commands/project/{commandInitGitlab.d.ts → commandInitProject.old.d.ts} +0 -0
  5. package/dist/apps/cli/commands/project/{commandInitProject.js → commandInitProject.old.js} +1 -1
  6. package/dist/apps/cli/commands/project/commandInitProject.old.js.map +1 -0
  7. package/dist/apps/cli/commands/project/{commandInitProject.d.ts → commandSetup.d.ts} +0 -0
  8. package/dist/apps/cli/commands/project/commandSetup.js +58 -0
  9. package/dist/apps/cli/commands/project/commandSetup.js.map +1 -0
  10. package/dist/apps/cli/commands/project/index.js +3 -4
  11. package/dist/apps/cli/commands/project/index.js.map +1 -1
  12. package/dist/apps/cli/commands/project/setup/index.d.ts +2 -0
  13. package/dist/apps/cli/commands/project/setup/index.js +103 -0
  14. package/dist/apps/cli/commands/project/setup/index.js.map +1 -0
  15. package/dist/apps/cli/commands/project/setup/setupAccessTokens.d.ts +2 -0
  16. package/dist/apps/cli/commands/project/setup/setupAccessTokens.js +106 -0
  17. package/dist/apps/cli/commands/project/setup/setupAccessTokens.js.map +1 -0
  18. package/dist/apps/cli/commands/project/setup/setupContext.d.ts +3 -0
  19. package/dist/apps/cli/commands/project/setup/setupContext.js +74 -0
  20. package/dist/apps/cli/commands/project/setup/setupContext.js.map +1 -0
  21. package/dist/apps/cli/commands/project/setup/setupKubernetes.d.ts +3 -0
  22. package/dist/apps/cli/commands/project/setup/setupKubernetes.js +132 -0
  23. package/dist/apps/cli/commands/project/setup/setupKubernetes.js.map +1 -0
  24. package/dist/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +2 -2
  26. package/src/apps/cli/commands/project/commandConfigSecrets.ts +32 -21
  27. package/src/apps/cli/commands/project/{commandInitProject.ts → commandInitProject.old.ts} +0 -0
  28. package/src/apps/cli/commands/project/commandSetup.ts +12 -0
  29. package/src/apps/cli/commands/project/index.ts +4 -4
  30. package/src/apps/cli/commands/project/setup/index.ts +42 -0
  31. package/src/apps/cli/commands/project/setup/setupAccessTokens.ts +70 -0
  32. package/src/apps/cli/commands/project/setup/setupContext.ts +37 -0
  33. package/src/apps/cli/commands/project/setup/setupKubernetes.ts +112 -0
  34. package/dist/apps/cli/commands/project/commandInitGitlab.js +0 -202
  35. package/dist/apps/cli/commands/project/commandInitGitlab.js.map +0 -1
  36. package/dist/apps/cli/commands/project/commandInitProject.js.map +0 -1
  37. package/src/apps/cli/commands/project/commandInitGitlab.ts +0 -191
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "catladder": "./bin/catladder"
17
17
  },
18
18
  "dependencies": {
19
- "@catladder/pipeline": "1.13.0",
19
+ "@catladder/pipeline": "1.15.1",
20
20
  "@kubernetes/client-node": "^0.16.2",
21
21
  "child-process-promise": "^2.2.1",
22
22
  "command-exists-promise": "^2.0.2",
@@ -55,5 +55,5 @@
55
55
  "eslint": "^8.7.0",
56
56
  "typescript": "^4.5.4"
57
57
  },
58
- "version": "1.13.0"
58
+ "version": "1.15.1"
59
59
  }
@@ -138,6 +138,8 @@ const doItFor = async (
138
138
  }
139
139
  }
140
140
  }
141
+ instance.log("upserting all variables, please wait...");
142
+ instance.log("");
141
143
  for (const [componentName, envs] of Object.entries(envAndComponents)) {
142
144
  for (const env of envs) {
143
145
  await upsertAllVariables(
@@ -168,6 +170,35 @@ const doItFor = async (
168
170
  );
169
171
  }
170
172
  }
173
+ instance.log("✅ " + env + ":" + componentName);
174
+ }
175
+ }
176
+ instance.log("done! 😻");
177
+ instance.log("");
178
+ };
179
+
180
+ export const projectConfigSecrets = async (
181
+ vorpal: CommandInstance,
182
+ envComponent?: string
183
+ ) => {
184
+ if (!envComponent) {
185
+ const allEnvAndcomponents = await getAllComponentsWithAllEnvsHierarchical();
186
+ await doItFor(vorpal, allEnvAndcomponents);
187
+ } else {
188
+ const { env, componentName } = parseChoice(envComponent);
189
+
190
+ // componentName can be null. in this case, iterate over all components
191
+ if (!componentName) {
192
+ const components = await getProjectComponents();
193
+ await doItFor(
194
+ vorpal,
195
+ Object.fromEntries(components.map((c) => [c, [env]]))
196
+ );
197
+ }
198
+ if (componentName) {
199
+ await doItFor(vorpal, {
200
+ [componentName]: [env],
201
+ });
171
202
  }
172
203
  }
173
204
  };
@@ -180,26 +211,6 @@ export default async (vorpal: Vorpal) => {
180
211
  )
181
212
  .autocomplete(await allEnvsAndAllComponents())
182
213
  .action(async function ({ envComponent }) {
183
- if (!envComponent) {
184
- const allEnvAndcomponents =
185
- await getAllComponentsWithAllEnvsHierarchical();
186
- await doItFor(this, allEnvAndcomponents);
187
- } else {
188
- const { env, componentName } = parseChoice(envComponent);
189
-
190
- // componentName can be null. in this case, iterate over all components
191
- if (!componentName) {
192
- const components = await getProjectComponents();
193
- await doItFor(
194
- this,
195
- Object.fromEntries(components.map((c) => [c, [env]]))
196
- );
197
- }
198
- if (componentName) {
199
- await doItFor(this, {
200
- [componentName]: [env],
201
- });
202
- }
203
- }
214
+ return await projectConfigSecrets(this, envComponent);
204
215
  });
205
216
  };
@@ -0,0 +1,12 @@
1
+ import Vorpal from "vorpal";
2
+ import { setupProject } from "./setup";
3
+
4
+ export default async (vorpal: Vorpal) =>
5
+ vorpal
6
+ .command(
7
+ "project-setup",
8
+ "Initializes all environments and creates requires resources, service accounts, etc."
9
+ )
10
+ .action(async function () {
11
+ await setupProject(this);
12
+ });
@@ -8,8 +8,8 @@ import commandEnvVars from "./commandEnvVars";
8
8
  import commandGetMyTotalWorktime from "./commandGetMyTotalWorktime";
9
9
  import commandGetShell from "./commandGetShell";
10
10
  import commandGitlabCi from "./commandGitlabCi";
11
- import commandInitGitlab from "./commandInitGitlab";
12
- import commandInitProject from "./commandInitProject";
11
+ import commandSetup from "./commandSetup";
12
+ //import commandInitProject from "./commandInitProject.old";
13
13
  import commandListPods from "./commandListPods";
14
14
  import commandMigrateHelm3 from "./commandMigrateHelm3";
15
15
  import commandNamespace from "./commandNamespace";
@@ -28,8 +28,8 @@ import commandReloadConfig from "./commandReloadConfig";
28
28
 
29
29
  export default async (vorpal: Vorpal) => {
30
30
  commandReloadConfig(vorpal);
31
- commandInitProject(vorpal);
32
- commandInitGitlab(vorpal);
31
+ commandSetup(vorpal);
32
+
33
33
  commandEnvVars(vorpal);
34
34
 
35
35
  commandNamespace(vorpal);
@@ -0,0 +1,42 @@
1
+ import { CommandInstance } from "vorpal";
2
+ import { getAllPipelineContexts } from "../../../../../config/getProjectConfig";
3
+ import { projectConfigSecrets } from "../commandConfigSecrets";
4
+ import { setupAccessTokens } from "./setupAccessTokens";
5
+ import { setupContext } from "./setupContext";
6
+
7
+ export const setupProject = async (instance: CommandInstance) => {
8
+ const allContext = await getAllPipelineContexts();
9
+
10
+ for (const context of allContext) {
11
+ await setupContext(instance, context);
12
+ }
13
+ await setupAccessTokens(instance);
14
+ instance.log("");
15
+ const { configSecrets } = await instance.prompt({
16
+ default: true,
17
+ message: "Before deployments work, you need to config secrets. Do it now?",
18
+ name: "configSecrets",
19
+ type: "confirm",
20
+ });
21
+ instance.log("");
22
+ if (configSecrets) {
23
+ await projectConfigSecrets(instance);
24
+ } else {
25
+ instance.log(
26
+ "👆 don't forget to config secret using `project-config-secrets`"
27
+ );
28
+ }
29
+ instance.log("");
30
+ instance.log("gitlab is ready! 🥂");
31
+ instance.log("\n");
32
+ instance.log("do not forget to make sure that:");
33
+ [
34
+ "you have __health route in place",
35
+ "lint and test are defined",
36
+ "secrets are configured (call project-config-secret)",
37
+ "eat your vegetables",
38
+ "be awesome 🤩",
39
+ ].forEach((tip) => instance.log(` - ${tip}`));
40
+ instance.log("\n");
41
+ instance.log("\n");
42
+ };
@@ -0,0 +1,70 @@
1
+ import open from "open";
2
+ import { CommandInstance } from "vorpal";
3
+ import { doGitlabRequest, getProjectInfo } from "../../../../../utils/gitlab";
4
+
5
+ export const setupAccessTokens = async (instance: CommandInstance) => {
6
+ const { id: projectId, web_url: projectWebUrl } = await getProjectInfo(
7
+ instance
8
+ );
9
+ const variables = await doGitlabRequest(
10
+ instance,
11
+ `projects/${projectId}/variables`
12
+ );
13
+
14
+ if (!variables.find((v: any) => v.key === "GL_TOKEN")) {
15
+ instance.log(
16
+ "I need add a GL_TOKEN to the project, so that semantic release will work\n"
17
+ );
18
+ instance.log(
19
+ "👉 Please please create a project access token in gitlab and copy its value into clipboard\n\n - name: something like 'semantic-release'\n - expires: leave empty\n - scopes: api, read_repository"
20
+ );
21
+ instance.log("\n");
22
+
23
+ const { understood } = await instance.prompt({
24
+ default: true,
25
+ message: "Understood and open gitlab now? 🤔",
26
+ name: "understood",
27
+ type: "confirm",
28
+ });
29
+ if (!understood) {
30
+ instance.log("continuing anyway...");
31
+ }
32
+ open(`${projectWebUrl}/-/settings/access_tokens`);
33
+
34
+ instance.log("\n");
35
+
36
+ instance.log("Enter your copied token now: ");
37
+
38
+ instance.log("\n");
39
+ const { GL_TOKEN } = await instance.prompt({
40
+ type: "password",
41
+ name: "GL_TOKEN",
42
+ message: "Access Token: ",
43
+ });
44
+ await doGitlabRequest(instance, `projects/${projectId}/variables`, {
45
+ key: "GL_TOKEN",
46
+ value: GL_TOKEN,
47
+ });
48
+ }
49
+
50
+ const deploy_tokens = await doGitlabRequest(
51
+ instance,
52
+ `projects/${projectId}/deploy_tokens`
53
+ );
54
+
55
+ if (
56
+ !deploy_tokens.find(
57
+ (v: { name: string }) => v.name === "gitlab-deploy-token"
58
+ )
59
+ ) {
60
+ instance.log(
61
+ "I will setup the 'GitLab Deploy Token', so Kubernetes can pull images from this project."
62
+ );
63
+
64
+ await doGitlabRequest(instance, `projects/${projectId}/deploy_tokens`, {
65
+ id: projectId,
66
+ name: "gitlab-deploy-token",
67
+ scopes: ["read_registry"],
68
+ });
69
+ }
70
+ };
@@ -0,0 +1,37 @@
1
+ import { Context, isOfDeployType } from "@catladder/pipeline";
2
+ import { CommandInstance } from "vorpal";
3
+ import { setupKubernetes } from "./setupKubernetes";
4
+
5
+ export const setupContext = async (
6
+ instance: CommandInstance,
7
+ context: Context
8
+ ) => {
9
+ instance.log("");
10
+ instance.log(
11
+ "=================================================================================="
12
+ );
13
+
14
+ instance.log(
15
+ "🐱 🔧 setting up " +
16
+ context.environment.shortName +
17
+ ":" +
18
+ context.componentName +
19
+ "..."
20
+ );
21
+ instance.log("");
22
+ const deployConfig = context.componentConfig.deploy;
23
+ if (isOfDeployType(deployConfig, "kubernetes")) {
24
+ await setupKubernetes(instance, context);
25
+ }
26
+
27
+ instance.log("");
28
+ instance.log(
29
+ "✅ " +
30
+ context.environment.shortName +
31
+ ":" +
32
+ context.componentName +
33
+ " done!"
34
+ );
35
+
36
+ instance.log("");
37
+ };
@@ -0,0 +1,112 @@
1
+ import {
2
+ Context,
3
+ getFullKubernetesClusterName,
4
+ isOfDeployType,
5
+ } from "@catladder/pipeline";
6
+ import { CommandInstance } from "vorpal";
7
+ import { $ } from "zx";
8
+ import { connectToCluster } from "../../../../../utils/cluster";
9
+ import { upsertAllVariables } from "../../../../../utils/gitlab";
10
+ import ensureNamespace from "../utils/ensureNamespace";
11
+
12
+ export const setupKubernetes = async (
13
+ instance: CommandInstance,
14
+ context: Context
15
+ ) => {
16
+ const deployConfig = context.componentConfig.deploy;
17
+ if (!isOfDeployType(deployConfig, "kubernetes")) {
18
+ throw new Error("cannot run setupKubernetes on non-kubernetes deployments");
19
+ }
20
+
21
+ const fullName = getFullKubernetesClusterName(deployConfig.cluster);
22
+ instance.log(`cluster: ${fullName}`);
23
+
24
+ await connectToCluster(fullName);
25
+ instance.log("");
26
+ instance.log("ensuring namespace ...");
27
+ const namespace = await ensureNamespace(context);
28
+ instance.log("Namespace " + namespace + " created / updated!");
29
+ instance.log("");
30
+ //$.verbose = true;
31
+
32
+ // we name the service account and the role and the role binding with the same name
33
+ // we currently create one per component to better separate them
34
+ instance.log("ensuring service accounts...");
35
+ const serviceAccountName = `cl-${context.componentName}-deploy`;
36
+ const KUBE_URL =
37
+ await $`TERM=dumb kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'`.then(
38
+ (s) => s.stdout.trim()
39
+ );
40
+
41
+ // first upsert service acount in the ns
42
+ try {
43
+ await $`kubectl delete serviceaccount --namespace ${namespace} ${serviceAccountName}`;
44
+ await $`kubectl delete rolebinding --namespace ${namespace} ${serviceAccountName}`;
45
+ await $`kubectl delete role --namespace ${namespace} ${serviceAccountName}`;
46
+ } catch (e) {
47
+ // ignore
48
+ }
49
+
50
+ await $`kubectl create serviceaccount --namespace ${namespace} ${serviceAccountName}`;
51
+
52
+ // upsert role in the ns
53
+
54
+ await $`cat <<EOF | kubectl apply -f -
55
+ kind: Role
56
+ apiVersion: rbac.authorization.k8s.io/v1
57
+ metadata:
58
+ namespace: ${namespace}
59
+ name: ${serviceAccountName}
60
+ rules:
61
+ - apiGroups: ["", "extensions", "apps", "networking.k8s.io", "batch"]
62
+ resources: ["deployments", "replicasets", "statefulsets", "pods", "secrets", "configmaps", "services", "ingresses", "serviceaccounts", "jobs", "cronjobs"]
63
+ verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # You can also use ["*"]
64
+ ---
65
+ kind: RoleBinding
66
+ apiVersion: rbac.authorization.k8s.io/v1
67
+ metadata:
68
+ name: ${serviceAccountName}
69
+ namespace: ${namespace}
70
+ subjects:
71
+ - kind: ServiceAccount
72
+ name: ${serviceAccountName}
73
+ namespace: ${namespace}
74
+ roleRef:
75
+ kind: Role
76
+ name: ${serviceAccountName}
77
+ apiGroup: rbac.authorization.k8s.io
78
+ EOF
79
+ `;
80
+
81
+ // get token name
82
+ const tokenName =
83
+ await $`kubectl get serviceaccount --namespace ${namespace} ${serviceAccountName} -o jsonpath='{.secrets[0].name}'`;
84
+
85
+ const KUBE_CA_PEM =
86
+ await $`kubectl get secret ${tokenName} --namespace ${namespace} -o jsonpath="{['data']['ca\\.crt']}"`.then(
87
+ (c) => c.stdout.trim()
88
+ );
89
+ const KUBE_TOKEN =
90
+ await $`kubectl get secret ${tokenName} --namespace ${namespace} -o jsonpath="{['data']['token']}" | base64 --decode`.then(
91
+ (c) => c.stdout.trim()
92
+ );
93
+
94
+ const vars = {
95
+ KUBE_TOKEN,
96
+ KUBE_CA_PEM,
97
+ KUBE_URL,
98
+ };
99
+
100
+ instance.log("service accounts created / updated!");
101
+
102
+ instance.log("");
103
+ instance.log("pusing secrets to gitlab...");
104
+
105
+ await upsertAllVariables(
106
+ instance,
107
+ vars,
108
+ context.environment.shortName,
109
+ context.componentName
110
+ );
111
+ instance.log("done!");
112
+ };
@@ -1,202 +0,0 @@
1
- "use strict";
2
- var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
3
- if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
4
- return cooked;
5
- };
6
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
- return new (P || (P = Promise))(function (resolve, reject) {
9
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
- step((generator = generator.apply(thisArg, _arguments || [])).next());
13
- });
14
- };
15
- var __generator = (this && this.__generator) || function (thisArg, body) {
16
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
17
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
18
- function verb(n) { return function (v) { return step([n, v]); }; }
19
- function step(op) {
20
- if (f) throw new TypeError("Generator is already executing.");
21
- while (_) try {
22
- 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;
23
- if (y = 0, t) op = [op[0] & 2, t.value];
24
- switch (op[0]) {
25
- case 0: case 1: t = op; break;
26
- case 4: _.label++; return { value: op[1], done: false };
27
- case 5: _.label++; y = op[1]; op = [0]; continue;
28
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
29
- default:
30
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
31
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
32
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
33
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
34
- if (t[2]) _.ops.pop();
35
- _.trys.pop(); continue;
36
- }
37
- op = body.call(thisArg, _);
38
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
39
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
40
- }
41
- };
42
- var __importDefault = (this && this.__importDefault) || function (mod) {
43
- return (mod && mod.__esModule) ? mod : { "default": mod };
44
- };
45
- exports.__esModule = true;
46
- var pipeline_1 = require("@catladder/pipeline");
47
- var zx_1 = require("zx");
48
- var getProjectConfig_1 = require("../../../../config/getProjectConfig");
49
- var cluster_1 = require("../../../../utils/cluster");
50
- var gitlab_1 = require("../../../../utils/gitlab");
51
- var ensureNamespace_1 = __importDefault(require("./utils/ensureNamespace"));
52
- var open_1 = __importDefault(require("open"));
53
- exports["default"] = (function (vorpal) { return __awaiter(void 0, void 0, void 0, function () {
54
- return __generator(this, function (_a) {
55
- return [2 /*return*/, vorpal
56
- .command("project-init-gitlab", "Initializes the gitlab repo, e.g. connects the cluster to it")
57
- .action(function () {
58
- return __awaiter(this, void 0, void 0, function () {
59
- var allContext, _i, allContext_1, context, deployConfig, fullName, namespace, serviceAccountName, KUBE_URL, e_1, tokenName, KUBE_CA_PEM, KUBE_TOKEN, vars, _a, projectId, projectWebUrl, variables, understood, GL_TOKEN, deploy_tokens;
60
- var _this = this;
61
- return __generator(this, function (_b) {
62
- switch (_b.label) {
63
- case 0: return [4 /*yield*/, (0, getProjectConfig_1.getAllPipelineContexts)()];
64
- case 1:
65
- allContext = _b.sent();
66
- _i = 0, allContext_1 = allContext;
67
- _b.label = 2;
68
- case 2:
69
- if (!(_i < allContext_1.length)) return [3 /*break*/, 19];
70
- context = allContext_1[_i];
71
- deployConfig = context.componentConfig.deploy;
72
- if (!(0, pipeline_1.isOfDeployType)(deployConfig, "kubernetes")) return [3 /*break*/, 18];
73
- fullName = (0, pipeline_1.getFullKubernetesClusterName)(deployConfig.cluster);
74
- this.log("connecting ".concat(context.environment.shortName, ":").concat(context.componentName, " ").concat(fullName));
75
- return [4 /*yield*/, (0, cluster_1.connectToCluster)(fullName)];
76
- case 3:
77
- _b.sent();
78
- return [4 /*yield*/, (0, ensureNamespace_1["default"])(context)];
79
- case 4:
80
- namespace = _b.sent();
81
- serviceAccountName = "cl-".concat(context.componentName, "-deploy");
82
- return [4 /*yield*/, (0, zx_1.$)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["TERM=dumb kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'"], ["TERM=dumb kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'"]))).then(function (s) { return s.stdout.trim(); })];
83
- case 5:
84
- KUBE_URL = _b.sent();
85
- _b.label = 6;
86
- case 6:
87
- _b.trys.push([6, 10, , 11]);
88
- return [4 /*yield*/, (0, zx_1.$)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["kubectl delete serviceaccount --namespace ", " ", ""], ["kubectl delete serviceaccount --namespace ", " ", ""])), namespace, serviceAccountName)];
89
- case 7:
90
- _b.sent();
91
- return [4 /*yield*/, (0, zx_1.$)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["kubectl delete rolebinding --namespace ", " ", ""], ["kubectl delete rolebinding --namespace ", " ", ""])), namespace, serviceAccountName)];
92
- case 8:
93
- _b.sent();
94
- return [4 /*yield*/, (0, zx_1.$)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["kubectl delete role --namespace ", " ", ""], ["kubectl delete role --namespace ", " ", ""])), namespace, serviceAccountName)];
95
- case 9:
96
- _b.sent();
97
- return [3 /*break*/, 11];
98
- case 10:
99
- e_1 = _b.sent();
100
- return [3 /*break*/, 11];
101
- case 11: return [4 /*yield*/, (0, zx_1.$)(templateObject_5 || (templateObject_5 = __makeTemplateObject(["kubectl create serviceaccount --namespace ", " ", ""], ["kubectl create serviceaccount --namespace ", " ", ""])), namespace, serviceAccountName)];
102
- case 12:
103
- _b.sent();
104
- // upsert role in the ns
105
- return [4 /*yield*/, (0, zx_1.$)(templateObject_6 || (templateObject_6 = __makeTemplateObject(["cat <<EOF | kubectl apply -f -\nkind: Role\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n namespace: ", "\n name: ", "\nrules:\n- apiGroups: [\"\", \"extensions\", \"apps\", \"networking.k8s.io\", \"batch\"]\n resources: [\"deployments\", \"replicasets\", \"statefulsets\", \"pods\", \"secrets\", \"configmaps\", \"services\", \"ingresses\", \"serviceaccounts\", \"jobs\", \"cronjobs\"]\n verbs: [\"get\", \"list\", \"watch\", \"create\", \"update\", \"patch\", \"delete\"] # You can also use [\"*\"]\n---\nkind: RoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: ", "\n namespace: ", "\nsubjects:\n - kind: ServiceAccount\n name: ", "\n namespace: ", "\nroleRef:\n kind: Role\n name: ", "\n apiGroup: rbac.authorization.k8s.io\nEOF\n "], ["cat <<EOF | kubectl apply -f -\nkind: Role\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n namespace: ", "\n name: ", "\nrules:\n- apiGroups: [\"\", \"extensions\", \"apps\", \"networking.k8s.io\", \"batch\"]\n resources: [\"deployments\", \"replicasets\", \"statefulsets\", \"pods\", \"secrets\", \"configmaps\", \"services\", \"ingresses\", \"serviceaccounts\", \"jobs\", \"cronjobs\"]\n verbs: [\"get\", \"list\", \"watch\", \"create\", \"update\", \"patch\", \"delete\"] # You can also use [\"*\"]\n---\nkind: RoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: ", "\n namespace: ", "\nsubjects:\n - kind: ServiceAccount\n name: ", "\n namespace: ", "\nroleRef:\n kind: Role\n name: ", "\n apiGroup: rbac.authorization.k8s.io\nEOF\n "])), namespace, serviceAccountName, serviceAccountName, namespace, serviceAccountName, namespace, serviceAccountName)];
106
- case 13:
107
- // upsert role in the ns
108
- _b.sent();
109
- return [4 /*yield*/, (0, zx_1.$)(templateObject_7 || (templateObject_7 = __makeTemplateObject(["kubectl get serviceaccount --namespace ", " ", " -o jsonpath='{.secrets[0].name}'"], ["kubectl get serviceaccount --namespace ", " ", " -o jsonpath='{.secrets[0].name}'"])), namespace, serviceAccountName)];
110
- case 14:
111
- tokenName = _b.sent();
112
- return [4 /*yield*/, (0, zx_1.$)(templateObject_8 || (templateObject_8 = __makeTemplateObject(["kubectl get secret ", " --namespace ", " -o jsonpath=\"{['data']['ca\\.crt']}\""], ["kubectl get secret ", " --namespace ", " -o jsonpath=\"{['data']['ca\\\\.crt']}\""])), tokenName, namespace).then(function (c) { return c.stdout.trim(); })];
113
- case 15:
114
- KUBE_CA_PEM = _b.sent();
115
- return [4 /*yield*/, (0, zx_1.$)(templateObject_9 || (templateObject_9 = __makeTemplateObject(["kubectl get secret ", " --namespace ", " -o jsonpath=\"{['data']['token']}\" | base64 --decode"], ["kubectl get secret ", " --namespace ", " -o jsonpath=\"{['data']['token']}\" | base64 --decode"])), tokenName, namespace).then(function (c) { return c.stdout.trim(); })];
116
- case 16:
117
- KUBE_TOKEN = _b.sent();
118
- vars = {
119
- KUBE_TOKEN: KUBE_TOKEN,
120
- KUBE_CA_PEM: KUBE_CA_PEM,
121
- KUBE_URL: KUBE_URL
122
- };
123
- return [4 /*yield*/, (0, gitlab_1.upsertAllVariables)(this, vars, context.environment.shortName, context.componentName)];
124
- case 17:
125
- _b.sent();
126
- _b.label = 18;
127
- case 18:
128
- _i++;
129
- return [3 /*break*/, 2];
130
- case 19: return [4 /*yield*/, (0, gitlab_1.getProjectInfo)(this)];
131
- case 20:
132
- _a = _b.sent(), projectId = _a.id, projectWebUrl = _a.web_url;
133
- return [4 /*yield*/, (0, gitlab_1.doGitlabRequest)(this, "projects/".concat(projectId, "/variables"))];
134
- case 21:
135
- variables = _b.sent();
136
- if (!!variables.find(function (v) { return v.key === "GL_TOKEN"; })) return [3 /*break*/, 25];
137
- this.log("I need add a GL_TOKEN to the project, so that semantic release will work\n");
138
- this.log("👉 Please please create a project access token in gitlab and copy its value into clipboard\n\n - name: something like 'semantic-release'\n - expires: leave empty\n - scopes: api, read_repository");
139
- this.log("\n");
140
- return [4 /*yield*/, this.prompt({
141
- "default": true,
142
- message: "Understood and open gitlab now? 🤔",
143
- name: "understood",
144
- type: "confirm"
145
- })];
146
- case 22:
147
- understood = (_b.sent()).understood;
148
- if (!understood) {
149
- this.log("continuing anyway...");
150
- }
151
- (0, open_1["default"])("".concat(projectWebUrl, "/-/settings/access_tokens"));
152
- this.log("\n");
153
- this.log("Enter your copied token now: ");
154
- this.log("\n");
155
- return [4 /*yield*/, this.prompt({
156
- type: "password",
157
- name: "GL_TOKEN",
158
- message: "Access Token: "
159
- })];
160
- case 23:
161
- GL_TOKEN = (_b.sent()).GL_TOKEN;
162
- return [4 /*yield*/, (0, gitlab_1.doGitlabRequest)(this, "projects/".concat(projectId, "/variables"), {
163
- key: "GL_TOKEN",
164
- value: GL_TOKEN
165
- })];
166
- case 24:
167
- _b.sent();
168
- _b.label = 25;
169
- case 25: return [4 /*yield*/, (0, gitlab_1.doGitlabRequest)(this, "projects/".concat(projectId, "/deploy_tokens"))];
170
- case 26:
171
- deploy_tokens = _b.sent();
172
- if (!!deploy_tokens.find(function (v) { return v.name === "gitlab-deploy-token"; })) return [3 /*break*/, 28];
173
- this.log("I will setup the 'GitLab Deploy Token', so Kubernetes can pull images from this project.");
174
- return [4 /*yield*/, (0, gitlab_1.doGitlabRequest)(this, "projects/".concat(projectId, "/deploy_tokens"), {
175
- id: projectId,
176
- name: "gitlab-deploy-token",
177
- scopes: ["read_registry"]
178
- })];
179
- case 27:
180
- _b.sent();
181
- _b.label = 28;
182
- case 28:
183
- this.log("gitlab is ready! 🥂");
184
- this.log("\n");
185
- this.log("do not forget to make sure that:");
186
- [
187
- "you have __health route in place",
188
- "lint and test are defined",
189
- "eat your vegetables",
190
- "be awesome 🤩",
191
- ].forEach(function (tip) { return _this.log(" - ".concat(tip)); });
192
- this.log("\n");
193
- this.log("\n");
194
- return [2 /*return*/];
195
- }
196
- });
197
- });
198
- })];
199
- });
200
- }); });
201
- var templateObject_1, templateObject_2, templateObject_3, templateObject_4, templateObject_5, templateObject_6, templateObject_7, templateObject_8, templateObject_9;
202
- //# sourceMappingURL=commandInitGitlab.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commandInitGitlab.js","sourceRoot":"","sources":["../../../../../src/apps/cli/commands/project/commandInitGitlab.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"commandInitProject.js","sourceRoot":"","sources":["../../../../../src/apps/cli/commands/project/commandInitProject.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,qCAA+C;AAC/C,mCAA+B;AAC/B,iCAAqD;AACrD,8CAAwB;AAExB,uDAA6D;AAE7D,IAAM,YAAY,GAAG,UAAC,GAAW,IAAK,OAAA,IAAA,gBAAO,EAAC,IAAA,kBAAS,EAAC,GAAG,CAAC,CAAC,EAAvB,CAAuB,CAAC;AAoB9D,IAAM,iBAAiB,GAAG;IACxB,WAAW,EAAE,YAAY;CAC1B,CAAC;AACF,4FAA4F;AAC5F,IAAM,4BAA4B,GAAG,EAAE,CAAC;AAExC,IAAM,uBAAuB,GAAmB;IAC9C;QACE,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP,sBAAA,IAAA,mBAAQ,EAAC,iBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC,EAAA;iBAAA;KACjE;CACF,CAAC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkJE;AAEF,IAAM,SAAS,GAAQ,EAAE,CAAC;AAC1B,sBAAe,UAAO,MAAc;;QAClC,sBAAA,MAAM;iBACH,OAAO,CAAC,cAAc,EAAE,qBAAqB,CAAC;iBAC9C,MAAM,CAAC;;;;;;oCACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;;gCACpC,aAAa,GAAG,SAAuB;qCACzC,aAAa,EAAb,wBAAa;gCACf,IAAI,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;;;gCAE5D,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;gCACvC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gCAEP,SAAS,GAAG;oCAChB;wCACE,IAAI,EAAE,OAAO;wCACb,IAAI,EAAE,cAAc;wCACpB,SAAO,EAAE,KAAK;wCACd,OAAO,EAAE,iBAAiB;qCAC3B;oCACD;wCACE,IAAI,EAAE,OAAO;wCACb,IAAI,EAAE,SAAS;wCACf,OAAO,EAAE,yBAAyB;qCACnC;oCACD;wCACE,IAAI,EAAE,OAAO;wCACb,IAAI,EAAE,eAAe;wCACrB,SAAO,EAAE,KAAK;wCACd,OAAO,EACL,0IAA0I;qCAC7I;oCACD;wCACE,IAAI,EAAE,MAAM;wCACZ,IAAI,EAAE,UAAU;wCAChB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;wCAC/B,OAAO,EAAE,4BAA4B;qCACtC;iCACF,CAAC,GAAG,CAAC,UAAC,CAAC,IAAK,OAAA,uBACR,CAAC,KACJ,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,UAAG,CAAC,CAAC,OAAO,MAAG,IACxB,EAJW,CAIX,CAAC,CAAC;gCAEF,qBAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAA;;gCADxB,KACJ,SAA4B,EADtB,YAAY,kBAAA,EAAE,OAAO,aAAA,EAAE,aAAa,mBAAA,EAAE,QAAQ,cAAA;gCAGhD,KAKF,SAAS,CAAC,QAAQ,CAAC,EAJrB,eAAe,qBAAA,EACJ,iBAAiB,eAAA,EAC5B,MAAM,YAAA,EACN,aAAa,mBAAA,CACS;gCAElB,YAAY,uBAChB,YAAY,cAAA,EACZ,OAAO,SAAA,EACP,aAAa,eAAA,IACV,iBAAiB,GACjB,iBAAiB,CACrB,CAAC;gCACI,gBAAgB,mCACjB,uBAAuB,SACvB,CAAC,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,EAAE,CAAC,OACzB,CAAC;gCACI,oBAAoB,GAAG,IAAA,gBAAO,EAAC,YAAY,EAAE,UAAC,KAAK,EAAE,GAAG;oCAC5D,OAAA,YAAY,CAAC,GAAG,CAAC;gCAAjB,CAAiB,CAClB,CAAC;gCAEI,kBAAkB,GAAG;oCACzB,OAAO,EAAE,CAAC,eAAe,CAAC;oCAC1B,SAAS,EAAE,oBAAoB;iCAChC,CAAC;gCAEI,eAAe,GAAG,IAAA,cAAI,EAAC,kBAAkB,CAAC,CAAC;gCACjD,qBAAM,IAAA,oBAAS,EAAC,gBAAgB,EAAE,eAAe,CAAC,EAAA;;gCAAlD,SAAkD,CAAC;gCAEnD,gBAAgB,CAAC,OAAO,CAAC,UAAO,EAAqB;wCAAnB,QAAQ,cAAA,EAAE,OAAO,aAAA;;;;;;yDAE/C,CAAA,OAAO,OAAO,KAAK,UAAU,CAAA,EAA7B,wBAA6B;oDAAG,qBAAM,OAAO,EAAE,EAAA;;oDAAf,KAAA,SAAe,CAAA;;;oDAAG,KAAA,OAAO,CAAA;;;oDADrD,UAAU,KAC2C;oDAC3D,qBAAM,IAAA,oBAAS,EAAC,QAAQ,EAAE,UAAU,CAAC,EAAA;;oDAArC,SAAqC,CAAC;;;;;iCACvC,CAAC,CAAC;gCAEH,qBAAM,IAAA,oBAAS,EAAC,YAAY,EAAE,IAAA,cAAI,EAAC,MAAM,CAAC,CAAC,EAAA;;gCAA3C,SAA2C,CAAC;gCAE5C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gCACb,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gCACpC,IAAI,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;gCAClD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gCACb,IAAI,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;gCACrE,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;oCAEY,qBAAM,IAAI,CAAC,MAAM,CAAC;oCAC3C,SAAO,EAAE,IAAI;oCACb,OAAO,EACL,mFAAmF;oCACrF,IAAI,EAAE,gBAAgB;oCACtB,IAAI,EAAE,SAAS;iCAChB,CAAC,EAAA;;gCANM,cAAc,GAAK,CAAA,SAMzB,CAAA,eANoB;qCAOlB,cAAc,EAAd,wBAAc;gCAChB,qBAAM,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAA;;gCAA5C,SAA4C,CAAC;;;;;;aAEhD,CAAC,EAAA;;KAAA,EAAC"}