@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.
Files changed (85) hide show
  1. package/dist/bundles/catenv/index.js +75 -12
  2. package/dist/bundles/cli/index.js +847 -51
  3. package/dist/cli/src/apps/cli/commands/project/doctor/DoctorReport.d.ts +22 -0
  4. package/dist/cli/src/apps/cli/commands/project/doctor/DoctorReport.js +75 -0
  5. package/dist/cli/src/apps/cli/commands/project/doctor/DoctorReport.js.map +1 -0
  6. package/dist/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.d.ts +15 -0
  7. package/dist/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.js +59 -0
  8. package/dist/cli/src/apps/cli/commands/project/doctor/GcloudProjectInspector.js.map +1 -0
  9. package/dist/cli/src/apps/cli/commands/project/doctor/checkCloudRun.d.ts +13 -0
  10. package/dist/cli/src/apps/cli/commands/project/doctor/checkCloudRun.js +120 -0
  11. package/dist/cli/src/apps/cli/commands/project/doctor/checkCloudRun.js.map +1 -0
  12. package/dist/cli/src/apps/cli/commands/project/doctor/checkGithub.d.ts +10 -0
  13. package/dist/cli/src/apps/cli/commands/project/doctor/checkGithub.js +100 -0
  14. package/dist/cli/src/apps/cli/commands/project/doctor/checkGithub.js.map +1 -0
  15. package/dist/cli/src/apps/cli/commands/project/doctor/checkGitlab.d.ts +13 -0
  16. package/dist/cli/src/apps/cli/commands/project/doctor/checkGitlab.js +79 -0
  17. package/dist/cli/src/apps/cli/commands/project/doctor/checkGitlab.js.map +1 -0
  18. package/dist/cli/src/apps/cli/commands/project/doctor/checkStore.d.ts +8 -0
  19. package/dist/cli/src/apps/cli/commands/project/doctor/checkStore.js +44 -0
  20. package/dist/cli/src/apps/cli/commands/project/doctor/checkStore.js.map +1 -0
  21. package/dist/cli/src/apps/cli/commands/project/doctor/index.d.ts +14 -0
  22. package/dist/cli/src/apps/cli/commands/project/doctor/index.js +48 -0
  23. package/dist/cli/src/apps/cli/commands/project/doctor/index.js.map +1 -0
  24. package/dist/cli/src/apps/cli/commands/project/setup/setupAccessTokens.js +4 -1
  25. package/dist/cli/src/apps/cli/commands/project/setup/setupAccessTokens.js.map +1 -1
  26. package/dist/cli/src/apps/cli/commands/project/setup/setupCloudRun.d.ts +21 -0
  27. package/dist/cli/src/apps/cli/commands/project/setup/setupCloudRun.js +31 -11
  28. package/dist/cli/src/apps/cli/commands/project/setup/setupCloudRun.js.map +1 -1
  29. package/dist/cli/src/commands/index.d.ts +1 -0
  30. package/dist/cli/src/commands/index.js +8 -1
  31. package/dist/cli/src/commands/index.js.map +1 -1
  32. package/dist/cli/src/commands/project/commandDoctor.d.ts +8 -0
  33. package/dist/cli/src/commands/project/commandDoctor.js +25 -0
  34. package/dist/cli/src/commands/project/commandDoctor.js.map +1 -0
  35. package/dist/cli/src/gcloud/artifactsRegistry.d.ts +1 -0
  36. package/dist/cli/src/gcloud/artifactsRegistry.js +3 -2
  37. package/dist/cli/src/gcloud/artifactsRegistry.js.map +1 -1
  38. package/dist/cli/src/gcloud/serviceAccountNames.d.ts +28 -0
  39. package/dist/cli/src/gcloud/serviceAccountNames.js +51 -0
  40. package/dist/cli/src/gcloud/serviceAccountNames.js.map +1 -0
  41. package/dist/cli/src/gcloud/serviceAccounts.js +6 -27
  42. package/dist/cli/src/gcloud/serviceAccounts.js.map +1 -1
  43. package/dist/cli/src/utils/concurrency.d.ts +7 -0
  44. package/dist/cli/src/utils/concurrency.js +27 -0
  45. package/dist/cli/src/utils/concurrency.js.map +1 -0
  46. package/dist/cli/src/utils/github.d.ts +10 -0
  47. package/dist/cli/src/utils/github.js +26 -1
  48. package/dist/cli/src/utils/github.js.map +1 -1
  49. package/dist/cli/src/utils/gitlab.d.ts +6 -0
  50. package/dist/cli/src/utils/gitlab.js +19 -1
  51. package/dist/cli/src/utils/gitlab.js.map +1 -1
  52. package/dist/pipeline/src/backends/github/createGithubJobs.js +24 -2
  53. package/dist/pipeline/src/backends/github/createGithubJobs.js.map +1 -1
  54. package/dist/pipeline/src/backends/gitlab/createGitlabJobs.js +8 -7
  55. package/dist/pipeline/src/backends/gitlab/createGitlabJobs.js.map +1 -1
  56. package/dist/pipeline/src/build/cache/createJobCache.js +8 -0
  57. package/dist/pipeline/src/build/cache/createJobCache.js.map +1 -1
  58. package/dist/pipeline/src/build/node/cache.js +15 -1
  59. package/dist/pipeline/src/build/node/cache.js.map +1 -1
  60. package/dist/pipeline/src/build/types.d.ts +19 -0
  61. package/dist/pipeline/src/build/types.js.map +1 -1
  62. package/dist/pipeline/src/constants.js +1 -1
  63. package/dist/pipeline/src/types/jobs.d.ts +6 -0
  64. package/dist/pipeline/src/types/jobs.js.map +1 -1
  65. package/dist/tsconfig.tsbuildinfo +1 -1
  66. package/package.json +1 -1
  67. package/src/apps/cli/commands/project/doctor/DoctorReport.ts +72 -0
  68. package/src/apps/cli/commands/project/doctor/GcloudProjectInspector.ts +77 -0
  69. package/src/apps/cli/commands/project/doctor/checkCloudRun.ts +148 -0
  70. package/src/apps/cli/commands/project/doctor/checkGithub.ts +156 -0
  71. package/src/apps/cli/commands/project/doctor/checkGitlab.ts +133 -0
  72. package/src/apps/cli/commands/project/doctor/checkStore.ts +43 -0
  73. package/src/apps/cli/commands/project/doctor/index.ts +59 -0
  74. package/src/apps/cli/commands/project/setup/setupAccessTokens.ts +9 -2
  75. package/src/apps/cli/commands/project/setup/setupCloudRun.ts +42 -21
  76. package/src/commands/index.ts +1 -0
  77. package/src/commands/project/commandDoctor.ts +21 -0
  78. package/src/gcloud/__tests__/serviceAccountNames.test.ts +63 -0
  79. package/src/gcloud/artifactsRegistry.ts +3 -1
  80. package/src/gcloud/serviceAccountNames.ts +65 -0
  81. package/src/gcloud/serviceAccounts.ts +6 -38
  82. package/src/utils/concurrency.ts +25 -0
  83. package/src/utils/github.ts +48 -0
  84. package/src/utils/gitlab.ts +24 -0
  85. 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
