@catladder/cli 0.0.0-next-71c49b28 → 0.0.0-next-5dc1f907
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/bundles/catenv/index.js +75 -12
- package/dist/bundles/cli/index.js +847 -51
- package/dist/cli/src/apps/cli/commands/project/doctor/DoctorReport.d.ts +22 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/DoctorReport.js +75 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/DoctorReport.js.map +1 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.d.ts +15 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.js +59 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.js.map +1 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkCloudRun.d.ts +13 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkCloudRun.js +120 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkCloudRun.js.map +1 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkGithub.d.ts +10 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkGithub.js +100 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkGithub.js.map +1 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkGitlab.d.ts +13 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkGitlab.js +79 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkGitlab.js.map +1 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkStore.d.ts +8 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkStore.js +44 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/checkStore.js.map +1 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/index.d.ts +14 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/index.js +48 -0
- package/dist/cli/src/apps/cli/commands/project/doctor/index.js.map +1 -0
- package/dist/cli/src/apps/cli/commands/project/setup/setupAccessTokens.js +4 -1
- package/dist/cli/src/apps/cli/commands/project/setup/setupAccessTokens.js.map +1 -1
- package/dist/cli/src/apps/cli/commands/project/setup/setupCloudRun.d.ts +21 -0
- package/dist/cli/src/apps/cli/commands/project/setup/setupCloudRun.js +31 -11
- package/dist/cli/src/apps/cli/commands/project/setup/setupCloudRun.js.map +1 -1
- package/dist/cli/src/commands/index.d.ts +1 -0
- package/dist/cli/src/commands/index.js +8 -1
- package/dist/cli/src/commands/index.js.map +1 -1
- package/dist/cli/src/commands/project/commandDoctor.d.ts +8 -0
- package/dist/cli/src/commands/project/commandDoctor.js +25 -0
- package/dist/cli/src/commands/project/commandDoctor.js.map +1 -0
- package/dist/cli/src/gcloud/artifactsRegistry.d.ts +1 -0
- package/dist/cli/src/gcloud/artifactsRegistry.js +3 -2
- package/dist/cli/src/gcloud/artifactsRegistry.js.map +1 -1
- package/dist/cli/src/gcloud/serviceAccountNames.d.ts +28 -0
- package/dist/cli/src/gcloud/serviceAccountNames.js +51 -0
- package/dist/cli/src/gcloud/serviceAccountNames.js.map +1 -0
- package/dist/cli/src/gcloud/serviceAccounts.js +6 -27
- package/dist/cli/src/gcloud/serviceAccounts.js.map +1 -1
- package/dist/cli/src/utils/concurrency.d.ts +7 -0
- package/dist/cli/src/utils/concurrency.js +27 -0
- package/dist/cli/src/utils/concurrency.js.map +1 -0
- package/dist/cli/src/utils/github.d.ts +10 -0
- package/dist/cli/src/utils/github.js +26 -1
- package/dist/cli/src/utils/github.js.map +1 -1
- package/dist/cli/src/utils/gitlab.d.ts +6 -0
- package/dist/cli/src/utils/gitlab.js +19 -1
- package/dist/cli/src/utils/gitlab.js.map +1 -1
- package/dist/pipeline/src/backends/github/createGithubJobs.js +24 -2
- package/dist/pipeline/src/backends/github/createGithubJobs.js.map +1 -1
- package/dist/pipeline/src/backends/gitlab/createGitlabJobs.js +8 -7
- package/dist/pipeline/src/backends/gitlab/createGitlabJobs.js.map +1 -1
- package/dist/pipeline/src/build/cache/createJobCache.js +8 -0
- package/dist/pipeline/src/build/cache/createJobCache.js.map +1 -1
- package/dist/pipeline/src/build/node/cache.js +15 -1
- package/dist/pipeline/src/build/node/cache.js.map +1 -1
- package/dist/pipeline/src/build/types.d.ts +19 -0
- package/dist/pipeline/src/build/types.js.map +1 -1
- package/dist/pipeline/src/constants.js +1 -1
- package/dist/pipeline/src/types/jobs.d.ts +6 -0
- package/dist/pipeline/src/types/jobs.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/apps/cli/commands/project/doctor/DoctorReport.ts +72 -0
- package/src/apps/cli/commands/project/doctor/GcloudProjectInspector.ts +77 -0
- package/src/apps/cli/commands/project/doctor/checkCloudRun.ts +148 -0
- package/src/apps/cli/commands/project/doctor/checkGithub.ts +156 -0
- package/src/apps/cli/commands/project/doctor/checkGitlab.ts +133 -0
- package/src/apps/cli/commands/project/doctor/checkStore.ts +43 -0
- package/src/apps/cli/commands/project/doctor/index.ts +59 -0
- package/src/apps/cli/commands/project/setup/setupAccessTokens.ts +9 -2
- package/src/apps/cli/commands/project/setup/setupCloudRun.ts +42 -21
- package/src/commands/index.ts +1 -0
- package/src/commands/project/commandDoctor.ts +21 -0
- package/src/gcloud/__tests__/serviceAccountNames.test.ts +63 -0
- package/src/gcloud/artifactsRegistry.ts +3 -1
- package/src/gcloud/serviceAccountNames.ts +65 -0
- package/src/gcloud/serviceAccounts.ts +6 -38
- package/src/utils/concurrency.ts +25 -0
- package/src/utils/github.ts +48 -0
- package/src/utils/gitlab.ts +24 -0
- package/tsconfig.json +2 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.doctorProject = void 0;
|
|
7
|
+
const pipeline_1 = require("../../../../../../../pipeline/src/index.js");
|
|
8
|
+
const getProjectConfig_1 = require("../../../../../config/getProjectConfig");
|
|
9
|
+
const checkCloudRun_1 = require("./checkCloudRun");
|
|
10
|
+
const checkGithub_1 = require("./checkGithub");
|
|
11
|
+
const checkGitlab_1 = require("./checkGitlab");
|
|
12
|
+
const checkStore_1 = require("./checkStore");
|
|
13
|
+
const DoctorReport_1 = require("./DoctorReport");
|
|
14
|
+
/**
|
|
15
|
+
* read-only health check: compares the state `project setup` (and
|
|
16
|
+
* `project secrets-sync-github`) would provision for the CURRENT config
|
|
17
|
+
* against what is actually there, and reports drift together with the
|
|
18
|
+
* command that heals it. `project setup` is a point-in-time
|
|
19
|
+
* provisioner, so config edits that change required infrastructure
|
|
20
|
+
* (IAM roles, services, secrets) drift silently until something breaks
|
|
21
|
+
* in ci — the doctor surfaces that before it does.
|
|
22
|
+
*
|
|
23
|
+
* The component filter only narrows the per-component checks; the
|
|
24
|
+
* cheap project-global checks (store, gitlab, github) always run.
|
|
25
|
+
*/
|
|
26
|
+
const doctorProject = async (instance, onlyComponents) => {
|
|
27
|
+
const config = await (0, getProjectConfig_1.getProjectConfig)();
|
|
28
|
+
if (!config) {
|
|
29
|
+
throw new Error("no catladder config found");
|
|
30
|
+
}
|
|
31
|
+
instance.log("🐱 🩺 checking project health — read-only, nothing will be changed");
|
|
32
|
+
const report = new DoctorReport_1.DoctorReport(instance);
|
|
33
|
+
await (0, checkStore_1.checkStore)(report);
|
|
34
|
+
let contexts = [];
|
|
35
|
+
try {
|
|
36
|
+
contexts = await (0, getProjectConfig_1.getAllPipelineContexts)(onlyComponents);
|
|
37
|
+
} catch (e) {
|
|
38
|
+
report.section("pipeline contexts");
|
|
39
|
+
report.fail(`could not create pipeline contexts: ${e.message}`, "run: catladder project setup");
|
|
40
|
+
}
|
|
41
|
+
if ((0, pipeline_1.getEnabledPipelineTypes)(config).includes("gitlab")) {
|
|
42
|
+
await (0, checkGitlab_1.checkGitlab)(instance, report, contexts);
|
|
43
|
+
}
|
|
44
|
+
await (0, checkCloudRun_1.checkCloudRun)(report, contexts);
|
|
45
|
+
await (0, checkGithub_1.checkGithub)(report, config);
|
|
46
|
+
report.summarize();
|
|
47
|
+
};
|
|
48
|
+
exports.doctorProject = doctorProject;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../src/apps/cli/commands/project/doctor/index.ts"],"names":[],"mappings":";;;AACA,kDAA8D;AAC9D,6EAGgD;AAEhD,mDAAgD;AAChD,+CAA4C;AAC5C,+CAA4C;AAC5C,6CAA0C;AAC1C,iDAA8C;AAE9C;;;;;;;;;;;GAWG;AACI,MAAM,aAAa,GAAG,KAAK,EAChC,QAAY,EACZ,cAAkC,EAClC,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAgB,GAAE,CAAC;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,QAAQ,CAAC,GAAG,CACV,oEAAoE,CACrE,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,2BAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,IAAA,uBAAU,EAAC,MAAM,CAAC,CAAC;IAEzB,IAAI,QAAQ,GAAuB,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,IAAA,yCAAsB,EAAC,cAAc,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CACT,uCAAuC,CAAC,CAAC,OAAO,EAAE,EAClD,8BAA8B,CAC/B,CAAC;IACJ,CAAC;IAED,IAAI,IAAA,kCAAuB,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,MAAM,IAAA,yBAAW,EAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,IAAA,6BAAa,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,IAAA,yBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,MAAM,CAAC,SAAS,EAAE,CAAC;AACrB,CAAC,CAAC;AAjCW,QAAA,aAAa,iBAiCxB"}
|
|
@@ -11,7 +11,10 @@ const setupAccessTokens = async instance => {
|
|
|
11
11
|
const {
|
|
12
12
|
id: projectId
|
|
13
13
|
} = await (0, gitlab_1.getProjectInfo)(instance);
|
|
14
|
-
|
|
14
|
+
// all pages: rotated tokens accumulate one (inactive) entry per
|
|
15
|
+
// rotation, so the active one quickly moves past the first page —
|
|
16
|
+
// missing it here created a brand-new duplicate token on every setup
|
|
17
|
+
const projectTokens = await (0, gitlab_1.doGitlabRequestAllPages)(instance, `projects/${projectId}/access_tokens`);
|
|
15
18
|
const token = projectTokens.find(t => t.name === TOKEN_NAME && t.active === true);
|
|
16
19
|
const expires_at = (0, date_fns_1.format)((0, date_fns_1.add)(new Date(), {
|
|
17
20
|
years: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupAccessTokens.js","sourceRoot":"","sources":["../../../../../../../../src/apps/cli/commands/project/setup/setupAccessTokens.ts"],"names":[],"mappings":";;;AACA,uCAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"setupAccessTokens.js","sourceRoot":"","sources":["../../../../../../../../src/apps/cli/commands/project/setup/setupAccessTokens.ts"],"names":[],"mappings":";;;AACA,uCAAuC;AACvC,wDAIqC;AAErC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAE/B,MAAM,iBAAiB,GAAG,KAAK,EAAE,QAAY,EAAE,EAAE;IACtD,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,MAAM,IAAA,uBAAc,EAAC,QAAQ,CAAC,CAAC;IAEzD,gEAAgE;IAChE,kEAAkE;IAClE,qEAAqE;IACrE,MAAM,aAAa,GAAG,MAAM,IAAA,gCAAuB,EACjD,QAAQ,EACR,YAAY,SAAS,gBAAgB,CACtC,CAAC;IACF,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,CAClD,CAAC;IAEF,MAAM,UAAU,GAAG,IAAA,iBAAM,EACvB,IAAA,cAAG,EAAC,IAAI,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EACvC,YAAY,CACb,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK;QACpB,CAAC,CAAC,MAAM,IAAA,wBAAe,EACnB,QAAQ,EACR,YAAY,SAAS,kBAAkB,KAAK,CAAC,EAAE,SAAS,EACxD,EAAE,UAAU,EAAE,EACd,MAAM,CACP;QACH,CAAC,CAAC,MAAM,IAAA,wBAAe,EACnB,QAAQ,EACR,YAAY,SAAS,gBAAgB,EACrC;YACE,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC;YAClC,YAAY,EAAE,EAAE,EAAE,aAAa;YAC/B,UAAU;SACX,EACD,MAAM,CACP,CAAC;IAEN,IAAI,CAAC;QACH,MAAM,IAAA,wBAAe,EAAC,QAAQ,EAAE,YAAY,SAAS,qBAAqB,CAAC,CAAC;QAC5E,MAAM,IAAA,wBAAe,EACnB,QAAQ,EACR,YAAY,SAAS,qBAAqB,EAC1C,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EACzB,KAAK,CACN,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,CAAC;QACV,CAAC;QACD,YAAY;QACZ,MAAM,IAAA,wBAAe,EACnB,QAAQ,EACR,YAAY,SAAS,YAAY,EACjC;YACE,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,QAAQ,CAAC,KAAK;YACrB,MAAM,EAAE,IAAI;SACb,EACD,MAAM,CACP,CAAC;IACJ,CAAC;IAED,QAAQ,CAAC,GAAG,CACV,kEAAkE,CACnE,CAAC;AACJ,CAAC,CAAC;AAlEW,QAAA,iBAAiB,qBAkE5B"}
|
|
@@ -1,3 +1,24 @@
|
|
|
1
1
|
import type { ComponentContext } from "../../../../../../../pipeline/src/index.js";
|
|
2
2
|
import type { IO } from "../../../../../core/types";
|
|
3
|
+
export declare const CLOUD_RUN_DEPLOY_SA_NAME = "cl-d";
|
|
4
|
+
/**
|
|
5
|
+
* the gcloud services the given deploy config requires.
|
|
6
|
+
*
|
|
7
|
+
* Shared with `project doctor`: setup enables them, doctor compares
|
|
8
|
+
* them against what is actually enabled — config edits after setup
|
|
9
|
+
* (e.g. adding `cloudSql`) would otherwise drift silently.
|
|
10
|
+
*/
|
|
11
|
+
export declare const getCloudRunRequiredServices: (config: {
|
|
12
|
+
cloudSql?: unknown;
|
|
13
|
+
}) => string[];
|
|
14
|
+
/**
|
|
15
|
+
* the IAM roles the deploy service account needs for the given deploy
|
|
16
|
+
* config. Shared with `project doctor` (same rationale as
|
|
17
|
+
* {@link getCloudRunRequiredServices}) — the motivating case: a
|
|
18
|
+
* component gets `cloudSql` after its setup ran, deploys keep working,
|
|
19
|
+
* and only the review teardown hits the missing `cloudsql.admin`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const getCloudRunDeployRoles: (config: {
|
|
22
|
+
cloudSql?: unknown;
|
|
23
|
+
}) => string[];
|
|
3
24
|
export declare const setupCloudRun: (instance: IO, context: ComponentContext) => Promise<void>;
|
|
@@ -3,13 +3,40 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.setupCloudRun = void 0;
|
|
6
|
+
exports.setupCloudRun = exports.getCloudRunDeployRoles = exports.getCloudRunRequiredServices = exports.CLOUD_RUN_DEPLOY_SA_NAME = void 0;
|
|
7
7
|
const pipeline_1 = require("../../../../../../../pipeline/src/index.js");
|
|
8
8
|
const artifactsRegistry_1 = require("../../../../../gcloud/artifactsRegistry");
|
|
9
9
|
const enableServices_1 = require("../../../../../gcloud/enableServices");
|
|
10
10
|
const getProjectNumber_1 = require("../../../../../gcloud/getProjectNumber");
|
|
11
11
|
const serviceAccounts_1 = require("../../../../../gcloud/serviceAccounts");
|
|
12
12
|
const updateCatladderStore_1 = require("../../../../../store/updateCatladderStore");
|
|
13
|
+
exports.CLOUD_RUN_DEPLOY_SA_NAME = "cl-d";
|
|
14
|
+
/**
|
|
15
|
+
* the gcloud services the given deploy config requires.
|
|
16
|
+
*
|
|
17
|
+
* Shared with `project doctor`: setup enables them, doctor compares
|
|
18
|
+
* them against what is actually enabled — config edits after setup
|
|
19
|
+
* (e.g. adding `cloudSql`) would otherwise drift silently.
|
|
20
|
+
*/
|
|
21
|
+
const getCloudRunRequiredServices = config => ["run.googleapis.com", "artifactregistry.googleapis.com", "cloudscheduler.googleapis.com",
|
|
22
|
+
// for scheduling jobs
|
|
23
|
+
"cloudresourcemanager.googleapis.com",
|
|
24
|
+
// only required to get google cloud project number
|
|
25
|
+
...(config.cloudSql ? ["sqladmin.googleapis.com", "sql-component.googleapis.com"] : [])];
|
|
26
|
+
exports.getCloudRunRequiredServices = getCloudRunRequiredServices;
|
|
27
|
+
/**
|
|
28
|
+
* the IAM roles the deploy service account needs for the given deploy
|
|
29
|
+
* config. Shared with `project doctor` (same rationale as
|
|
30
|
+
* {@link getCloudRunRequiredServices}) — the motivating case: a
|
|
31
|
+
* component gets `cloudSql` after its setup ran, deploys keep working,
|
|
32
|
+
* and only the review teardown hits the missing `cloudsql.admin`.
|
|
33
|
+
*/
|
|
34
|
+
const getCloudRunDeployRoles = config => [
|
|
35
|
+
// TODO: run.admin is a bit much, would be better to follow https://stackoverflow.com/questions/55788714/deploying-to-cloud-run-with-a-custom-service-account-failed-with-iam-serviceacco
|
|
36
|
+
"roles/artifactregistry.repoAdmin", "roles/run.admin", "roles/iam.serviceAccountUser", "roles/cloudscheduler.admin",
|
|
37
|
+
// for scheduling
|
|
38
|
+
...(config.cloudSql ? ["roles/cloudsql.admin"] : [])];
|
|
39
|
+
exports.getCloudRunDeployRoles = getCloudRunDeployRoles;
|
|
13
40
|
const setupCloudRun = async (instance, context) => {
|
|
14
41
|
var _a, _b;
|
|
15
42
|
if (!(0, pipeline_1.isOfDeployType)((_a = context.deploy) === null || _a === void 0 ? void 0 : _a.config, "google-cloudrun")) {
|
|
@@ -18,11 +45,7 @@ const setupCloudRun = async (instance, context) => {
|
|
|
18
45
|
const config = (_b = context.deploy) === null || _b === void 0 ? void 0 : _b.config;
|
|
19
46
|
// enable services
|
|
20
47
|
instance.log("enable required services...");
|
|
21
|
-
await (0, enableServices_1.enableGCloudServices)(
|
|
22
|
-
// for scheduling jobs
|
|
23
|
-
"cloudresourcemanager.googleapis.com",
|
|
24
|
-
// only required to get google cloud project number
|
|
25
|
-
...(config.cloudSql ? ["sqladmin.googleapis.com", "sql-component.googleapis.com"] : [])], config);
|
|
48
|
+
await (0, enableServices_1.enableGCloudServices)((0, exports.getCloudRunRequiredServices)(config), config);
|
|
26
49
|
instance.log("upsert artifacts registry...");
|
|
27
50
|
await (0, artifactsRegistry_1.upsertGcloudArtifactsRegistry)(config);
|
|
28
51
|
instance.log("upsert deploy service account...");
|
|
@@ -30,11 +53,8 @@ const setupCloudRun = async (instance, context) => {
|
|
|
30
53
|
projectId: config.projectId,
|
|
31
54
|
displayName: "Catladder gcloud deploy",
|
|
32
55
|
description: "This service account deploys to google cloud",
|
|
33
|
-
name:
|
|
34
|
-
|
|
35
|
-
roles: ["roles/artifactregistry.repoAdmin", "roles/run.admin", "roles/iam.serviceAccountUser", "roles/cloudscheduler.admin",
|
|
36
|
-
// for scheduling
|
|
37
|
-
...(config.cloudSql ? ["roles/cloudsql.admin"] : [])]
|
|
56
|
+
name: exports.CLOUD_RUN_DEPLOY_SA_NAME,
|
|
57
|
+
roles: (0, exports.getCloudRunDeployRoles)(config)
|
|
38
58
|
}, pipeline_1.GCLOUD_DEPLOY_CREDENTIALS_KEY);
|
|
39
59
|
// the project number is needed at generation time to construct cloud
|
|
40
60
|
// run's deterministic urls (<service>-<projectNumber>.<region>.run.app)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupCloudRun.js","sourceRoot":"","sources":["../../../../../../../../src/apps/cli/commands/project/setup/setupCloudRun.ts"],"names":[],"mappings":";;;AACA,kDAG6B;AAG7B,+EAAwF;AACxF,yEAA4E;AAC5E,6EAAkF;AAClF,2EAAgG;AAChG,oFAAiF;
|
|
1
|
+
{"version":3,"file":"setupCloudRun.js","sourceRoot":"","sources":["../../../../../../../../src/apps/cli/commands/project/setup/setupCloudRun.ts"],"names":[],"mappings":";;;AACA,kDAG6B;AAG7B,+EAAwF;AACxF,yEAA4E;AAC5E,6EAAkF;AAClF,2EAAgG;AAChG,oFAAiF;AAEpE,QAAA,wBAAwB,GAAG,MAAM,CAAC;AAE/C;;;;;;GAMG;AACI,MAAM,2BAA2B,GAAG,CAAC,MAE3C,EAAY,EAAE,CAAC;IACd,oBAAoB;IACpB,iCAAiC;IACjC,+BAA+B,EAAE,sBAAsB;IACvD,qCAAqC,EAAE,mDAAmD;IAC1F,GAAG,CAAC,MAAM,CAAC,QAAQ;QACjB,CAAC,CAAC,CAAC,yBAAyB,EAAE,8BAA8B,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAC;CACR,CAAC;AAVW,QAAA,2BAA2B,+BAUtC;AAEF;;;;;;GAMG;AACI,MAAM,sBAAsB,GAAG,CAAC,MAEtC,EAAY,EAAE,CAAC;IACd,yLAAyL;IACzL,kCAAkC;IAClC,iBAAiB;IACjB,8BAA8B;IAC9B,4BAA4B,EAAE,iBAAiB;IAC/C,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;CACrD,CAAC;AATW,QAAA,sBAAsB,0BASjC;AAEK,MAAM,aAAa,GAAG,KAAK,EAChC,QAAY,EACZ,OAAyB,EACzB,EAAE;;IACF,IAAI,CAAC,IAAA,yBAAc,EAAC,MAAA,OAAO,CAAC,MAAM,0CAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,0CAAE,MAAM,CAAC;IAEtC,kBAAkB;IAElB,QAAQ,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAC5C,MAAM,IAAA,qCAAoB,EAAC,IAAA,mCAA2B,EAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IACxE,QAAQ,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC7C,MAAM,IAAA,iDAA6B,EAAC,MAAM,CAAC,CAAC;IAE5C,QAAQ,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IACjD,MAAM,IAAA,yDAAuC,EAC3C,QAAQ,EACR,OAAO,EACP;QACE,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,WAAW,EAAE,yBAAyB;QACtC,WAAW,EAAE,8CAA8C;QAC3D,IAAI,EAAE,gCAAwB;QAC9B,KAAK,EAAE,IAAA,8BAAsB,EAAC,MAAM,CAAC;KACtC,EACD,wCAA6B,CAC9B,CAAC;IAEF,qEAAqE;IACrE,wEAAwE;IACxE,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC/C,MAAM,aAAa,GAAG,MAAM,IAAA,2CAAwB,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvE,QAAQ,CAAC,GAAG,CAAC,kBAAkB,GAAG,aAAa,CAAC,CAAC;IAEjD,MAAM,IAAA,2CAAoB,EAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACrC,GAAG,KAAK;QACR,cAAc,EAAE;YACd,GAAG,KAAK,CAAC,cAAc;YACvB,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,aAAa,EAAE;SACtC;KACF,CAAC,CAAC,CAAC;AACN,CAAC,CAAC;AA5CW,QAAA,aAAa,iBA4CxB"}
|
|
@@ -18,6 +18,7 @@ export { commandTriggerCronjobGeneral } from "./project/k8s/commandTriggerCronjo
|
|
|
18
18
|
export { commandRenewToken } from "./project/commandRenewToken";
|
|
19
19
|
export { commandGetMyTotalWorktime } from "./project/commandGetMyTotalWorktime";
|
|
20
20
|
export { commandSetup } from "./project/commandSetup";
|
|
21
|
+
export { commandDoctor } from "./project/commandDoctor";
|
|
21
22
|
export { commandCiJobOpen, commandCiJobLog } from "./project/commandGitlabCi";
|
|
22
23
|
export { commandProjectRestoreDb } from "./project/commandProjectRestoreDb";
|
|
23
24
|
export { commandSecurityEvaluate } from "./project/commandSecurityEvaluate";
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.commandStarwars = exports.commandDadjoke = exports.commandSecurityAuditCreate = exports.commandSecurityAuditEvaluate = exports.commandSecurityAuditCiJob = exports.commandRestoreDb = exports.commandMongoDestroyMember = exports.commandMongoPortForward = exports.commandMongoGetShell = exports.commandTriggerCronjobProject = exports.commandDeleteProject = exports.commandPauseProject = exports.commandDeletePods = exports.commandGetShell = exports.commandListPods = exports.commandNamespace = exports.commandSecurityEvaluate = exports.commandProjectRestoreDb = exports.commandCiJobLog = exports.commandCiJobOpen = exports.commandSetup = exports.commandGetMyTotalWorktime = exports.commandRenewToken = exports.commandTriggerCronjobGeneral = exports.commandOpenLogs = exports.commandSecretsSyncGithub = exports.commandSecretsClearBackups = exports.commandConfigSecrets = exports.commandCloudSqlProxy = exports.commandOpenGit = exports.commandOpenEnv = exports.commandPortForward = exports.commandEnvVars = exports.commandKubePortForward = exports.commandKubeGetShell = exports.commandKubeStopPortforward = exports.commandKubeListPods = exports.commandKubeListSecrets = exports.commandKubeListNamespaces = exports.commandKubeCurrentContext = void 0;
|
|
6
|
+
exports.commandStarwars = exports.commandDadjoke = exports.commandSecurityAuditCreate = exports.commandSecurityAuditEvaluate = exports.commandSecurityAuditCiJob = exports.commandRestoreDb = exports.commandMongoDestroyMember = exports.commandMongoPortForward = exports.commandMongoGetShell = exports.commandTriggerCronjobProject = exports.commandDeleteProject = exports.commandPauseProject = exports.commandDeletePods = exports.commandGetShell = exports.commandListPods = exports.commandNamespace = exports.commandSecurityEvaluate = exports.commandProjectRestoreDb = exports.commandCiJobLog = exports.commandCiJobOpen = exports.commandDoctor = exports.commandSetup = exports.commandGetMyTotalWorktime = exports.commandRenewToken = exports.commandTriggerCronjobGeneral = exports.commandOpenLogs = exports.commandSecretsSyncGithub = exports.commandSecretsClearBackups = exports.commandConfigSecrets = exports.commandCloudSqlProxy = exports.commandOpenGit = exports.commandOpenEnv = exports.commandPortForward = exports.commandEnvVars = exports.commandKubePortForward = exports.commandKubeGetShell = exports.commandKubeStopPortforward = exports.commandKubeListPods = exports.commandKubeListSecrets = exports.commandKubeListNamespaces = exports.commandKubeCurrentContext = void 0;
|
|
7
7
|
// General commands
|
|
8
8
|
var commandKubeCurrentContext_1 = require("./general/commandKubeCurrentContext");
|
|
9
9
|
Object.defineProperty(exports, "commandKubeCurrentContext", {
|
|
@@ -146,6 +146,13 @@ Object.defineProperty(exports, "commandSetup", {
|
|
|
146
146
|
return commandSetup_1.commandSetup;
|
|
147
147
|
}
|
|
148
148
|
});
|
|
149
|
+
var commandDoctor_1 = require("./project/commandDoctor");
|
|
150
|
+
Object.defineProperty(exports, "commandDoctor", {
|
|
151
|
+
enumerable: true,
|
|
152
|
+
get: function () {
|
|
153
|
+
return commandDoctor_1.commandDoctor;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
149
156
|
var commandGitlabCi_1 = require("./project/commandGitlabCi");
|
|
150
157
|
Object.defineProperty(exports, "commandCiJobOpen", {
|
|
151
158
|
enumerable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/index.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAClC,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAClC,2EAA0E;AAAjE,gIAAA,sBAAsB,OAAA;AAC/B,qEAAoE;AAA3D,0HAAA,mBAAmB,OAAA;AAC5B,mFAAkF;AAAzE,wIAAA,0BAA0B,OAAA;AACnC,qEAAoE;AAA3D,0HAAA,mBAAmB,OAAA;AAC5B,2EAA0E;AAAjE,gIAAA,sBAAsB,OAAA;AAE/B,mBAAmB;AACnB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,mEAAkE;AAAzD,wHAAA,kBAAkB,OAAA;AAC3B,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAC7B,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAC7B,mFAAkF;AAAzE,wIAAA,0BAA0B,OAAA;AACnC,+EAA8E;AAArE,oIAAA,wBAAwB,OAAA;AACjC,6DAA4D;AAAnD,kHAAA,eAAe,OAAA;AACxB,6EAAmF;AAA1E,qIAAA,4BAA4B,OAAA;AACrC,iEAAgE;AAAvD,sHAAA,iBAAiB,OAAA;AAC1B,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAClC,uDAAsD;AAA7C,4GAAA,YAAY,OAAA;AACrB,6DAA8E;AAArE,mHAAA,gBAAgB,OAAA;AAAE,kHAAA,eAAe,OAAA;AAC1C,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA;AAChC,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA;AAEhC,uBAAuB;AACvB,mEAAkE;AAAzD,oHAAA,gBAAgB,OAAA;AACzB,iEAAgE;AAAvD,kHAAA,eAAe,OAAA;AACxB,iEAAgE;AAAvD,kHAAA,eAAe,OAAA;AACxB,qEAAoE;AAA3D,sHAAA,iBAAiB,OAAA;AAC1B,yEAAwE;AAA/D,0HAAA,mBAAmB,OAAA;AAC5B,2EAA0E;AAAjE,4HAAA,oBAAoB,OAAA;AAC7B,6EAAmF;AAA1E,qIAAA,4BAA4B,OAAA;AAErC,mBAAmB;AACnB,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAC7B,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA;AAChC,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAElC,oBAAoB;AACpB,gEAA+D;AAAtD,oHAAA,gBAAgB,OAAA;AAEzB,oBAAoB;AACpB,kFAAiF;AAAxE,sIAAA,yBAAyB,OAAA;AAClC,wFAAuF;AAA9E,4IAAA,4BAA4B,OAAA;AACrC,oFAAmF;AAA1E,wIAAA,0BAA0B,OAAA;AAEnC,eAAe;AACf,uDAAsD;AAA7C,gHAAA,cAAc,OAAA;AACvB,yDAAwD;AAA/C,kHAAA,eAAe,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/commands/index.ts"],"names":[],"mappings":";;;AAAA,mBAAmB;AACnB,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAClC,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAClC,2EAA0E;AAAjE,gIAAA,sBAAsB,OAAA;AAC/B,qEAAoE;AAA3D,0HAAA,mBAAmB,OAAA;AAC5B,mFAAkF;AAAzE,wIAAA,0BAA0B,OAAA;AACnC,qEAAoE;AAA3D,0HAAA,mBAAmB,OAAA;AAC5B,2EAA0E;AAAjE,gIAAA,sBAAsB,OAAA;AAE/B,mBAAmB;AACnB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,mEAAkE;AAAzD,wHAAA,kBAAkB,OAAA;AAC3B,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AACvB,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAC7B,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAC7B,mFAAkF;AAAzE,wIAAA,0BAA0B,OAAA;AACnC,+EAA8E;AAArE,oIAAA,wBAAwB,OAAA;AACjC,6DAA4D;AAAnD,kHAAA,eAAe,OAAA;AACxB,6EAAmF;AAA1E,qIAAA,4BAA4B,OAAA;AACrC,iEAAgE;AAAvD,sHAAA,iBAAiB,OAAA;AAC1B,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAClC,uDAAsD;AAA7C,4GAAA,YAAY,OAAA;AACrB,yDAAwD;AAA/C,8GAAA,aAAa,OAAA;AACtB,6DAA8E;AAArE,mHAAA,gBAAgB,OAAA;AAAE,kHAAA,eAAe,OAAA;AAC1C,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA;AAChC,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA;AAEhC,uBAAuB;AACvB,mEAAkE;AAAzD,oHAAA,gBAAgB,OAAA;AACzB,iEAAgE;AAAvD,kHAAA,eAAe,OAAA;AACxB,iEAAgE;AAAvD,kHAAA,eAAe,OAAA;AACxB,qEAAoE;AAA3D,sHAAA,iBAAiB,OAAA;AAC1B,yEAAwE;AAA/D,0HAAA,mBAAmB,OAAA;AAC5B,2EAA0E;AAAjE,4HAAA,oBAAoB,OAAA;AAC7B,6EAAmF;AAA1E,qIAAA,4BAA4B,OAAA;AAErC,mBAAmB;AACnB,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAC7B,6EAA4E;AAAnE,kIAAA,uBAAuB,OAAA;AAChC,iFAAgF;AAAvE,sIAAA,yBAAyB,OAAA;AAElC,oBAAoB;AACpB,gEAA+D;AAAtD,oHAAA,gBAAgB,OAAA;AAEzB,oBAAoB;AACpB,kFAAiF;AAAxE,sIAAA,yBAAyB,OAAA;AAClC,wFAAuF;AAA9E,4IAAA,4BAA4B,OAAA;AACrC,oFAAmF;AAA1E,wIAAA,0BAA0B,OAAA;AAEnC,eAAe;AACf,uDAAsD;AAA7C,gHAAA,cAAc,OAAA;AACvB,yDAAwD;AAA/C,kHAAA,eAAe,OAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.commandDoctor = void 0;
|
|
7
|
+
const doctor_1 = require("../../apps/cli/commands/project/doctor");
|
|
8
|
+
const defineCommand_1 = require("../../core/defineCommand");
|
|
9
|
+
exports.commandDoctor = (0, defineCommand_1.defineCommand)({
|
|
10
|
+
name: "project doctor",
|
|
11
|
+
description: "Checks for drift between the config and the provisioned infrastructure (read-only): service accounts, IAM roles, gitlab tokens, github secrets, store entries.",
|
|
12
|
+
group: "project",
|
|
13
|
+
inputs: {
|
|
14
|
+
component: {
|
|
15
|
+
type: "string",
|
|
16
|
+
message: "component name",
|
|
17
|
+
positional: true,
|
|
18
|
+
required: false
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
execute: async ctx => {
|
|
22
|
+
const component = await ctx.get("component");
|
|
23
|
+
await (0, doctor_1.doctorProject)(ctx, component);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandDoctor.js","sourceRoot":"","sources":["../../../../../src/commands/project/commandDoctor.ts"],"names":[],"mappings":";;;AAAA,mEAAuE;AACvE,4DAAyD;AAE5C,QAAA,aAAa,GAAG,IAAA,6BAAa,EAAC;IACzC,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,gKAAgK;IAClK,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE;QACN,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,gBAAgB;YACzB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,KAAK;SAChB;KACF;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,IAAA,sBAAa,EAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.upsertGcloudArtifactsRegistry = void 0;
|
|
6
|
+
exports.upsertGcloudArtifactsRegistry = exports.CATLADDER_REGISTRY_NAME = void 0;
|
|
7
7
|
const child_process_promise_1 = require("child-process-promise");
|
|
8
|
+
exports.CATLADDER_REGISTRY_NAME = "catladder-deploy";
|
|
8
9
|
const upsertGcloudArtifactsRegistry = async config => {
|
|
9
10
|
try {
|
|
10
|
-
await (0, child_process_promise_1.exec)(`gcloud artifacts repositories create
|
|
11
|
+
await (0, child_process_promise_1.exec)(`gcloud artifacts repositories create ${exports.CATLADDER_REGISTRY_NAME} --project="${config.projectId}" --repository-format=docker --location=${config.region}`);
|
|
11
12
|
} catch (e) {
|
|
12
13
|
// probably already exists
|
|
13
14
|
//
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifactsRegistry.js","sourceRoot":"","sources":["../../../../src/gcloud/artifactsRegistry.ts"],"names":[],"mappings":";;;AACA,iEAA6C;
|
|
1
|
+
{"version":3,"file":"artifactsRegistry.js","sourceRoot":"","sources":["../../../../src/gcloud/artifactsRegistry.ts"],"names":[],"mappings":";;;AACA,iEAA6C;AAEhC,QAAA,uBAAuB,GAAG,kBAAkB,CAAC;AAEnD,MAAM,6BAA6B,GAAG,KAAK,EAAE,MAGnD,EAAE,EAAE;IACH,IAAI,CAAC;QACH,MAAM,IAAA,4BAAI,EACR,wCAAwC,+BAAuB,eAAe,MAAM,CAAC,SAAS,2CAA2C,MAAM,CAAC,MAAM,EAAE,CACzJ,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,0BAA0B;QAC1B,EAAE;IACJ,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,6BAA6B,iCAYxC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* the parts of a component context the naming depends on — structural
|
|
3
|
+
* subset of `ComponentContext` so the naming stays a pure function
|
|
4
|
+
*/
|
|
5
|
+
export type ServiceAccountNamingContext = {
|
|
6
|
+
env: string;
|
|
7
|
+
name: string;
|
|
8
|
+
fullConfig: {
|
|
9
|
+
customerName: string;
|
|
10
|
+
appName: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* the deterministic gcloud service account naming used by
|
|
15
|
+
* `project setup`. Extracted so `project doctor` can compute the
|
|
16
|
+
* expected identifier of an account without creating anything.
|
|
17
|
+
*
|
|
18
|
+
* gcloud limits account ids to 30 chars: the customer/app middle part
|
|
19
|
+
* (and, if even that is not enough, the env/component suffix) is
|
|
20
|
+
* replaced by a hash when the full name would not fit.
|
|
21
|
+
*/
|
|
22
|
+
export declare const getGcloudServiceAccountNames: (context: ServiceAccountNamingContext, account: {
|
|
23
|
+
name: string;
|
|
24
|
+
projectId: string;
|
|
25
|
+
}) => {
|
|
26
|
+
fullName: string;
|
|
27
|
+
fullIdentifier: string;
|
|
28
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getGcloudServiceAccountNames = void 0;
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
/**
|
|
9
|
+
* the deterministic gcloud service account naming used by
|
|
10
|
+
* `project setup`. Extracted so `project doctor` can compute the
|
|
11
|
+
* expected identifier of an account without creating anything.
|
|
12
|
+
*
|
|
13
|
+
* gcloud limits account ids to 30 chars: the customer/app middle part
|
|
14
|
+
* (and, if even that is not enough, the env/component suffix) is
|
|
15
|
+
* replaced by a hash when the full name would not fit.
|
|
16
|
+
*/
|
|
17
|
+
const getGcloudServiceAccountNames = (context, account) => {
|
|
18
|
+
const {
|
|
19
|
+
projectId,
|
|
20
|
+
name
|
|
21
|
+
} = account;
|
|
22
|
+
// name has limit of 30
|
|
23
|
+
const namePrefix = `${name}`;
|
|
24
|
+
const nameSuffixRaw = `${context.env}-${context.name}`;
|
|
25
|
+
const nameMiddleRaw = `${context.fullConfig.customerName}-${context.fullConfig.appName}`;
|
|
26
|
+
const MAX_LENGTH = 30;
|
|
27
|
+
const NUM_SEPARATORS = 2;
|
|
28
|
+
// we want to first hash middle, then suffix
|
|
29
|
+
// if for middle we have at least 1 char left, its ok, so we don't hash nameSuffix, otherwise we need to hash that as well
|
|
30
|
+
const middleMaxLength = MAX_LENGTH - namePrefix.length - nameSuffixRaw.length - NUM_SEPARATORS;
|
|
31
|
+
let nameMiddle;
|
|
32
|
+
let nameSuffix;
|
|
33
|
+
if (middleMaxLength < 1) {
|
|
34
|
+
nameMiddle = hashIfNessecary(nameMiddleRaw, 1);
|
|
35
|
+
nameSuffix = hashIfNessecary(nameSuffixRaw, MAX_LENGTH - namePrefix.length - 1 - NUM_SEPARATORS);
|
|
36
|
+
} else {
|
|
37
|
+
nameMiddle = hashIfNessecary(nameMiddleRaw, middleMaxLength);
|
|
38
|
+
nameSuffix = nameSuffixRaw;
|
|
39
|
+
}
|
|
40
|
+
const fullName = `${namePrefix}-${nameMiddle}-${nameSuffix}`;
|
|
41
|
+
const fullIdentifier = `${fullName}@${projectId}.iam.gserviceaccount.com`;
|
|
42
|
+
return {
|
|
43
|
+
fullName,
|
|
44
|
+
fullIdentifier
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
exports.getGcloudServiceAccountNames = getGcloudServiceAccountNames;
|
|
48
|
+
const hashIfNessecary = (str, maxLength) => str.length > maxLength ? hash(str, maxLength) : str;
|
|
49
|
+
const hash = (str, length) => {
|
|
50
|
+
return (0, crypto_1.createHmac)("sha256", str).digest("hex").substring(0, length);
|
|
51
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceAccountNames.js","sourceRoot":"","sources":["../../../../src/gcloud/serviceAccountNames.ts"],"names":[],"mappings":";;;AAAA,mCAAoC;AAYpC;;;;;;;;GAQG;AACI,MAAM,4BAA4B,GAAG,CAC1C,OAAoC,EACpC,OAA4C,EACE,EAAE;IAChD,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEpC,uBAAuB;IACvB,MAAM,UAAU,GAAG,GAAG,IAAI,EAAE,CAAC;IAC7B,MAAM,aAAa,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,MAAM,aAAa,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACzF,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,MAAM,cAAc,GAAG,CAAC,CAAC;IAEzB,4CAA4C;IAC5C,0HAA0H;IAE1H,MAAM,eAAe,GACnB,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,GAAG,cAAc,CAAC;IAEzE,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAkB,CAAC;IACvB,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;QACxB,UAAU,GAAG,eAAe,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QAC/C,UAAU,GAAG,eAAe,CAC1B,aAAa,EACb,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,cAAc,CACpD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAC7D,UAAU,GAAG,aAAa,CAAC;IAC7B,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,UAAU,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;IAC7D,MAAM,cAAc,GAAG,GAAG,QAAQ,IAAI,SAAS,0BAA0B,CAAC;IAE1E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;AACtC,CAAC,CAAC;AApCW,QAAA,4BAA4B,gCAoCvC;AAEF,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,SAAiB,EAAE,EAAE,CACzD,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAEtD,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,MAAc,EAAE,EAAE;IAC3C,OAAO,IAAA,mBAAU,EAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AACtE,CAAC,CAAC"}
|
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.upsertGcloudServiceAccountAndSaveSecret = exports.accountExists = void 0;
|
|
7
7
|
const child_process_promise_1 = require("child-process-promise");
|
|
8
|
-
const crypto_1 = require("crypto");
|
|
9
8
|
const gitlab_1 = require("../utils/gitlab");
|
|
9
|
+
const serviceAccountNames_1 = require("./serviceAccountNames");
|
|
10
10
|
const accountExists = async fullIdentifier => {
|
|
11
11
|
try {
|
|
12
12
|
await (0, child_process_promise_1.exec)(`gcloud iam service-accounts describe ${fullIdentifier}`);
|
|
@@ -19,32 +19,15 @@ exports.accountExists = accountExists;
|
|
|
19
19
|
const upsertGcloudServiceAccount = async (context, account) => {
|
|
20
20
|
const {
|
|
21
21
|
projectId,
|
|
22
|
-
name,
|
|
23
22
|
displayName,
|
|
24
23
|
roles,
|
|
25
24
|
description
|
|
26
25
|
} = account;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const MAX_LENGTH = 30;
|
|
32
|
-
const NUM_SEPARATORS = 2;
|
|
33
|
-
// we want to first hash middle, then suffix
|
|
34
|
-
// if for middle we have at least 1 char left, its ok, so we don't hash nameSuffix, otherwise we need to hash that as well
|
|
35
|
-
const middleMaxLength = MAX_LENGTH - namePrefix.length - nameSuffixRaw.length - NUM_SEPARATORS;
|
|
36
|
-
let nameMiddle;
|
|
37
|
-
let nameSuffix;
|
|
38
|
-
if (middleMaxLength < 1) {
|
|
39
|
-
nameMiddle = hashIfNessecary(nameMiddleRaw, 1);
|
|
40
|
-
nameSuffix = hashIfNessecary(nameSuffixRaw, MAX_LENGTH - namePrefix.length - 1 - NUM_SEPARATORS);
|
|
41
|
-
} else {
|
|
42
|
-
nameMiddle = hashIfNessecary(nameMiddleRaw, middleMaxLength);
|
|
43
|
-
nameSuffix = nameSuffixRaw;
|
|
44
|
-
}
|
|
45
|
-
const fullName = `${namePrefix}-${nameMiddle}-${nameSuffix}`;
|
|
26
|
+
const {
|
|
27
|
+
fullName,
|
|
28
|
+
fullIdentifier
|
|
29
|
+
} = (0, serviceAccountNames_1.getGcloudServiceAccountNames)(context, account);
|
|
46
30
|
const fullDisplayName = `${context.fullConfig.customerName}-${context.fullConfig.appName} ${context.env}:${context.name} | ${displayName}`;
|
|
47
|
-
const fullIdentifier = `${fullName}@${projectId}.iam.gserviceaccount.com`;
|
|
48
31
|
const existing = await (0, exports.accountExists)(fullIdentifier);
|
|
49
32
|
if (!existing) {
|
|
50
33
|
await (0, child_process_promise_1.exec)(`gcloud iam service-accounts create ${fullName} --display-name="${fullDisplayName}" --project="${projectId}" --description="${description}"`);
|
|
@@ -71,8 +54,4 @@ const upsertGcloudServiceAccountAndSaveSecret = async (instance, context, accoun
|
|
|
71
54
|
}, context.env, context.name);
|
|
72
55
|
instance.log("done!");
|
|
73
56
|
};
|
|
74
|
-
exports.upsertGcloudServiceAccountAndSaveSecret = upsertGcloudServiceAccountAndSaveSecret;
|
|
75
|
-
const hashIfNessecary = (str, maxLength) => str.length > maxLength ? hash(str, maxLength) : str;
|
|
76
|
-
const hash = (str, length) => {
|
|
77
|
-
return (0, crypto_1.createHmac)("sha256", str).digest("hex").substring(0, length);
|
|
78
|
-
};
|
|
57
|
+
exports.upsertGcloudServiceAccountAndSaveSecret = upsertGcloudServiceAccountAndSaveSecret;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serviceAccounts.js","sourceRoot":"","sources":["../../../../src/gcloud/serviceAccounts.ts"],"names":[],"mappings":";;;AAEA,iEAA6C;
|
|
1
|
+
{"version":3,"file":"serviceAccounts.js","sourceRoot":"","sources":["../../../../src/gcloud/serviceAccounts.ts"],"names":[],"mappings":";;;AAEA,iEAA6C;AAE7C,4CAAqD;AACrD,+DAAqE;AAE9D,MAAM,aAAa,GAAG,KAAK,EAAE,cAAsB,EAAE,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,IAAA,4BAAI,EAAC,wCAAwC,cAAc,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,WAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,aAAa,iBAOxB;AASF,MAAM,0BAA0B,GAAG,KAAK,EACtC,OAAyB,EACzB,OAAuB,EACN,EAAE;IACnB,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAA,kDAA4B,EAC/D,OAAO,EACP,OAAO,CACR,CAAC;IAEF,MAAM,eAAe,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,IAAI,MAAM,WAAW,EAAE,CAAC;IAE3I,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAa,EAAC,cAAc,CAAC,CAAC;IAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAA,4BAAI,EACR,sCAAsC,QAAQ,oBAAoB,eAAe,gBAAgB,SAAS,qBAAqB,WAAW,GAAG,CAC9I,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,kBAAkB,cAAc,EAAE,CAAC;IACtD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAA,4BAAI,EACR,0CAA0C,SAAS,aAAa,UAAU,WAAW,IAAI,mBAAmB,CAC7G,CAAC;IACJ,CAAC;IAED,aAAa;IAEb,wBAAwB;IACxB,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAI,EACrB,uDAAuD,cAAc,kCAAkC,CACxG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEpC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAA,4BAAI,EACR,2CAA2C,GAAG,CAAC,IAAI,0BAA0B,cAAc,EAAE,CAC9F,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,IAAA,4BAAI;IACf,kEAAkE;IAClE,qEAAqE,cAAc,QAAQ,CAC5F,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC,CAAC;AAEK,MAAM,uCAAuC,GAAG,KAAK,EAC1D,QAAY,EACZ,OAAyB,EACzB,OAAuB,EACvB,UAAkB,EACH,EAAE;IACjB,QAAQ,CAAC,GAAG,CAAC,4BAA4B,GAAG,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE/D,MAAM,IAAA,2BAAkB,EACtB,QAAQ,EACR;QACE,CAAC,UAAU,CAAC,EAAE,GAAG;KAClB,EACD,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,IAAI,CACb,CAAC;IACF,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC,CAAC;AAlBW,QAAA,uCAAuC,2CAkBlD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* maps over items with at most `limit` calls in flight, preserving the
|
|
3
|
+
* input order in the result (unlike reporting-as-you-go, this lets
|
|
4
|
+
* callers run slow per-item lookups in parallel and still log the
|
|
5
|
+
* outcomes in a stable order)
|
|
6
|
+
*/
|
|
7
|
+
export declare const mapWithConcurrency: <T, R>(items: T[], limit: number, fn: (item: T, index: number) => Promise<R>) => Promise<R[]>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.mapWithConcurrency = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* maps over items with at most `limit` calls in flight, preserving the
|
|
9
|
+
* input order in the result (unlike reporting-as-you-go, this lets
|
|
10
|
+
* callers run slow per-item lookups in parallel and still log the
|
|
11
|
+
* outcomes in a stable order)
|
|
12
|
+
*/
|
|
13
|
+
const mapWithConcurrency = async (items, limit, fn) => {
|
|
14
|
+
const results = new Array(items.length);
|
|
15
|
+
let next = 0;
|
|
16
|
+
const workers = Array.from({
|
|
17
|
+
length: Math.max(1, Math.min(limit, items.length))
|
|
18
|
+
}, async () => {
|
|
19
|
+
while (next < items.length) {
|
|
20
|
+
const index = next++;
|
|
21
|
+
results[index] = await fn(items[index], index);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
await Promise.all(workers);
|
|
25
|
+
return results;
|
|
26
|
+
};
|
|
27
|
+
exports.mapWithConcurrency = mapWithConcurrency;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../../../src/utils/concurrency.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,KAAK,EACrC,KAAU,EACV,KAAa,EACb,EAA0C,EAC5B,EAAE;IAChB,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,EACtD,KAAK,IAAI,EAAE;QACT,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CACF,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3B,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAlBW,QAAA,kBAAkB,sBAkB7B"}
|
|
@@ -8,6 +8,16 @@ export declare const isGhAuthenticated: () => Promise<boolean>;
|
|
|
8
8
|
* (`pipelines.github.gitRemote`, defaults to origin).
|
|
9
9
|
*/
|
|
10
10
|
export declare const getGithubRepoFromRemote: (remoteName: string) => Promise<string | undefined>;
|
|
11
|
+
/** names of all deployment environments of the repository */
|
|
12
|
+
export declare const listGithubEnvironments: (repo: string) => Promise<string[]>;
|
|
13
|
+
/**
|
|
14
|
+
* names of the actions secrets — of an environment, or of the repo
|
|
15
|
+
* level when no environment is given. Github secrets are write-only:
|
|
16
|
+
* names are all that can ever be inspected.
|
|
17
|
+
*/
|
|
18
|
+
export declare const listGithubSecretNames: (repo: string, environment?: string) => Promise<string[]>;
|
|
19
|
+
/** names of the actions variables (environment or repo level) */
|
|
20
|
+
export declare const listGithubVariableNames: (repo: string, environment?: string) => Promise<string[]>;
|
|
11
21
|
/**
|
|
12
22
|
* sets a github actions repository secret via the gh cli.
|
|
13
23
|
* The value is passed via stdin so it never shows up in a process list.
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.ensureGithubEnvironment = exports.setGithubVariable = exports.setGithubSecret = exports.getGithubRepoFromRemote = exports.isGhAuthenticated = void 0;
|
|
6
|
+
exports.ensureGithubEnvironment = exports.setGithubVariable = exports.setGithubSecret = exports.listGithubVariableNames = exports.listGithubSecretNames = exports.listGithubEnvironments = exports.getGithubRepoFromRemote = exports.isGhAuthenticated = void 0;
|
|
7
7
|
const child_process_1 = require("child_process");
|
|
8
8
|
const util_1 = require("util");
|
|
9
9
|
const execFile = (0, util_1.promisify)(child_process_1.execFile);
|
|
@@ -36,6 +36,31 @@ const getGithubRepoFromRemote = async remoteName => {
|
|
|
36
36
|
}
|
|
37
37
|
};
|
|
38
38
|
exports.getGithubRepoFromRemote = getGithubRepoFromRemote;
|
|
39
|
+
/**
|
|
40
|
+
* runs a paginated `gh api` query and returns the jq-extracted lines
|
|
41
|
+
* (one value per line, e.g. names)
|
|
42
|
+
*/
|
|
43
|
+
const ghApiLines = async (path, jq) => {
|
|
44
|
+
const {
|
|
45
|
+
stdout
|
|
46
|
+
} = await execFile("gh", ["api", "--paginate", path, "--jq", jq], {
|
|
47
|
+
maxBuffer: 10 * 1024 * 1024
|
|
48
|
+
});
|
|
49
|
+
return stdout.split("\n").map(line => line.trim()).filter(Boolean);
|
|
50
|
+
};
|
|
51
|
+
/** names of all deployment environments of the repository */
|
|
52
|
+
const listGithubEnvironments = repo => ghApiLines(`repos/${repo}/environments?per_page=100`, ".environments[].name");
|
|
53
|
+
exports.listGithubEnvironments = listGithubEnvironments;
|
|
54
|
+
/**
|
|
55
|
+
* names of the actions secrets — of an environment, or of the repo
|
|
56
|
+
* level when no environment is given. Github secrets are write-only:
|
|
57
|
+
* names are all that can ever be inspected.
|
|
58
|
+
*/
|
|
59
|
+
const listGithubSecretNames = (repo, environment) => ghApiLines(environment ? `repos/${repo}/environments/${encodeURIComponent(environment)}/secrets?per_page=100` : `repos/${repo}/actions/secrets?per_page=100`, ".secrets[].name");
|
|
60
|
+
exports.listGithubSecretNames = listGithubSecretNames;
|
|
61
|
+
/** names of the actions variables (environment or repo level) */
|
|
62
|
+
const listGithubVariableNames = (repo, environment) => ghApiLines(environment ? `repos/${repo}/environments/${encodeURIComponent(environment)}/variables?per_page=100` : `repos/${repo}/actions/variables?per_page=100`, ".variables[].name");
|
|
63
|
+
exports.listGithubVariableNames = listGithubVariableNames;
|
|
39
64
|
const ghSetViaStdin = (kind, repo, name, value, environment) => new Promise((resolve, reject) => {
|
|
40
65
|
var _a, _b;
|
|
41
66
|
const child = (0, child_process_1.spawn)("gh", [kind, "set", name, "--repo", repo, ...(environment ? ["--env", environment] : [])], {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/utils/github.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/utils/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,12 @@ export declare const setupGitlabToken: (io: IO) => Promise<void>;
|
|
|
5
5
|
export declare const getGitlabToken: (io: IO | null) => Promise<string>;
|
|
6
6
|
type Method = "GET" | "PUT" | "POST" | "DELETE";
|
|
7
7
|
export declare const doGitlabRequest: <T = any>(io: IO | null, path: string, data?: any, method?: Method) => Promise<T>;
|
|
8
|
+
/**
|
|
9
|
+
* GET a list endpoint across ALL pages (gitlab returns 20 items per
|
|
10
|
+
* page by default — long-lived projects easily exceed that, e.g.
|
|
11
|
+
* rotated access tokens accumulate one entry per rotation)
|
|
12
|
+
*/
|
|
13
|
+
export declare const doGitlabRequestAllPages: <T = any>(io: IO | null, path: string) => Promise<T[]>;
|
|
8
14
|
export declare const getProjectInfo: (io: IO | null) => Promise<{
|
|
9
15
|
id: string;
|
|
10
16
|
web_url: string;
|