@payfit/nx-core 0.0.0-e2e

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 (136) hide show
  1. package/README.md +173 -0
  2. package/dist/src/codegen.d.ts +3 -0
  3. package/dist/src/codegen.js +25 -0
  4. package/dist/src/codegen.js.map +1 -0
  5. package/dist/src/executors/preview-deploy/README.md +5 -0
  6. package/dist/src/executors/preview-deploy/argocdOverride.d.ts +4 -0
  7. package/dist/src/executors/preview-deploy/argocdOverride.js +22 -0
  8. package/dist/src/executors/preview-deploy/argocdOverride.js.map +1 -0
  9. package/dist/src/executors/preview-deploy/executor.d.ts +4 -0
  10. package/dist/src/executors/preview-deploy/executor.js +143 -0
  11. package/dist/src/executors/preview-deploy/executor.js.map +1 -0
  12. package/dist/src/executors/preview-deploy/kargoPolicy.d.ts +14 -0
  13. package/dist/src/executors/preview-deploy/kargoPolicy.js +69 -0
  14. package/dist/src/executors/preview-deploy/kargoPolicy.js.map +1 -0
  15. package/dist/src/executors/preview-deploy/schema.json +28 -0
  16. package/dist/src/executors/publisher/README.md +3 -0
  17. package/dist/src/executors/publisher/docker.d.ts +3 -0
  18. package/dist/src/executors/publisher/docker.js +66 -0
  19. package/dist/src/executors/publisher/docker.js.map +1 -0
  20. package/dist/src/executors/publisher/executor.d.ts +4 -0
  21. package/dist/src/executors/publisher/executor.js +20 -0
  22. package/dist/src/executors/publisher/executor.js.map +1 -0
  23. package/dist/src/executors/publisher/helm.d.ts +3 -0
  24. package/dist/src/executors/publisher/helm.js +69 -0
  25. package/dist/src/executors/publisher/helm.js.map +1 -0
  26. package/dist/src/executors/publisher/lambda.d.ts +18 -0
  27. package/dist/src/executors/publisher/lambda.js +86 -0
  28. package/dist/src/executors/publisher/lambda.js.map +1 -0
  29. package/dist/src/executors/publisher/schema.json +62 -0
  30. package/dist/src/executors/release/README.md +15 -0
  31. package/dist/src/executors/release/executor.d.ts +4 -0
  32. package/dist/src/executors/release/executor.js +104 -0
  33. package/dist/src/executors/release/executor.js.map +1 -0
  34. package/dist/src/executors/release/schema.json +37 -0
  35. package/dist/src/generators/init/README.md +5 -0
  36. package/dist/src/generators/init/files/.circleci/config.yml.template +232 -0
  37. package/dist/src/generators/init/files/.circleci/teleport/shared-charts.conf.template +24 -0
  38. package/dist/src/generators/init/files/.npmrc.template +1 -0
  39. package/dist/src/generators/init/init.d.ts +13 -0
  40. package/dist/src/generators/init/init.js +278 -0
  41. package/dist/src/generators/init/init.js.map +1 -0
  42. package/dist/src/generators/init/schema.json +7 -0
  43. package/dist/src/index.d.ts +27 -0
  44. package/dist/src/index.js +118 -0
  45. package/dist/src/index.js.map +1 -0
  46. package/dist/src/scripts/codegen-with-auth.js +55 -0
  47. package/dist/src/scripts/version-actions.d.ts +8 -0
  48. package/dist/src/scripts/version-actions.js +41 -0
  49. package/dist/src/scripts/version-actions.js.map +1 -0
  50. package/dist/src/scripts/version-actions.mock.d.ts +6 -0
  51. package/dist/src/scripts/version-actions.mock.js +61 -0
  52. package/dist/src/scripts/version-actions.mock.js.map +1 -0
  53. package/dist/src/utils/common/aws-auth.d.ts +47 -0
  54. package/dist/src/utils/common/aws-auth.js +145 -0
  55. package/dist/src/utils/common/aws-auth.js.map +1 -0
  56. package/dist/src/utils/common/circleci.d.ts +2 -0
  57. package/dist/src/utils/common/circleci.js +20 -0
  58. package/dist/src/utils/common/circleci.js.map +1 -0
  59. package/dist/src/utils/common/exec.d.ts +4 -0
  60. package/dist/src/utils/common/exec.js +52 -0
  61. package/dist/src/utils/common/exec.js.map +1 -0
  62. package/dist/src/utils/common/github.d.ts +20 -0
  63. package/dist/src/utils/common/github.js +60 -0
  64. package/dist/src/utils/common/github.js.map +1 -0
  65. package/dist/src/utils/common/import-esm.d.ts +2 -0
  66. package/dist/src/utils/common/import-esm.js +12 -0
  67. package/dist/src/utils/common/import-esm.js.map +1 -0
  68. package/dist/src/utils/common/logger.d.ts +1 -0
  69. package/dist/src/utils/common/logger.js +8 -0
  70. package/dist/src/utils/common/logger.js.map +1 -0
  71. package/dist/src/utils/common/nx.d.ts +22 -0
  72. package/dist/src/utils/common/nx.js +174 -0
  73. package/dist/src/utils/common/nx.js.map +1 -0
  74. package/dist/src/utils/common/s3.d.ts +1 -0
  75. package/dist/src/utils/common/s3.js +18 -0
  76. package/dist/src/utils/common/s3.js.map +1 -0
  77. package/dist/src/utils/common/tsh.d.ts +11 -0
  78. package/dist/src/utils/common/tsh.js +112 -0
  79. package/dist/src/utils/common/tsh.js.map +1 -0
  80. package/dist/src/utils/datadog.d.ts +1 -0
  81. package/dist/src/utils/datadog.js +33 -0
  82. package/dist/src/utils/datadog.js.map +1 -0
  83. package/dist/src/utils/docker.d.ts +15 -0
  84. package/dist/src/utils/docker.js +73 -0
  85. package/dist/src/utils/docker.js.map +1 -0
  86. package/dist/src/utils/helm.d.ts +64 -0
  87. package/dist/src/utils/helm.js +159 -0
  88. package/dist/src/utils/helm.js.map +1 -0
  89. package/dist/src/utils/helm.mock.d.ts +85 -0
  90. package/dist/src/utils/helm.mock.js +100 -0
  91. package/dist/src/utils/helm.mock.js.map +1 -0
  92. package/dist/src/utils/lambda/aws-lambda.d.ts +47 -0
  93. package/dist/src/utils/lambda/aws-lambda.js +231 -0
  94. package/dist/src/utils/lambda/aws-lambda.js.map +1 -0
  95. package/dist/src/utils/lambda/lambda.d.ts +7 -0
  96. package/dist/src/utils/lambda/lambda.js +20 -0
  97. package/dist/src/utils/lambda/lambda.js.map +1 -0
  98. package/dist/src/utils/lambda/oci.d.ts +8 -0
  99. package/dist/src/utils/lambda/oci.js +22 -0
  100. package/dist/src/utils/lambda/oci.js.map +1 -0
  101. package/dist/src/utils/lambda/publish.d.ts +14 -0
  102. package/dist/src/utils/lambda/publish.js +44 -0
  103. package/dist/src/utils/lambda/publish.js.map +1 -0
  104. package/dist/src/utils/lambda/spacelift.d.ts +3 -0
  105. package/dist/src/utils/lambda/spacelift.js +55 -0
  106. package/dist/src/utils/lambda/spacelift.js.map +1 -0
  107. package/dist/src/utils/spacelift/lib/__generated__/fragment-masking.d.ts +19 -0
  108. package/dist/src/utils/spacelift/lib/__generated__/fragment-masking.js +22 -0
  109. package/dist/src/utils/spacelift/lib/__generated__/fragment-masking.js.map +1 -0
  110. package/dist/src/utils/spacelift/lib/__generated__/gql.d.ts +15 -0
  111. package/dist/src/utils/spacelift/lib/__generated__/gql.js +8 -0
  112. package/dist/src/utils/spacelift/lib/__generated__/gql.js.map +1 -0
  113. package/dist/src/utils/spacelift/lib/__generated__/graphql.d.ts +9426 -0
  114. package/dist/src/utils/spacelift/lib/__generated__/graphql.js +819 -0
  115. package/dist/src/utils/spacelift/lib/__generated__/graphql.js.map +1 -0
  116. package/dist/src/utils/spacelift/lib/__generated__/index.d.ts +2 -0
  117. package/dist/src/utils/spacelift/lib/__generated__/index.js +6 -0
  118. package/dist/src/utils/spacelift/lib/__generated__/index.js.map +1 -0
  119. package/dist/src/utils/spacelift/lib/graphql.service.d.ts +18 -0
  120. package/dist/src/utils/spacelift/lib/graphql.service.js +186 -0
  121. package/dist/src/utils/spacelift/lib/graphql.service.js.map +1 -0
  122. package/dist/src/utils/spacelift/lib/query/spacelift.queries.d.ts +34 -0
  123. package/dist/src/utils/spacelift/lib/query/spacelift.queries.js +48 -0
  124. package/dist/src/utils/spacelift/lib/query/spacelift.queries.js.map +1 -0
  125. package/dist/src/utils/spacelift/lib/spacelift.error.d.ts +43 -0
  126. package/dist/src/utils/spacelift/lib/spacelift.error.js +63 -0
  127. package/dist/src/utils/spacelift/lib/spacelift.error.js.map +1 -0
  128. package/dist/src/utils/spacelift/lib/spacelift.service.d.ts +16 -0
  129. package/dist/src/utils/spacelift/lib/spacelift.service.js +58 -0
  130. package/dist/src/utils/spacelift/lib/spacelift.service.js.map +1 -0
  131. package/dist/src/utils/spacelift/lib/utils.d.ts +4 -0
  132. package/dist/src/utils/spacelift/lib/utils.js +32 -0
  133. package/dist/src/utils/spacelift/lib/utils.js.map +1 -0
  134. package/executors.json +19 -0
  135. package/generators.json +9 -0
  136. package/package.json +60 -0
