@catladder/cli 1.8.0 → 1.9.0
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.
|
@@ -49,20 +49,22 @@ var getProjectConfig_1 = require("../../../../config/getProjectConfig");
|
|
|
49
49
|
var cluster_1 = require("../../../../utils/cluster");
|
|
50
50
|
var gitlab_1 = require("../../../../utils/gitlab");
|
|
51
51
|
var ensureNamespace_1 = __importDefault(require("./utils/ensureNamespace"));
|
|
52
|
+
var open_1 = __importDefault(require("open"));
|
|
52
53
|
exports["default"] = (function (vorpal) { return __awaiter(void 0, void 0, void 0, function () {
|
|
53
54
|
return __generator(this, function (_a) {
|
|
54
55
|
return [2 /*return*/, vorpal
|
|
55
56
|
.command("project-init-gitlab", "Initializes the gitlab repo, e.g. connects the cluster to it")
|
|
56
57
|
.action(function () {
|
|
57
58
|
return __awaiter(this, void 0, void 0, function () {
|
|
58
|
-
var allContext, _i, allContext_1, context, deployConfig, fullName, namespace, serviceAccountName, KUBE_URL, e_1, tokenName, KUBE_CA_PEM, KUBE_TOKEN, vars;
|
|
59
|
-
|
|
60
|
-
|
|
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) {
|
|
61
63
|
case 0: return [4 /*yield*/, (0, getProjectConfig_1.getAllPipelineContexts)()];
|
|
62
64
|
case 1:
|
|
63
|
-
allContext =
|
|
65
|
+
allContext = _b.sent();
|
|
64
66
|
_i = 0, allContext_1 = allContext;
|
|
65
|
-
|
|
67
|
+
_b.label = 2;
|
|
66
68
|
case 2:
|
|
67
69
|
if (!(_i < allContext_1.length)) return [3 /*break*/, 19];
|
|
68
70
|
context = allContext_1[_i];
|
|
@@ -72,47 +74,47 @@ exports["default"] = (function (vorpal) { return __awaiter(void 0, void 0, void
|
|
|
72
74
|
this.log("connecting ".concat(context.environment.shortName, ":").concat(context.componentName, " ").concat(fullName));
|
|
73
75
|
return [4 /*yield*/, (0, cluster_1.connectToCluster)(fullName)];
|
|
74
76
|
case 3:
|
|
75
|
-
|
|
77
|
+
_b.sent();
|
|
76
78
|
return [4 /*yield*/, (0, ensureNamespace_1["default"])(context)];
|
|
77
79
|
case 4:
|
|
78
|
-
namespace =
|
|
80
|
+
namespace = _b.sent();
|
|
79
81
|
serviceAccountName = "cl-".concat(context.componentName, "-deploy");
|
|
80
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(); })];
|
|
81
83
|
case 5:
|
|
82
|
-
KUBE_URL =
|
|
83
|
-
|
|
84
|
+
KUBE_URL = _b.sent();
|
|
85
|
+
_b.label = 6;
|
|
84
86
|
case 6:
|
|
85
|
-
|
|
87
|
+
_b.trys.push([6, 10, , 11]);
|
|
86
88
|
return [4 /*yield*/, (0, zx_1.$)(templateObject_2 || (templateObject_2 = __makeTemplateObject(["kubectl delete serviceaccount --namespace ", " ", ""], ["kubectl delete serviceaccount --namespace ", " ", ""])), namespace, serviceAccountName)];
|
|
87
89
|
case 7:
|
|
88
|
-
|
|
90
|
+
_b.sent();
|
|
89
91
|
return [4 /*yield*/, (0, zx_1.$)(templateObject_3 || (templateObject_3 = __makeTemplateObject(["kubectl delete rolebinding --namespace ", " ", ""], ["kubectl delete rolebinding --namespace ", " ", ""])), namespace, serviceAccountName)];
|
|
90
92
|
case 8:
|
|
91
|
-
|
|
93
|
+
_b.sent();
|
|
92
94
|
return [4 /*yield*/, (0, zx_1.$)(templateObject_4 || (templateObject_4 = __makeTemplateObject(["kubectl delete role --namespace ", " ", ""], ["kubectl delete role --namespace ", " ", ""])), namespace, serviceAccountName)];
|
|
93
95
|
case 9:
|
|
94
|
-
|
|
96
|
+
_b.sent();
|
|
95
97
|
return [3 /*break*/, 11];
|
|
96
98
|
case 10:
|
|
97
|
-
e_1 =
|
|
99
|
+
e_1 = _b.sent();
|
|
98
100
|
return [3 /*break*/, 11];
|
|
99
101
|
case 11: return [4 /*yield*/, (0, zx_1.$)(templateObject_5 || (templateObject_5 = __makeTemplateObject(["kubectl create serviceaccount --namespace ", " ", ""], ["kubectl create serviceaccount --namespace ", " ", ""])), namespace, serviceAccountName)];
|
|
100
102
|
case 12:
|
|
101
|
-
|
|
103
|
+
_b.sent();
|
|
102
104
|
// upsert role in the ns
|
|
103
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)];
|
|
104
106
|
case 13:
|
|
105
107
|
// upsert role in the ns
|
|
106
|
-
|
|
108
|
+
_b.sent();
|
|
107
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)];
|
|
108
110
|
case 14:
|
|
109
|
-
tokenName =
|
|
111
|
+
tokenName = _b.sent();
|
|
110
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(); })];
|
|
111
113
|
case 15:
|
|
112
|
-
KUBE_CA_PEM =
|
|
114
|
+
KUBE_CA_PEM = _b.sent();
|
|
113
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(); })];
|
|
114
116
|
case 16:
|
|
115
|
-
KUBE_TOKEN =
|
|
117
|
+
KUBE_TOKEN = _b.sent();
|
|
116
118
|
vars = {
|
|
117
119
|
KUBE_TOKEN: KUBE_TOKEN,
|
|
118
120
|
KUBE_CA_PEM: KUBE_CA_PEM,
|
|
@@ -120,12 +122,76 @@ exports["default"] = (function (vorpal) { return __awaiter(void 0, void 0, void
|
|
|
120
122
|
};
|
|
121
123
|
return [4 /*yield*/, (0, gitlab_1.upsertAllVariables)(this, vars, context.environment.shortName, context.componentName)];
|
|
122
124
|
case 17:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
_b.sent();
|
|
126
|
+
_b.label = 18;
|
|
125
127
|
case 18:
|
|
126
128
|
_i++;
|
|
127
129
|
return [3 /*break*/, 2];
|
|
128
|
-
case 19: return [
|
|
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*/];
|
|
129
195
|
}
|
|
130
196
|
});
|
|
131
197
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandInitGitlab.js","sourceRoot":"","sources":["../../../../../src/apps/cli/commands/project/commandInitGitlab.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"commandInitGitlab.js","sourceRoot":"","sources":["../../../../../src/apps/cli/commands/project/commandInitGitlab.ts"],"names":[],"mappings":"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"}
|