- const projectTokens = await (0, gitlab_1.doGitlabRequest)(instance, `projects/${projectId}/access_tokens`);
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,wDAA8E;AAE9E,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,MAAM,aAAa,GAAG,MAAM,IAAA,wBAAe,EACzC,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;AA/DW,QAAA,iBAAiB,qBA+D5B"}
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)(["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"] : [])], 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: "cl-d",
34
- // 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
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;AAE1E,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,EACxB;QACE,oBAAoB;QACpB,iCAAiC;QACjC,+BAA+B,EAAE,sBAAsB;QACvD,qCAAqC,EAAE,mDAAmD;QAC1F,GAAG,CAAC,MAAM,CAAC,QAAQ;YACjB,CAAC,CAAC,CAAC,yBAAyB,EAAE,8BAA8B,CAAC;YAC7D,CAAC,CAAC,EAAE,CAAC;KACR,EACD,MAAM,CACP,CAAC;IACF,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,MAAM;QACZ,yLAAyL;QACzL,KAAK,EAAE;YACL,kCAAkC;YAClC,iBAAiB;YACjB,8BAA8B;YAC9B,4BAA4B,EAAE,iBAAiB;YAC/C,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrD;KACF,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;AA9DW,QAAA,aAAa,iBA8DxB"}
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,8 @@
1
+ export declare const commandDoctor: import("../../core").CommandDef<{
2
+ readonly component: {
3
+ readonly type: "string";
4
+ readonly message: "component name";
5
+ readonly positional: true;
6
+ readonly required: false;
7
+ };
8
+ }>;
@@ -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"}
@@ -1,4 +1,5 @@
1
1
  import type { Gcloudregion } from "../../../pipeline/src/index.js";
2
+ export declare const CATLADDER_REGISTRY_NAME = "catladder-deploy";
2
3
  export declare const upsertGcloudArtifactsRegistry: (config: {
3
4
  projectId: string;
4
5
  region: Gcloudregion;
@@ -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 catladder-deploy --project="${config.projectId}" --repository-format=docker --location=${config.region}`);
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;AAEtC,MAAM,6BAA6B,GAAG,KAAK,EAAE,MAGnD,EAAE,EAAE;IACH,IAAI,CAAC;QACH,MAAM,IAAA,4BAAI,EACR,oEAAoE,MAAM,CAAC,SAAS,2CAA2C,MAAM,CAAC,MAAM,EAAE,CAC/I,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,0BAA0B;QAC1B,EAAE;IACJ,CAAC;AACH,CAAC,CAAC;AAZW,QAAA,6BAA6B,iCAYxC"}
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
- // name has limit of 30
28
- const namePrefix = `${name}`;
29
- const nameSuffixRaw = `${context.env}-${context.name}`;
30
- const nameMiddleRaw = `${context.fullConfig.customerName}-${context.fullConfig.appName}`;
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":"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"}
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;