package/README.md ADDED
@@ -0,0 +1,173 @@
1
+ # @payfit/nx-core
2
+
3
+ A Nx plugin that simplifies Docker image and Helm chart packaging and releases using Nx's versionActions feature.
4
+
5
+ ## Features
6
+
7
+ - Automated Docker image building and publishing
8
+ - Helm chart packaging and versioning
9
+ - AWS Lambda function packaging and deployment
10
+ - Transparent version management through Nx's versionActions
11
+ - Seamless integration with your Nx workspace
12
+ - Auto setup using init generator to update your repository at plugin installation
13
+
14
+ ## Prerequisites
15
+
16
+ - yarn v4
17
+ - Nx up-to-date https://github.com/nrwl/nx/releases
18
+
19
+ ## Installation
20
+
21
+ ```shell
22
+ npx nx add @payfit/nx-core
23
+ ```
24
+
25
+ This command will:
26
+
27
+ - Install the package as a dev dependency
28
+ - Run the [init generator](./src/generators/init) to set up the necessary configuration
29
+ - Update your workspace configuration automatically
30
+
31
+ ### Init generator
32
+
33
+ Using the above command will setup your repo with the default recommended configuration. You are free to edit this configuration to your needs.
34
+
35
+ It will also generate the CircleCI config file & Teleport file needed.
36
+
37
+ The plugin uses Nx's versionActions to handle versioning transparently. [We only override the semver calculation to switch it to calver (which you can opt out)](./src/scripts/version-actions.ts).
38
+
39
+ ## Usage
40
+
41
+ ### Docker Image Release
42
+
43
+ The plugin automatically handles:
44
+
45
+ - Building Docker images
46
+ - Tagging with appropriate versions
47
+ - Publishing to your container registry
48
+
49
+ ### Helm Chart Release
50
+
51
+ The plugin manages:
52
+
53
+ - Chart version updates
54
+ - Chart packaging
55
+ - Chart publishing
56
+ - Automatic image tag patching in values.yaml files
57
+
58
+ #### Image Tag Patching Behavior
59
+
60
+ When releasing a new version, the plugin automatically updates Docker image tags in your Helm chart's `values.yaml` file. The patching behavior handles three scenarios:
61
+
62
+ 1. **Dependencies Only**: If your `values.yaml` contains service entries that match the dependencies in your `Chart.yaml`, the plugin will update the image tags for these services.
63
+
64
+ 2. **Global Tag Only**: If your `values.yaml` contains a global image tag (at `image.tag`), the plugin will update this tag with the new version.
65
+
66
+ 3. **Both Dependencies and Global Tag**: If both dependency-specific tags and a global tag are present, the plugin will update all of them to maintain consistency.
67
+
68
+ This ensures that all relevant image tags are updated to the new version during the release process, regardless of your Helm chart's structure.
69
+
70
+ ### Lambda Function Release
71
+
72
+ The plugin automates the process of packaging and deploying AWS Lambda functions:
73
+
74
+ - Creating a zip archive from your Lambda function code
75
+ - Uploading the archive to an S3 bucket
76
+ - Creating an empty OCI artifact and pushing it to ECR for versioning
77
+
78
+ #### Lambda Configuration Parameters
79
+
80
+ When using Lambda functions, you can configure the following parameters in your project's `project.json` file:
81
+
82
+ ```json
83
+ {
84
+ "metadata": {
85
+ "lambdaFunctions": ["your-lambda-registry"],
86
+ "lambdaStacks": ["your-lambda-stack"],
87
+ "lambdaBucket": "your-lambda-bucket",
88
+ "lambdaHealthCheckPayload": "your-lambda-payload-json-string-formatted"
89
+ }
90
+ }
91
+ ```
92
+
93
+ These fields are used to:
94
+
95
+ - `lambdaFunctions`: Lambda functions to deploy
96
+ - `lambdaStacks`: Spacelift stacks deploying lambdas
97
+ - `lambdaBucket`: the S3 bucket where Lambda function zip archives are stored
98
+ - `lambdaHealthCheckPayload`: Payload used for smoke tests invocation
99
+
100
+ If `lambdaBucket` is not specified, the plugin will fall back to the default bucket: `payfit-shared-lambda-artifacts`.
101
+
102
+ #### Lambda Detection
103
+
104
+ The plugin automatically detects Lambda functions by looking for a `lambdaFunctions` metadata in your project root. When this metadata is present, the plugin will configure the necessary targets for packaging and deploying your Lambda function.
105
+
106
+ ## Configuration
107
+
108
+ You'll need to add the following metadata to your project's `project.json` file:
109
+
110
+ ```json
111
+ {
112
+ "metadata": {
113
+ "ecrRegistry": "your-app-name",
114
+ "chartRegistry": "your-chart-registry",
115
+ "ociEcrRegistry": "your-app-name",
116
+ "helmChartFolder": "your-helm-folder",
117
+ "lambdaFunctions": ["your-lambda-registry"],
118
+ "lambdaStacks": ["your-lambda-stack"],
119
+ "lambdaBucket": "your-lambda-bucket",
120
+ "lambdaHealthCheckPayload": "your-lambda-payload-json-string-formatted"
121
+ }
122
+ }
123
+ ```
124
+
125
+ These fields are used to:
126
+
127
+ - `ecrRegistry`: the ECR repository name for Docker images
128
+ - `chartRegistry`: the Helm chart registry
129
+ - `ociEcrRegistry`: the OCI registry for container images
130
+ - `helmChartFolder`: the folder containing Helm chart files (Chart.yaml, values.yaml, etc.), defaults to `.deploy`
131
+ - `lambdaStacks`: the spacelift stacks containing lambda to deploy
132
+ - `lambdaFunctions`: the lambda functions to deploy
133
+ - `lambdaBucket`: the S3 bucket where Lambda function zip archives are stored (defaults to `payfit-shared-lambda-artifacts`)
134
+ - `lambdaHealthCheckPayload`: Payload used for smoke tests invocation before lambda being released
135
+
136
+ ## Automatic Release Target Inference
137
+
138
+ The plugin automatically infers release targets for your projects based on the presence of deployment files:
139
+
140
+ 1. **Docker Image Release**: If a `Dockerfile` exists in your project root, the plugin will automatically:
141
+ - Configure Docker image building and publishing
142
+ - Set up version management for the image
143
+ - Handle ECR repository integration
144
+
145
+ 2. **Helm Chart Release**: If a `Chart.yaml` exists in your Helm chart folder (defaults to `.deploy/Chart.yaml`), the plugin will automatically:
146
+ - Configure Helm chart packaging and versioning
147
+ - Set up chart publishing to your registry
148
+ - Handle chart dependencies and updates
149
+
150
+ 3. **Lambda Function Release**: If a `.lambda` file exists in your project root, the plugin will automatically:
151
+ - Configure Lambda function packaging (zip archive creation)
152
+ - Set up S3 bucket uploading for the Lambda artifact
153
+ - Create and push an empty OCI artifact to ECR for versioning
154
+
155
+ The inference of the `nx-release-publish` target is handled through Nx's plugin system, which automatically adds the necessary targets and version actions to your project configuration. You don't need to manually configure these targets.
156
+
157
+ ---
158
+
159
+ # Debug locally
160
+
161
+ 1. Build everything:
162
+
163
+ ```bash
164
+ npx nx run-many -t build
165
+ ```
166
+
167
+ 2. Trigger a new release using the local plugin version:
168
+
169
+ ```bash
170
+ npx nx run @payfit/nx-common-packages:release --dry-run
171
+ ```
172
+
173
+ Make sure you pushed a change to your branch to actually trigger a release, otherwise it will say something like `No project to publish`
@@ -0,0 +1,3 @@
1
+ import { CodegenConfig } from '@graphql-codegen/cli';
2
+ declare const config: CodegenConfig;
3
+ export default config;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const path = './packages/nx-core/src/utils/spacelift/lib/__generated__/';
4
+ const config = {
5
+ schema: {
6
+ [process.env.SPACELIFT_API_URL ||
7
+ 'https://payfit.app.spacelift.io/graphql']: {
8
+ headers: {
9
+ Authorization: `Bearer ${process.env.SPACELIFT_JWT_TOKEN}`,
10
+ },
11
+ },
12
+ },
13
+ generates: {
14
+ [path]: {
15
+ preset: 'client',
16
+ plugins: [],
17
+ presetConfig: {
18
+ gqlTagName: 'gql',
19
+ },
20
+ },
21
+ },
22
+ ignoreNoDocuments: true,
23
+ };
24
+ exports.default = config;
25
+ //# sourceMappingURL=codegen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codegen.js","sourceRoot":"","sources":["../../src/codegen.ts"],"names":[],"mappings":";;AAEA,MAAM,IAAI,GAAG,2DAA2D,CAAA;AAExE,MAAM,MAAM,GAAkB;IAC5B,MAAM,EAAE;QACN,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC9B,yCAAyC,CAAC,EAAE;YAC1C,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE;aAC3D;SACF;KACF;IACD,SAAS,EAAE;QACT,CAAC,IAAI,CAAC,EAAE;YACN,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE;YACX,YAAY,EAAE;gBACZ,UAAU,EAAE,KAAK;aAClB;SACF;KACF;IACD,iBAAiB,EAAE,IAAI;CACxB,CAAA;AAED,kBAAe,MAAM,CAAA"}
@@ -0,0 +1,5 @@
1
+ # nx-core preview-deploy executor
2
+
3
+ This executor updates the ArgoCD and Kargo policy configurations to switch the deployment of a specific application to a different branch for a given environment.
4
+
5
+ It is based on the [domain-enrollment documentation](https://github.com/PayFit/domain-enrollment/blob/main/docs/how-to/002-sync-dev-pr.md)
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Updates the ArgoCD override configuration based on the target branch
3
+ */
4
+ export declare function updateArgoCDOverride(argocdOverride: Record<string, unknown>, targetBranchName: string): Record<string, unknown> | undefined;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateArgoCDOverride = updateArgoCDOverride;
4
+ const github_1 = require("../../utils/common/github");
5
+ /**
6
+ * Updates the ArgoCD override configuration based on the target branch
7
+ */
8
+ function updateArgoCDOverride(argocdOverride, targetBranchName) {
9
+ // Handle main/master branches - remove target revision
10
+ if ((0, github_1.isDefaultBranch)(targetBranchName)) {
11
+ if (argocdOverride.targetRevision) {
12
+ delete argocdOverride.targetRevision;
13
+ return argocdOverride;
14
+ }
15
+ // No changes needed if targetRevision doesn't exist
16
+ return;
17
+ }
18
+ // Handle feature branches - set target revision
19
+ argocdOverride.targetRevision = targetBranchName;
20
+ return argocdOverride;
21
+ }
22
+ //# sourceMappingURL=argocdOverride.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"argocdOverride.js","sourceRoot":"","sources":["../../../../src/executors/preview-deploy/argocdOverride.ts"],"names":[],"mappings":";;AAKA,oDAiBC;AAtBD,sDAA2D;AAE3D;;GAEG;AACH,SAAgB,oBAAoB,CAClC,cAAuC,EACvC,gBAAwB;IAExB,uDAAuD;IACvD,IAAI,IAAA,wBAAe,EAAC,gBAAgB,CAAC,EAAE,CAAC;QACtC,IAAI,cAAc,CAAC,cAAc,EAAE,CAAC;YAClC,OAAO,cAAc,CAAC,cAAc,CAAA;YACpC,OAAO,cAAc,CAAA;QACvB,CAAC;QACD,oDAAoD;QACpD,OAAM;IACR,CAAC;IAED,gDAAgD;IAChD,cAAc,CAAC,cAAc,GAAG,gBAAgB,CAAA;IAChD,OAAO,cAAc,CAAA;AACvB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ExecutorContext } from '@nx/devkit';
2
+ import { PreviewDeployExecutorOptions, PreviewDeployExecutorSchema } from './schema';
3
+ declare const runExecutor: (options: PreviewDeployExecutorOptions, context: ExecutorContext) => Promise<PreviewDeployExecutorSchema>;
4
+ export default runExecutor;
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const auth_app_1 = require("@octokit/auth-app");
4
+ const rest_1 = require("@octokit/rest");
5
+ const yaml = require("yaml");
6
+ const logger_1 = require("../../utils/common/logger");
7
+ const argocdOverride_1 = require("./argocdOverride");
8
+ const kargoPolicy_1 = require("./kargoPolicy");
9
+ function readFileYamlContent(file) {
10
+ if (!file) {
11
+ return undefined;
12
+ }
13
+ // Verify both are files (not directories)
14
+ if (Array.isArray(file.data)) {
15
+ throw new Error('Expected files, but found directories');
16
+ }
17
+ // Type guard to ensure we have file content
18
+ if (file.data.type !== 'file') {
19
+ throw new Error('Expected file type, got symlink or submodule');
20
+ }
21
+ // Decode base64 content and parse YAML
22
+ const fileContent = Buffer.from(file.data.content, 'base64').toString('utf-8');
23
+ try {
24
+ return yaml.parse(fileContent);
25
+ }
26
+ catch (error) {
27
+ throw new Error(`Failed to parse YAML file: ${error}`);
28
+ }
29
+ }
30
+ function getEnvVar(name) {
31
+ const value = process.env[name];
32
+ if (!value) {
33
+ throw new Error(`Missing env var ${name}`);
34
+ }
35
+ return value;
36
+ }
37
+ const runExecutor = async (options) => {
38
+ logger_1.consola.box(`Start preview deploy switch for ${options.targetAppName} to target branch ${options.targetBranchName} on the ${options.targetEnv} env`);
39
+ const octokit = process.env.GITHUB_TOKEN
40
+ ? new rest_1.Octokit({ auth: process.env.GITHUB_TOKEN })
41
+ : new rest_1.Octokit({
42
+ authStrategy: auth_app_1.createAppAuth,
43
+ auth: {
44
+ appId: getEnvVar('GITHUB_APP_ID'),
45
+ privateKey: getEnvVar('GITHUB_PRIVATE_KEY'),
46
+ installationId: getEnvVar('GITHUB_INSTALLATION_ID'),
47
+ },
48
+ });
49
+ const argocdOverridePath = `apps/${options.targetAppName}/${options.targetEnv}/.argocd-override.yaml`;
50
+ const kargoPolicyPath = `.kargo/policy.yaml`;
51
+ const message = `chore(${options.targetAppName}): switch deployment branch to ${options.targetBranchName} on ${options.targetEnv}`;
52
+ // Retrieve both files - throw error if either doesn't exist
53
+ const [argocdOverrideFile, kargoPolicyFile] = await Promise.all([
54
+ octokit.repos
55
+ .getContent({
56
+ owner: 'PayFit',
57
+ repo: options.targetRepo,
58
+ path: argocdOverridePath,
59
+ ref: 'heads/main',
60
+ })
61
+ .catch(e => {
62
+ // we don't update this file if it does not exist as it's optional
63
+ if (e.status === 404) {
64
+ logger_1.consola.info(`${options.targetRepo}/${argocdOverridePath} not found, ignoring this file`);
65
+ return undefined;
66
+ }
67
+ throw e;
68
+ }),
69
+ octokit.repos
70
+ .getContent({
71
+ owner: 'PayFit',
72
+ repo: options.targetRepo,
73
+ path: kargoPolicyPath,
74
+ ref: 'heads/main',
75
+ })
76
+ .catch(e => {
77
+ if (e.status === 404) {
78
+ throw new Error(`${options.targetRepo}/${kargoPolicyPath} not found`);
79
+ }
80
+ throw e;
81
+ }),
82
+ ]);
83
+ let argocdOverrideYaml = readFileYamlContent(argocdOverrideFile);
84
+ let kargoPolicyYaml = readFileYamlContent(kargoPolicyFile);
85
+ if (argocdOverrideYaml)
86
+ argocdOverrideYaml = (0, argocdOverride_1.updateArgoCDOverride)(argocdOverrideYaml, options.targetBranchName);
87
+ kargoPolicyYaml = (0, kargoPolicy_1.updateKargoPolicy)(kargoPolicyYaml, options.targetBranchName, options.targetEnv, options.targetAppName);
88
+ if (!argocdOverrideYaml && !kargoPolicyYaml) {
89
+ logger_1.consola.warn('Everything is already setup correctly, skipping');
90
+ return {
91
+ success: true,
92
+ };
93
+ }
94
+ // Convert back to YAML and base64
95
+ if (argocdOverrideYaml) {
96
+ const updatedArgocdYaml = yaml.stringify(argocdOverrideYaml);
97
+ const updatedArgocdContent = Buffer.from(updatedArgocdYaml).toString('base64');
98
+ await octokit.repos.createOrUpdateFileContents({
99
+ owner: 'PayFit',
100
+ repo: options.targetRepo,
101
+ path: argocdOverridePath,
102
+ message,
103
+ content: updatedArgocdContent,
104
+ branch: 'main',
105
+ sha: argocdOverrideFile.data.sha,
106
+ committer: {
107
+ name: 'github-actions[bot]',
108
+ email: 'github-actions[bot]@users.noreply.github.com',
109
+ },
110
+ author: {
111
+ name: 'github-actions[bot]',
112
+ email: 'github-actions[bot]@users.noreply.github.com',
113
+ },
114
+ });
115
+ }
116
+ if (kargoPolicyYaml) {
117
+ const updatedKargoYaml = yaml.stringify(kargoPolicyYaml);
118
+ const updatedKargoContent = Buffer.from(updatedKargoYaml).toString('base64');
119
+ await octokit.repos.createOrUpdateFileContents({
120
+ owner: 'PayFit',
121
+ repo: options.targetRepo,
122
+ path: kargoPolicyPath,
123
+ message,
124
+ content: updatedKargoContent,
125
+ branch: 'main',
126
+ sha: kargoPolicyFile.data.sha,
127
+ committer: {
128
+ name: 'github-actions[bot]',
129
+ email: 'github-actions[bot]@users.noreply.github.com',
130
+ },
131
+ author: {
132
+ name: 'github-actions[bot]',
133
+ email: 'github-actions[bot]@users.noreply.github.com',
134
+ },
135
+ });
136
+ }
137
+ logger_1.consola.success('Preview deploy switch succeed !');
138
+ return {
139
+ success: true,
140
+ };
141
+ };
142
+ exports.default = runExecutor;
143
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../src/executors/preview-deploy/executor.ts"],"names":[],"mappings":";;AACA,gDAAiD;AACjD,wCAAuC;AACvC,6BAA4B;AAE5B,sDAAmD;AACnD,qDAAuD;AACvD,+CAA8D;AAM9D,SAAS,mBAAmB,CAAC,IAAS;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,0CAA0C;IAC1C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;IAC1D,CAAC;IAED,4CAA4C;IAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IAED,uCAAuC;IACvC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE9E,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,EAAE,CAAC,CAAA;IACxD,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,WAAW,GAG2B,KAAK,EAC/C,OAAqC,EACrC,EAAE;IACF,gBAAO,CAAC,GAAG,CACT,mCAAmC,OAAO,CAAC,aAAa,qBAAqB,OAAO,CAAC,gBAAgB,WAAW,OAAO,CAAC,SAAS,MAAM,CACxI,CAAA;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY;QACtC,CAAC,CAAC,IAAI,cAAO,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QACjD,CAAC,CAAC,IAAI,cAAO,CAAC;YACV,YAAY,EAAE,wBAAa;YAC3B,IAAI,EAAE;gBACJ,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC;gBACjC,UAAU,EAAE,SAAS,CAAC,oBAAoB,CAAC;gBAC3C,cAAc,EAAE,SAAS,CAAC,wBAAwB,CAAC;aACpD;SACF,CAAC,CAAA;IAEN,MAAM,kBAAkB,GAAG,QAAQ,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,SAAS,wBAAwB,CAAA;IACrG,MAAM,eAAe,GAAG,oBAAoB,CAAA;IAC5C,MAAM,OAAO,GAAG,SAAS,OAAO,CAAC,aAAa,kCAAkC,OAAO,CAAC,gBAAgB,OAAO,OAAO,CAAC,SAAS,EAAE,CAAA;IAElI,4DAA4D;IAC5D,MAAM,CAAC,kBAAkB,EAAE,eAAe,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC9D,OAAO,CAAC,KAAK;aACV,UAAU,CAAC;YACV,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,OAAO,CAAC,UAAU;YACxB,IAAI,EAAE,kBAAkB;YACxB,GAAG,EAAE,YAAY;SAClB,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE;YACT,kEAAkE;YAClE,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACrB,gBAAO,CAAC,IAAI,CACV,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,gCAAgC,CAC5E,CAAA;gBACD,OAAO,SAAS,CAAA;YAClB,CAAC;YACD,MAAM,CAAC,CAAA;QACT,CAAC,CAAC;QACJ,OAAO,CAAC,KAAK;aACV,UAAU,CAAC;YACV,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,OAAO,CAAC,UAAU;YACxB,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,YAAY;SAClB,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE;YACT,IAAI,CAAC,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACrB,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,UAAU,IAAI,eAAe,YAAY,CAAC,CAAA;YACvE,CAAC;YACD,MAAM,CAAC,CAAA;QACT,CAAC,CAAC;KACL,CAAC,CAAA;IAEF,IAAI,kBAAkB,GAAG,mBAAmB,CAAC,kBAAkB,CAAC,CAAA;IAChE,IAAI,eAAe,GAAG,mBAAmB,CAAC,eAAe,CAAC,CAAA;IAE1D,IAAI,kBAAkB;QACpB,kBAAkB,GAAG,IAAA,qCAAoB,EACvC,kBAAkB,EAClB,OAAO,CAAC,gBAAgB,CACzB,CAAA;IAEH,eAAe,GAAG,IAAA,+BAAiB,EACjC,eAA8B,EAC9B,OAAO,CAAC,gBAAgB,EACxB,OAAO,CAAC,SAAS,EACjB,OAAO,CAAC,aAAa,CACtB,CAAA;IAED,IAAI,CAAC,kBAAkB,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,gBAAO,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;QAC/D,OAAO;YACL,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,kCAAkC;IAClC,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAA;QAC5D,MAAM,oBAAoB,GACxB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QACnD,MAAM,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;YAC7C,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,OAAO,CAAC,UAAU;YACxB,IAAI,EAAE,kBAAkB;YACxB,OAAO;YACP,OAAO,EAAE,oBAAoB;YAC7B,MAAM,EAAE,MAAM;YACd,GAAG,EAAG,kBAAkB,CAAC,IAAY,CAAC,GAAG;YACzC,SAAS,EAAE;gBACT,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,8CAA8C;aACtD;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,8CAA8C;aACtD;SACF,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;QACxD,MAAM,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC5E,MAAM,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC;YAC7C,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,OAAO,CAAC,UAAU;YACxB,IAAI,EAAE,eAAe;YACrB,OAAO;YACP,OAAO,EAAE,mBAAmB;YAC5B,MAAM,EAAE,MAAM;YACd,GAAG,EAAG,eAAe,CAAC,IAAY,CAAC,GAAG;YACtC,SAAS,EAAE;gBACT,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,8CAA8C;aACtD;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,qBAAqB;gBAC3B,KAAK,EAAE,8CAA8C;aACtD;SACF,CAAC,CAAA;IACJ,CAAC;IAED,gBAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAA;IAElD,OAAO;QACL,OAAO,EAAE,IAAI;KACd,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,WAAW,CAAA"}
@@ -0,0 +1,14 @@
1
+ export interface KargoPolicy {
2
+ services?: Record<string, {
3
+ stages?: Record<string, {
4
+ ephemeralBranch?: string;
5
+ [key: string]: unknown;
6
+ }>;
7
+ [key: string]: unknown;
8
+ }>;
9
+ [key: string]: unknown;
10
+ }
11
+ /**
12
+ * Updates the Kargo policy configuration based on the target branch
13
+ */
14
+ export declare function updateKargoPolicy(kargoPolicy: KargoPolicy, targetBranchName: string, targetEnv: string, targetAppName: string): KargoPolicy | undefined;
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateKargoPolicy = updateKargoPolicy;
4
+ const github_1 = require("../../utils/common/github");
5
+ /**
6
+ * Ensures the service structure exists in the kargo policy
7
+ * Returns true if any structure was created, false otherwise
8
+ */
9
+ function ensureServiceStructure(kargoPolicy, appName, env) {
10
+ const service = kargoPolicy.services[appName];
11
+ if (!service.stages) {
12
+ service.stages = {};
13
+ }
14
+ if (!service.stages[env]) {
15
+ service.stages[env] = {};
16
+ }
17
+ }
18
+ /**
19
+ * Removes ephemeral branch configuration and cleans up empty objects
20
+ * Returns true if any changes were made, false otherwise
21
+ */
22
+ function resetKargoPolicyForDefaultBranch(kargoPolicy, appName, env) {
23
+ const service = kargoPolicy.services[appName];
24
+ let hasChanged = false;
25
+ // Remove ephemeral branch if it exists
26
+ if (service.stages[env].ephemeralBranch) {
27
+ delete service.stages[env].ephemeralBranch;
28
+ hasChanged = true; // only commit file if we made an actual change
29
+ }
30
+ // Clean up empty env stage
31
+ if (Object.keys(service.stages[env]).length === 0) {
32
+ delete service.stages[env];
33
+ }
34
+ // Clean up empty stages object
35
+ if (Object.keys(service.stages).length === 0) {
36
+ delete service.stages;
37
+ }
38
+ return hasChanged;
39
+ }
40
+ /**
41
+ * Sets the ephemeral branch for feature branch deployment
42
+ * Returns true if the value changed, false if it was already set to the same value
43
+ */
44
+ function setEphemeralBranch(kargoPolicy, appName, env, branchName) {
45
+ const currentValue = kargoPolicy.services[appName].stages[env].ephemeralBranch;
46
+ kargoPolicy.services[appName].stages[env].ephemeralBranch = branchName;
47
+ return currentValue !== branchName;
48
+ }
49
+ /**
50
+ * Updates the Kargo policy configuration based on the target branch
51
+ */
52
+ function updateKargoPolicy(kargoPolicy, targetBranchName, targetEnv, targetAppName) {
53
+ // Early return if service doesn't exist
54
+ if (!kargoPolicy.services || !kargoPolicy.services[targetAppName]) {
55
+ throw new Error('Unable to update kargo policy, service does not exist in the configuration');
56
+ }
57
+ let hasChanged = false;
58
+ // Ensure structure exists and track if changes were made
59
+ ensureServiceStructure(kargoPolicy, targetAppName, targetEnv);
60
+ if ((0, github_1.isDefaultBranch)(targetBranchName)) {
61
+ // reset to default branch
62
+ hasChanged = resetKargoPolicyForDefaultBranch(kargoPolicy, targetAppName, targetEnv);
63
+ }
64
+ else {
65
+ hasChanged = setEphemeralBranch(kargoPolicy, targetAppName, targetEnv, targetBranchName);
66
+ }
67
+ return hasChanged ? kargoPolicy : undefined;
68
+ }
69
+ //# sourceMappingURL=kargoPolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kargoPolicy.js","sourceRoot":"","sources":["../../../../src/executors/preview-deploy/kargoPolicy.ts"],"names":[],"mappings":";;AA0FA,8CAmCC;AA7HD,sDAA2D;AAoB3D;;;GAGG;AACH,SAAS,sBAAsB,CAC7B,WAAwB,EACxB,OAAe,EACf,GAAW;IAEX,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAE7C,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,GAAG,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,gCAAgC,CACvC,WAAwB,EACxB,OAAe,EACf,GAAW;IAEX,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7C,IAAI,UAAU,GAAG,KAAK,CAAA;IAEtB,uCAAuC;IACvC,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,EAAE,CAAC;QACxC,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAA;QAC1C,UAAU,GAAG,IAAI,CAAA,CAAC,+CAA+C;IACnE,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClD,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC5B,CAAC;IAED,+BAA+B;IAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,OAAO,CAAC,MAAM,CAAA;IACvB,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CACzB,WAAwB,EACxB,OAAe,EACf,GAAW,EACX,UAAkB;IAElB,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,CAAA;IAC9E,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,eAAe,GAAG,UAAU,CAAA;IAEtE,OAAO,YAAY,KAAK,UAAU,CAAA;AACpC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,WAAwB,EACxB,gBAAwB,EACxB,SAAiB,EACjB,aAAqB;IAErB,wCAAwC;IACxC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,4EAA4E,CAC7E,CAAA;IACH,CAAC;IAED,IAAI,UAAU,GAAG,KAAK,CAAA;IAEtB,yDAAyD;IACzD,sBAAsB,CAAC,WAAW,EAAE,aAAa,EAAE,SAAS,CAAC,CAAA;IAE7D,IAAI,IAAA,wBAAe,EAAC,gBAAgB,CAAC,EAAE,CAAC;QACtC,0BAA0B;QAC1B,UAAU,GAAG,gCAAgC,CAC3C,WAAW,EACX,aAAa,EACb,SAAS,CACV,CAAA;IACH,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,kBAAkB,CAC7B,WAAW,EACX,aAAa,EACb,SAAS,EACT,gBAAgB,CACjB,CAAA;IACH,CAAC;IAED,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7C,CAAC"}
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "version": 2,
4
+ "title": "Preview deploy branch",
5
+ "description": "Use it to switch the deployment branch of an app",
6
+ "type": "object",
7
+ "properties": {
8
+ "targetRepo": {
9
+ "type": "string",
10
+ "description": "Target <domain>-deploy repository"
11
+ },
12
+ "targetBranchName": {
13
+ "type": "string",
14
+ "description": "Branch name to deploy"
15
+ },
16
+ "targetEnv": {
17
+ "type": "string",
18
+ "description": "Target environment to deploy to",
19
+ "enum": ["dev", "staging", "prod"],
20
+ "default": "dev"
21
+ },
22
+ "targetAppName": {
23
+ "type": "string",
24
+ "description": "app name to target within the <domain>-deploy repo"
25
+ }
26
+ },
27
+ "required": ["targetAppName", "targetRepo", "targetBranchName"]
28
+ }
@@ -0,0 +1,3 @@
1
+ # nx-core publisher executor
2
+
3
+ It is handling all the publishing steps for docker images, helm charts & lambdas.
@@ -0,0 +1,3 @@
1
+ import { ExecutorContext } from '@nx/devkit';
2
+ import { PublisherExecutorOptions } from './schema';
3
+ export declare function publishDocker(options: PublisherExecutorOptions, context: ExecutorContext, version: string, projectRoot: string, isDryRun: boolean): Promise<void>;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.publishDocker = publishDocker;
4
+ const fs = require("node:fs");
5
+ const aws_auth_1 = require("../../utils/common/aws-auth");
6
+ const github_1 = require("../../utils/common/github");
7
+ const logger_1 = require("../../utils/common/logger");
8
+ const datadog_1 = require("../../utils/datadog");
9
+ const docker_1 = require("../../utils/docker");
10
+ async function publishDocker(options, context, version, projectRoot, isDryRun) {
11
+ const projectDockerfile = `${projectRoot}/Dockerfile`;
12
+ if (!fs.existsSync(projectDockerfile)) {
13
+ logger_1.consola.warn(`Dockerfile not found at ${projectDockerfile}, skipping`);
14
+ return;
15
+ }
16
+ if (!options.ecrRegistry) {
17
+ logger_1.consola.error('Dockerfile detected but No ECR registry provided, add "ecrRegistry" to your project.json metadata');
18
+ return;
19
+ }
20
+ const registry = {
21
+ url: options.isPublicRegistry
22
+ ? 'public.ecr.aws/payfit'
23
+ : process.env.AWS_ECR_REGISTRY,
24
+ name: options.isPublicRegistry
25
+ ? 'public.ecr.aws'
26
+ : process.env.AWS_ECR_REGISTRY,
27
+ };
28
+ if (isDryRun) {
29
+ logger_1.consola.box(`Would have published docker image located at ${projectDockerfile} to registry ${options.ecrRegistry} with version ${version} but --dry-run is enabled`);
30
+ return;
31
+ }
32
+ await (0, aws_auth_1.checkAwsAuth)();
33
+ await (0, aws_auth_1.loginToEcr)(registry.name, options.isPublicRegistry);
34
+ // Verify that we have valid ECR credentials before proceeding
35
+ const hasValidCredentials = await (0, aws_auth_1.verifyEcrCredentials)(registry.name);
36
+ if (!hasValidCredentials) {
37
+ logger_1.consola.warn('ECR credentials verification failed. Attempting to login again...');
38
+ // Try logging in again
39
+ await (0, aws_auth_1.loginToEcr)(registry.name, options.isPublicRegistry);
40
+ // Verify credentials again
41
+ const retryCredentials = await (0, aws_auth_1.verifyEcrCredentials)(registry.name);
42
+ if (!retryCredentials) {
43
+ throw new Error('No valid ECR credentials available for pushing Docker image');
44
+ }
45
+ }
46
+ logger_1.consola.box(`Publishing docker image to ${registry.url}/${options.ecrRegistry} with version ${version}`);
47
+ const extraTags = !version.includes('ephemeral') && options.extraReleaseTags
48
+ ? options.extraReleaseTags
49
+ : [];
50
+ const sanitizedRepoUrl = await (0, github_1.getSanitizedCurrentGitRepoUrl)();
51
+ const commitSha = await (0, github_1.getCurrentGitCommitSha)();
52
+ const appName = context.projectName || 'unknown-app';
53
+ try {
54
+ logger_1.consola.start('Building and pushing docker image');
55
+ await (0, docker_1.buildAndPushDockerImage)(options.ecrRegistry, projectDockerfile, version, sanitizedRepoUrl, commitSha, registry.url, extraTags, appName);
56
+ logger_1.consola.success('Docker image built and pushed successfully!');
57
+ if (!version.includes('ephemeral')) {
58
+ await (0, datadog_1.correlateDeploymentImage)(`${registry.url}/${options.ecrRegistry}:${version}`, sanitizedRepoUrl, commitSha);
59
+ }
60
+ }
61
+ catch (error) {
62
+ logger_1.consola.error('Failed to build and push Docker image:', error);
63
+ throw error;
64
+ }
65
+ }
66
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../../src/executors/publisher/docker.ts"],"names":[],"mappings":";;AAuBA,sCA+FC;AAtHD,8BAA6B;AAI7B,0DAIoC;AACpC,sDAGkC;AAClC,sDAAmD;AACnD,iDAA8D;AAC9D,+CAA4D;AAQrD,KAAK,UAAU,aAAa,CACjC,OAAiC,EACjC,OAAwB,EACxB,OAAe,EACf,WAAmB,EACnB,QAAiB;IAEjB,MAAM,iBAAiB,GAAG,GAAG,WAAW,aAAa,CAAA;IAErD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACtC,gBAAO,CAAC,IAAI,CAAC,2BAA2B,iBAAiB,YAAY,CAAC,CAAA;QACtE,OAAM;IACR,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,gBAAO,CAAC,KAAK,CACX,mGAAmG,CACpG,CAAA;QACD,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAgB;QAC5B,GAAG,EAAE,OAAO,CAAC,gBAAgB;YAC3B,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;QAChC,IAAI,EAAE,OAAO,CAAC,gBAAgB;YAC5B,CAAC,CAAC,gBAAgB;YAClB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB;KACjC,CAAA;IAED,IAAI,QAAQ,EAAE,CAAC;QACb,gBAAO,CAAC,GAAG,CACT,gDAAgD,iBAAiB,gBAAgB,OAAO,CAAC,WAAW,iBAAiB,OAAO,2BAA2B,CACxJ,CAAA;QACD,OAAM;IACR,CAAC;IAED,MAAM,IAAA,uBAAY,GAAE,CAAA;IACpB,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAEzD,8DAA8D;IAC9D,MAAM,mBAAmB,GAAG,MAAM,IAAA,+BAAoB,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACrE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,gBAAO,CAAC,IAAI,CACV,mEAAmE,CACpE,CAAA;QACD,uBAAuB;QACvB,MAAM,IAAA,qBAAU,EAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAEzD,2BAA2B;QAC3B,MAAM,gBAAgB,GAAG,MAAM,IAAA,+BAAoB,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAA;QACH,CAAC;IACH,CAAC;IAED,gBAAO,CAAC,GAAG,CACT,8BAA8B,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,WAAW,iBAAiB,OAAO,EAAE,CAC5F,CAAA;IAED,MAAM,SAAS,GACb,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,gBAAgB;QACxD,CAAC,CAAC,OAAO,CAAC,gBAAgB;QAC1B,CAAC,CAAC,EAAE,CAAA;IAER,MAAM,gBAAgB,GAAG,MAAM,IAAA,sCAA6B,GAAE,CAAA;IAC9D,MAAM,SAAS,GAAG,MAAM,IAAA,+BAAsB,GAAE,CAAA;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,IAAI,aAAa,CAAA;IAEpD,IAAI,CAAC;QACH,gBAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAA;QAClD,MAAM,IAAA,gCAAuB,EAC3B,OAAO,CAAC,WAAW,EACnB,iBAAiB,EACjB,OAAO,EACP,gBAAgB,EAChB,SAAS,EACT,QAAQ,CAAC,GAAG,EACZ,SAAS,EACT,OAAO,CACR,CAAA;QACD,gBAAO,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAA;QAE9D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,MAAM,IAAA,kCAAwB,EAC5B,GAAG,QAAQ,CAAC,GAAG,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,EAAE,EACnD,gBAAgB,EAChB,SAAS,CACV,CAAA;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,gBAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAA;QAC9D,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { ExecutorContext } from '@nx/devkit';
2
+ import { PublisherExecutorOptions, PublisherExecutorSchema } from './schema';
3
+ declare const runExecutor: (options: PublisherExecutorOptions, context: ExecutorContext) => Promise<PublisherExecutorSchema>;
4
+ export default runExecutor;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const nx_1 = require("../../utils/common/nx");
4
+ const docker_1 = require("./docker");
5
+ const helm_1 = require("./helm");
6
+ const lambda_1 = require("./lambda");
7
+ const runExecutor = async (options, context) => {
8
+ const isDryRun = process.env.NX_DRY_RUN === 'true' || options.dryRun || false;
9
+ const projectRoot = context.projectGraph.nodes[context.projectName].data.root;
10
+ const projectDist = await (0, nx_1.getDistForApp)(context);
11
+ const version = (0, nx_1.getVersion)(context);
12
+ await (0, docker_1.publishDocker)(options, context, version, projectRoot, isDryRun);
13
+ await (0, helm_1.publishHelm)(options, context, version, projectRoot, projectDist, isDryRun);
14
+ await (0, lambda_1.publishLambda)(options, context, version, projectRoot, projectDist, isDryRun);
15
+ return {
16
+ success: true,
17
+ };
18
+ };
19
+ exports.default = runExecutor;
20
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../src/executors/publisher/executor.ts"],"names":[],"mappings":";;AAEA,8CAAiE;AACjE,qCAAwC;AACxC,iCAAoC;AACpC,qCAAwC;AAGxC,MAAM,WAAW,GAGuB,KAAK,EAC3C,OAAiC,EACjC,OAAwB,EACxB,EAAE;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;IAC7E,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7E,MAAM,WAAW,GAAG,MAAM,IAAA,kBAAa,EAAC,OAAO,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,IAAA,eAAU,EAAC,OAAO,CAAC,CAAA;IAEnC,MAAM,IAAA,sBAAa,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;IACrE,MAAM,IAAA,kBAAW,EACf,OAAO,EACP,OAAO,EACP,OAAO,EACP,WAAW,EACX,WAAW,EACX,QAAQ,CACT,CAAA;IACD,MAAM,IAAA,sBAAa,EACjB,OAAO,EACP,OAAO,EACP,OAAO,EACP,WAAW,EACX,WAAW,EACX,QAAQ,CACT,CAAA;IAED,OAAO;QACL,OAAO,EAAE,IAAI;KACd,CAAA;AACH,CAAC,CAAA;AAED,kBAAe,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { ExecutorContext } from '@nx/devkit';
2
+ import { PublisherExecutorOptions } from './schema';
3
+ export declare function publishHelm(options: PublisherExecutorOptions, context: ExecutorContext, version: string, projectRoot: string, projectDist: string, isDryRun: boolean): Promise<void>;