@docupace/pipeline 1.0.77 → 1.0.78

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 (69) hide show
  1. package/.prettierrc.cjs +12 -12
  2. package/README.md +135 -135
  3. package/bin/azuread_update_callbacks_for_app.sh +58 -58
  4. package/bin/next-changeset-validate.sh +8 -8
  5. package/bitbucket-pipelines.yml +59 -59
  6. package/eslint.config.js +49 -49
  7. package/jest.config.js +15 -15
  8. package/next/changeset.sh +75 -75
  9. package/next/copy.sh +34 -34
  10. package/next/deploy.sh +40 -40
  11. package/next/execute.sh +123 -123
  12. package/next/sonar.sh +23 -23
  13. package/package.json +1 -1
  14. package/src/auth0/alias.js +79 -79
  15. package/src/auth0/alias.test.js +172 -172
  16. package/src/auth0/cli.js +82 -82
  17. package/src/auth0/configure.js +902 -902
  18. package/src/auth0/configure.test.js +167 -167
  19. package/src/auth0/export.js +48 -48
  20. package/src/auth0/export.test.js +103 -103
  21. package/src/auth0/metadata.js +141 -141
  22. package/src/auth0/metadata.test.js +186 -186
  23. package/src/auth0/vault.js +60 -60
  24. package/src/auth0/vault.test.js +134 -134
  25. package/src/changeset/changelog-wiki.js +328 -328
  26. package/src/changeset/changeset-config.js +34 -34
  27. package/src/changeset/cli.js +237 -237
  28. package/src/changeset/create.js +215 -215
  29. package/src/changeset/package-util.js +87 -87
  30. package/src/changeset/util.js +43 -43
  31. package/src/changeset/validate.js +91 -91
  32. package/src/changeset/version.js +102 -102
  33. package/src/jenkins/setParams.groovy +58 -58
  34. package/src/lib/merge-driver.js +204 -204
  35. package/src/merge/cli-merge-all.js +507 -507
  36. package/src/merge/cli-merge.js +492 -492
  37. package/src/merge/cli-resolve.js +399 -399
  38. package/src/merge/cli.js +38 -38
  39. package/src/merge/merge-changelog.js +87 -87
  40. package/src/merge/merge-package.js +106 -106
  41. package/src/merge/merge-types.js +82 -82
  42. package/src/merge/pr.js +231 -231
  43. package/src/micro/deploy-microservice.js +153 -0
  44. package/src/micro/{ms-publish.js → publish-ms.js} +8 -6
  45. package/src/next/alias.js +53 -53
  46. package/src/next/apache.js +81 -81
  47. package/src/next/cli.js +10 -1
  48. package/src/next/config.js +137 -137
  49. package/src/next/connect.js +226 -226
  50. package/src/next/copy.js +61 -61
  51. package/src/next/deploy.js +633 -633
  52. package/src/next/git-to-semver.js +79 -79
  53. package/src/next/haproxy.js +76 -76
  54. package/src/next/jenkins.js +123 -123
  55. package/src/next/jira.js +84 -84
  56. package/src/next/logger.js +17 -17
  57. package/src/next/pipline.js +114 -114
  58. package/src/next/publish.js +71 -71
  59. package/src/next/pull.js +7 -7
  60. package/src/next/sonar.js +23 -23
  61. package/src/next/test.js +5 -5
  62. package/src/next/util.js +95 -93
  63. package/src/next/vault.js +45 -45
  64. package/terraform/apply.sh +37 -37
  65. package/terraform/init.sh +72 -72
  66. package/terraform/plan.sh +76 -76
  67. package/terraform/validate.sh +17 -17
  68. package/src/micro/cli.js +0 -71
  69. package/src/micro/ms-deploy.js +0 -271
@@ -1,902 +1,902 @@
1
- import fs from 'fs-extra';
2
- import path from 'path';
3
- import axios from 'axios';
4
- import * as crypto from 'crypto';
5
-
6
- import {
7
- cloneEnvRepository,
8
- cloneRepository,
9
- pushDeployConfig,
10
- readDeployConfig,
11
- } from '../next/deploy.js';
12
-
13
- import { getVaultSecrets, updateVaultSecrets } from './vault.js';
14
-
15
- import {
16
- coreSiteEnvMap,
17
- environmentConfig,
18
- getVaultSecretsConfigs,
19
- } from '../next/config.js';
20
-
21
- async function ensureDirectoryExists(dirPath) {
22
- try {
23
- await fs.promises.mkdir(dirPath, { recursive: true });
24
- console.log(`Directory created or already exists: ${dirPath}`);
25
- } catch (err) {
26
- console.error(`Failed to create directory: ${err.message}`);
27
- }
28
- }
29
-
30
- export async function getAuth0AuthToken(auth0Domain, clientId, clientSecret) {
31
- try {
32
- const response = await axios.post(
33
- `https://${auth0Domain}/oauth/token`,
34
- {
35
- client_id: clientId,
36
- client_secret: clientSecret,
37
- audience: `https://${auth0Domain}/api/v2/`,
38
- grant_type: 'client_credentials',
39
- },
40
- {
41
- headers: {
42
- 'Content-Type': 'application/json',
43
- },
44
- },
45
- );
46
-
47
- const authToken = response.data.access_token;
48
- // console.log("Auth0 Auth Token:", authToken);
49
- return authToken;
50
- } catch (error) {
51
- console.error(
52
- 'Error fetching Auth0 token:',
53
- error.response ? error.response.data : error.message,
54
- );
55
- }
56
- }
57
-
58
- async function configureUI(
59
- siteHost,
60
- coreURL,
61
- connectURL,
62
- docupaceHost,
63
- site,
64
- env,
65
- auth0Domain,
66
- auth0ClientId,
67
- auth0ClientSecret,
68
- auth0Token,
69
- vaultSiteSecretsPath,
70
- imageTag,
71
- revision,
72
- repoPath,
73
- useS3,
74
- ) {
75
- console.log(
76
- `Configuring UI for site: ${site} Host: ${siteHost} in env: ${env}`,
77
- );
78
- siteHost = siteHost.replace('https://', '');
79
- coreURL = coreURL.replace('https://', '');
80
- connectURL = connectURL.replace('https://', '');
81
-
82
- try {
83
- const auth0Response = await axios.get(
84
- `https://${auth0Domain}/api/v2/clients`,
85
- {
86
- headers: { authorization: `Bearer ${auth0Token}` },
87
- },
88
- );
89
-
90
- const uiClient = auth0Response.data.find(
91
- (client) => client.name === 'docupace-ui-main',
92
- );
93
- const uiAuth0ClientId = uiClient.client_id;
94
- const uiAuth0ClientSecret = uiClient.client_secret;
95
-
96
- // Generate Auth0 Secret
97
- const uiAuth0Secret = crypto
98
- .randomBytes(48)
99
- .toString('base64')
100
- .replace(/[^a-zA-Z0-9]/g, '');
101
-
102
- // Prepare data payload
103
- console.log('Preparing Vault UI data payload...');
104
- const uiSecretData = JSON.stringify({
105
- data: {
106
- AUTH0_CLIENT_ID: uiAuth0ClientId,
107
- AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
108
- AUTH0_SECRET: uiAuth0Secret,
109
- },
110
- });
111
-
112
- await updateVaultSecrets(vaultSiteSecretsPath, uiSecretData);
113
-
114
- let siteAWSSecrets = null;
115
-
116
- if (useS3 === true || useS3 === 'true') {
117
- const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
118
- siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
119
- console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
120
- }
121
-
122
- const awsS3Vars =
123
- useS3 === true || useS3 === 'true'
124
- ? `
125
- AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
126
- AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
127
- AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
128
- AWS_REGION: vault:secret/data/${site}/aws/config#AWS_REGION`
129
- : '';
130
-
131
- // Prepare ui.app.yaml
132
- const uiAppYaml = `
133
- repo: docupace-ui-main
134
- revision: ${revision}
135
- `.trim();
136
-
137
- // Prepare ui.values.yaml
138
- const uiValuesYaml = `
139
- uiMain:
140
- auth0BaseUrl: https://${siteHost}
141
- auth0IssuerBaseUrl: https://${auth0Domain}
142
- auth0ClientId: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_ID
143
- graphqlClientUrl: https://${siteHost}/api/graphql
144
- graphqlServerUrl: https://${siteHost}/api/graphql
145
- connectUrl: https://${connectURL}
146
- coreUrl: https://${coreURL}
147
- env:
148
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_SECRET
149
- AUTH0_SECRET: vault:secret/data/${site}/ui/config#AUTH0_SECRET${awsS3Vars ? '\n ' + awsS3Vars.trim() : ''}
150
- image:
151
- repository: registry.paperout.com/docupace-ui-main-${env}-docker-local/enterprise-ui-app
152
- tag: ${imageTag}
153
- ${
154
- useS3 === true || useS3 === 'true'
155
- ? `
156
- serviceAccount:
157
- create: true
158
- annotations:
159
- "helm.sh/hook": pre-install
160
- "helm.sh/hook-weight": "-10"
161
- eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket`
162
- : ''
163
- }
164
- imagePullSecrets:
165
- - name: jf-artifactory
166
- ingress:
167
- enabled: true
168
- className: nginx
169
- annotations:
170
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
171
- external-dns.alpha.kubernetes.io/zone: public
172
- cert-manager.io/cluster-issuer: letsencrypt
173
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
174
- hosts:
175
- - host: ${siteHost}
176
- paths:
177
- - path: /
178
- pathType: Prefix
179
- tls:
180
- - hosts:
181
- - ${siteHost}
182
- secretName: dp-next-ui-cert
183
- externalConnectIngress:
184
- enabled: true
185
- className: nginx
186
- annotations:
187
- cert-manager.io/cluster-issuer: letsencrypt
188
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
189
- external-dns.alpha.kubernetes.io/zone: public
190
- nginx.ingress.kubernetes.io/backend-protocol: HTTPS
191
- nginx.ingress.kubernetes.io/configuration-snippet: |
192
- proxy_set_header Host ${siteHost};
193
- nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
194
- hosts:
195
- - host: ${siteHost}
196
- paths:
197
- - path: /core
198
- - path: /core_b2b
199
- - path: /core_reports
200
- - path: /corerealm
201
- - path: /connect
202
- - path: /webstart
203
- - path: /core_ws
204
- - path: /core_docupload
205
- - path: /core_ariws
206
- - path: /core_restws
207
- - path: /core_webdav
208
- tls:
209
- - hosts:
210
- - ${siteHost}
211
- secretName: dp-next-ui-cert
212
- externalConnectService:
213
- enabled: true
214
- name: external-connect
215
- domain: ${docupaceHost}
216
- `.trim();
217
-
218
- console.log('Writing configuration files...');
219
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
220
-
221
- await fs.writeFile(
222
- `${repoPath}/dp/${site}/ui.app.yaml`,
223
- uiAppYaml,
224
- (err) => {
225
- if (err) {
226
- console.error('Failed to write the file:', err);
227
- } else {
228
- console.log(
229
- `File ${repoPath}/dp/${site}/ui.app.yaml written successfully.`,
230
- );
231
- }
232
- },
233
- );
234
-
235
- await fs.writeFile(
236
- `${repoPath}/dp/${site}/ui.values.yaml`,
237
- uiValuesYaml,
238
- (err) => {
239
- if (err) {
240
- console.error('Failed to write the file:', err);
241
- } else {
242
- console.log(
243
- `File ${repoPath}/dp/${site}/ui.values.yaml written successfully.`,
244
- );
245
- }
246
- },
247
- );
248
- console.log('The UI part is done!');
249
- } catch (error) {
250
- console.error('Error configuring UI:', error);
251
- }
252
- }
253
-
254
- async function configureCCUI(
255
- siteHost,
256
- coreURL,
257
- connectURL,
258
- docupaceHost,
259
- site,
260
- env,
261
- auth0Domain,
262
- auth0ClientId,
263
- auth0ClientSecret,
264
- auth0Token,
265
- vaultSiteSecretsPath,
266
- imageTag,
267
- revision,
268
- repoPath,
269
- useS3,
270
- ccUrl,
271
- ) {
272
- console.log(
273
- `Configuring CC UI for site: ${site} Host: ${siteHost} in env: ${env}`,
274
- );
275
- siteHost = siteHost.replace('https://', '');
276
- coreURL = coreURL.replace('https://', '');
277
- connectURL = connectURL.replace('https://', '');
278
- ccUrl = ccUrl.replace('https://', '');
279
-
280
- try {
281
- const auth0Response = await axios.get(
282
- `https://${auth0Domain}/api/v2/clients`,
283
- {
284
- headers: { authorization: `Bearer ${auth0Token}` },
285
- },
286
- );
287
-
288
- const uiClient = auth0Response.data.find(
289
- (client) => client.name === 'docupace-ui-cc',
290
- );
291
- const uiAuth0ClientId = uiClient.client_id;
292
- const uiAuth0ClientSecret = uiClient.client_secret;
293
-
294
- // Generate Auth0 Secret
295
- const uiAuth0Secret = crypto
296
- .randomBytes(48)
297
- .toString('base64')
298
- .replace(/[^a-zA-Z0-9]/g, '');
299
-
300
- // Prepare data payload
301
- console.log('Preparing Vault CC UI data payload...');
302
- const ccUISecretData = JSON.stringify({
303
- data: {
304
- AUTH0_CLIENT_ID: uiAuth0ClientId,
305
- AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
306
- AUTH0_SECRET: uiAuth0Secret,
307
- },
308
- });
309
- console.log('Updating Vault Site Secret =>', vaultSiteSecretsPath);
310
- await updateVaultSecrets(vaultSiteSecretsPath, ccUISecretData);
311
-
312
- let siteAWSSecrets = null;
313
-
314
- if (useS3 === true || useS3 === 'true') {
315
- const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
316
- siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
317
- console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
318
- }
319
-
320
- const awsS3Vars =
321
- useS3 === true || useS3 === 'true'
322
- ? `
323
- AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
324
- AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
325
- AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
326
- AWS_REGION: vault:secret/data/${site}/aws/config#AWS_REGION`
327
- : '';
328
-
329
- const uiCCAppYaml = `
330
- repo: docupace-ui-main
331
- revision: ${revision}
332
- `.trim();
333
-
334
- const uiCCValuesYaml = `
335
- uiMain:
336
- auth0BaseUrl: https://${ccUrl}
337
- auth0IssuerBaseUrl: https://${auth0Domain}
338
- auth0ClientId: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_ID
339
- graphqlClientUrl: https://${siteHost}/api/graphql
340
- graphqlServerUrl: https://${siteHost}/api/graphql
341
- connectUrl: https://${connectURL}
342
- coreUrl: https://${coreURL}
343
- env:
344
- AUTH0_AUDIENCE: core-api-access
345
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_SECRET
346
- AUTH0_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_SECRET${awsS3Vars ? '\n ' + awsS3Vars.trim() : ''}
347
- image:
348
- repository: registry.paperout.com/docupace-ui-main-${env}-docker-local/cc-ui-app
349
- tag: ${imageTag}
350
- imagePullSecrets:
351
- - name: jf-artifactory
352
- ingress:
353
- enabled: true
354
- className: nginx
355
- annotations:
356
- external-dns.alpha.kubernetes.io/hostname: ${ccUrl}
357
- external-dns.alpha.kubernetes.io/zone: public
358
- cert-manager.io/cluster-issuer: letsencrypt
359
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
360
- hosts:
361
- - host: ${ccUrl}
362
- paths:
363
- - path: /
364
- pathType: Prefix
365
- tls:
366
- - hosts:
367
- - ${ccUrl}
368
- secretName: dp-cc-ui-cert
369
- ${
370
- useS3 === true || useS3 === 'true'
371
- ? `
372
- serviceAccount:
373
- create: true
374
- annotations:
375
- "helm.sh/hook": pre-install
376
- "helm.sh/hook-weight": "-10"
377
- eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket`
378
- : ''
379
- }
380
- `.trim();
381
-
382
- console.log('Writing configuration files...');
383
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
384
-
385
- await fs.writeFile(
386
- `${repoPath}/dp/${site}/cc.app.yaml`,
387
- uiCCAppYaml,
388
- (err) => {
389
- if (err) {
390
- console.error(
391
- `Failed to write ${repoPath}/dp/${site}/cc.app.yaml file:`,
392
- err,
393
- );
394
- } else {
395
- console.log(
396
- `File ${repoPath}/dp/${site}/cc.app.yaml written successfully.`,
397
- );
398
- }
399
- },
400
- );
401
-
402
- await fs.writeFile(
403
- `${repoPath}/dp/${site}/cc.values.yaml`,
404
- uiCCValuesYaml,
405
- (err) => {
406
- if (err) {
407
- console.error(
408
- `Failed to write ${repoPath}/dp/${site}/cc.values.yaml file:`,
409
- err,
410
- );
411
- } else {
412
- console.log(
413
- `File ${repoPath}/dp/${site}/cc.values.yaml written successfully.`,
414
- );
415
- }
416
- },
417
- );
418
- console.log('CC-UI configuration is done!');
419
- } catch (error) {
420
- console.error('Error configuring CC-UI:', error);
421
- }
422
- }
423
-
424
- export async function cleanAndWritePropertiesFile(configPath, content) {
425
- try {
426
- const cleanedContent = content
427
- .split('\n')
428
- .map((line) => line.trim())
429
- .filter((line) => line !== '')
430
- .join('\n');
431
-
432
- await fs.writeFile(configPath, cleanedContent, 'utf8');
433
- console.log(`Cleaned and written file to: ${configPath}`);
434
- } catch (error) {
435
- console.error(
436
- `Error writing properties file to ${configPath}:`,
437
- error.message,
438
- );
439
- process.exit(1);
440
- }
441
- }
442
-
443
- export async function updateCoreSiteConfig(site, env, useS3Ui, useS3Gq) {
444
- try {
445
- const coreSiteEnv = coreSiteEnvMap[env];
446
-
447
- const coreSiteConfigRepoPath = await cloneRepository(
448
- `${coreSiteEnv}-site-settings`,
449
- );
450
-
451
- const configPath = path.join(
452
- `${coreSiteEnv}-site-settings`,
453
- site.toUpperCase(),
454
- 'docucore-nextUI.properties',
455
- );
456
-
457
- let siteAWSSecrets = null;
458
-
459
- if (
460
- useS3Ui === true ||
461
- useS3Ui === 'true' ||
462
- useS3Gq === true ||
463
- useS3Gq === 'true'
464
- ) {
465
- const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
466
- siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
467
- console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
468
- }
469
-
470
- const coreSiteConfig = `
471
- ${
472
- siteAWSSecrets
473
- ? `
474
- com.docupace.imports.files.FilesImportConfig.aws.accessKeyId=${siteAWSSecrets.AWS_ACCESS_KEY_ID}
475
- com.docupace.imports.files.FilesImportConfig.aws.accessKeySecret=${siteAWSSecrets.AWS_SECRET_ACCESS_KEY}
476
- com.docupace.imports.files.FilesImportConfig.aws.region=${siteAWSSecrets.AWS_REGION}`.trim()
477
- : ''
478
- }
479
- `;
480
-
481
- await fs.ensureDir(path.join(coreSiteConfigRepoPath, site.toUpperCase()));
482
- await cleanAndWritePropertiesFile(configPath, coreSiteConfig);
483
- await pushDeployConfig(
484
- coreSiteConfigRepoPath,
485
- `Core config: docucore-nextUI.properties for site: (${site.toUpperCase()}) update in env: (${env})`,
486
- );
487
- } catch (error) {
488
- console.error('Error:', error.message);
489
- process.exit(1);
490
- }
491
- }
492
-
493
- async function configureGraphQLServer(
494
- siteHost,
495
- coreURL,
496
- docupaceHost,
497
- site,
498
- env,
499
- auth0Domain,
500
- auth0ClientId,
501
- auth0ClientSecret,
502
- auth0Token,
503
- vaultSiteSecretsPath,
504
- imageTag,
505
- revision,
506
- standardConfigRemoteBranch,
507
- repoPath,
508
- commonSecrets,
509
- useS3,
510
- ) {
511
- siteHost = siteHost.replace('https://', '');
512
- coreURL = coreURL.replace('https://', '');
513
- console.log(
514
- `Configuring GraphQL Server for site: ${site} Host: ${siteHost} in env: ${env}`,
515
- );
516
-
517
- try {
518
- const auth0Response = await axios.get(
519
- `https://${auth0Domain}/api/v2/clients`,
520
- {
521
- headers: { authorization: `Bearer ${auth0Token}` },
522
- },
523
- );
524
-
525
- const graphQLServerClient = auth0Response.data.find(
526
- (client) => client.name === 'docupace-graphql',
527
- );
528
- const graphQLServerClientCredentials = auth0Response.data.find(
529
- (client) => client.name === 'docupace-graphql-client-credentials',
530
- );
531
-
532
- const graphQLServerAuth0ClientId = graphQLServerClient.client_id;
533
- const graphQLServerAuth0ClientSecret = graphQLServerClient.client_secret;
534
-
535
- const graphQLServerCCAuth0ClientId =
536
- graphQLServerClientCredentials.client_id;
537
- const graphQLServerCCAuth0ClientSecret =
538
- graphQLServerClientCredentials.client_secret;
539
-
540
- // Prepare data payload
541
- console.log('Preparing Vault GraphQL Server data payload...');
542
- const graphQLServerSecretData = JSON.stringify({
543
- data: {
544
- AUTH0_CLIENT_ID: graphQLServerAuth0ClientId,
545
- AUTH0_CLIENT_SECRET: graphQLServerAuth0ClientSecret,
546
- AUTH0_CC_CLIENT_ID: graphQLServerCCAuth0ClientId,
547
- AUTH0_CC_CLIENT_SECRET: graphQLServerCCAuth0ClientSecret,
548
- CORE_PASSWORD: commonSecrets.CORE_PASSWORD,
549
- REMOTE_CONFIG_PATH: commonSecrets.REMOTE_CONFIG_PATH,
550
- STANDARD_CONFIG_REMOTE_PATH: commonSecrets.STANDARD_CONFIG_REMOTE_PATH,
551
- },
552
- });
553
-
554
- await updateVaultSecrets(vaultSiteSecretsPath, graphQLServerSecretData);
555
-
556
- let siteAWSSecrets = null;
557
-
558
- if (useS3 === true || useS3 === 'true') {
559
- const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
560
- siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
561
- console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
562
- }
563
-
564
- const awsS3Vars =
565
- useS3 === true || useS3 === 'true'
566
- ? `
567
- AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
568
- AWS_S3_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
569
- AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
570
- AWS_REGION: vault:secret/data/${site}/aws/config#AWS_REGION`.trim()
571
- : '';
572
- // Prepare graphql-server.app.yaml
573
- const graphQLServerAppYaml = `
574
- repo: docupace-graphql-server
575
- revision: ${revision}
576
- `.trim();
577
-
578
- // Prepare graphql-server.values.yaml
579
- const graphQLServerValuesYaml = `
580
- graphqlServer:
581
- auth0Domain: https://${auth0Domain}
582
- auth0ClientId: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_ID
583
- auth0Audience: ${commonSecrets.CORE_API_IDENTIFIER}
584
- baseUrl: https://${siteHost}/api/graphql
585
- coreUrl: https://${coreURL}
586
- integrationHubUrl: "https://${commonSecrets.INTEGRATION_HUB_URL}"
587
- standardConfigRemoteBranch: ${standardConfigRemoteBranch}
588
- apiLevel: "2"
589
- env:
590
- AUTH0_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_SECRET
591
- STANDARD_CONFIG_REMOTE_PATH: vault:secret/data/common/config#STANDARD_CONFIG_REMOTE_PATH
592
- SITE_CONFIG_REMOTE_PATH: vault:secret/data/${site}/common/config#SITE_CONFIG_REMOTE_PATH
593
- AUTH0_CC_CLIENT_ID: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_ID
594
- AUTH0_CC_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_SECRET${awsS3Vars ? '\n ' + awsS3Vars.trim() : ''}
595
- ${
596
- useS3 === true || useS3 === 'true'
597
- ? `
598
- serviceAccount:
599
- create: true
600
- annotations:
601
- "helm.sh/hook": pre-install
602
- "helm.sh/hook-weight": "-10"
603
- eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket`.trim()
604
- : ''
605
- }
606
- image:
607
- repository: registry.paperout.com/docupace-graphql-server-${env}-docker-local/docupace-graphql-server
608
- tag: ${imageTag}
609
- imagePullSecrets:
610
- - name: jf-artifactory
611
- ingress:
612
- annotations:
613
- external-dns.alpha.kubernetes.io/hostname: ${siteHost}
614
- external-dns.alpha.kubernetes.io/zone: public
615
- cert-manager.io/cluster-issuer: letsencrypt
616
- nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
617
- enabled: true
618
- className: nginx
619
- hosts:
620
- - host: ${siteHost}
621
- paths:
622
- - path: /api/graphql
623
- pathType: Prefix
624
- tls:
625
- - hosts:
626
- - ${siteHost}
627
- secretName: dp-next-ui-cert`.trim();
628
-
629
- // Write configuration files
630
- console.log('Writing ArgoCD GraphQL Server configuration files...');
631
- await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
632
-
633
- await fs.writeFile(
634
- `${repoPath}/dp/${site}/graphql-server.app.yaml`,
635
- graphQLServerAppYaml,
636
- (err) => {
637
- if (err) {
638
- console.error('Failed to write the file:', err);
639
- } else {
640
- console.log('File written successfully.');
641
- }
642
- },
643
- );
644
-
645
- await fs.writeFile(
646
- `${repoPath}/dp/${site}/graphql-server.values.yaml`,
647
- graphQLServerValuesYaml,
648
- (err) => {
649
- if (err) {
650
- console.error(
651
- `Failed to write ${repoPath}/dp/${site}/graphql-server.values.yaml file:`,
652
- err,
653
- );
654
- } else {
655
- console.log(
656
- `File ${repoPath}/dp/${site}/graphql-server.values.yaml written successfully.`,
657
- );
658
- }
659
- },
660
- );
661
- console.log('GraphQL Server configuration is done!');
662
- } catch (error) {
663
- console.error('Error configuring GraphQL Server:', error);
664
- }
665
- }
666
-
667
- export async function configureFromSite(
668
- fromSite,
669
- toSite,
670
- fromEnv,
671
- toEnv,
672
- deployUI,
673
- deployGraphQLServer,
674
- useNewDomain,
675
- useS3Ui,
676
- deployCCUI,
677
- useS3Gq,
678
- auth0Tenant,
679
- ) {
680
- console.log(
681
- `Configuring Auth0 tenants and ArgoCD apps for site: ${toSite} in env: ${toEnv} from site: ${fromSite}`,
682
- );
683
- // Common Secrets
684
- const commonSecretsPath = getVaultSecretsConfigs(toSite).commonSecretsPath;
685
- console.log(`commonSecretsPath => ${commonSecretsPath}`);
686
- const commonSecrets = await getVaultSecrets(commonSecretsPath);
687
-
688
- // Site Common Secrets
689
- const siteCommonSecretsPath =
690
- getVaultSecretsConfigs(toSite).siteCommonSecretsPath;
691
- console.log(`siteCommonSecretsPath => ${siteCommonSecretsPath}`);
692
- const siteCommonSecrets = await getVaultSecrets(siteCommonSecretsPath);
693
- let auth0Domain;
694
- if (auth0Tenant === '') {
695
- auth0Domain = `docupace-${toEnv}-${toSite}.us.auth0.com`;
696
- } else {
697
- auth0Domain = `${auth0Tenant}.us.auth0.com`;
698
- }
699
-
700
- const auth0ClientId = siteCommonSecrets.AUTH0_CLIENT_ID;
701
- const auth0ClientSecret = siteCommonSecrets.AUTH0_CLIENT_SECRET;
702
- const auth0Token = await getAuth0AuthToken(
703
- auth0Domain,
704
- auth0ClientId,
705
- auth0ClientSecret,
706
- );
707
-
708
- // UI MAIN app
709
- const uiSecretsPath = getVaultSecretsConfigs(toSite).uiSecretsPath;
710
- console.log(`uiSecretsPath => ${uiSecretsPath}`);
711
-
712
- // UI CC app
713
- const ccUISecretsPath = getVaultSecretsConfigs(toSite).ccUISecretsPath;
714
- console.log(`ccUISecretsPath => ${ccUISecretsPath}`);
715
-
716
- // GraphQL-Server app
717
- const graphqlSecretsPath =
718
- getVaultSecretsConfigs(toSite).graphqlServerSecretsPath;
719
- console.log(`graphqlSecretsPath => ${graphqlSecretsPath}`);
720
-
721
- let repoPathFromEnv = '';
722
- let repoPathToEnv = '';
723
- // Clone repositories
724
- if (fromEnv === toEnv) {
725
- repoPathFromEnv = await cloneEnvRepository(fromEnv);
726
- repoPathToEnv = repoPathFromEnv;
727
- } else {
728
- repoPathFromEnv = await cloneEnvRepository(fromEnv);
729
- repoPathToEnv = await cloneEnvRepository(toEnv);
730
- }
731
-
732
- //TODO: clone fromEnv and toEnv. replace above with this
733
-
734
- // const auth0RepoPath = await cloneRepository('auth0-site-setup');
735
- let uiImageTag, uiRevision;
736
- if (deployUI === true || deployUI === 'true') {
737
- // Read deploy configs
738
- const { deployConfig: deployUIConfig } = await readDeployConfig(
739
- 'ui',
740
- fromEnv,
741
- fromSite,
742
- 'values',
743
- );
744
- const { deployConfig: deployUiRevisionConfig } = await readDeployConfig(
745
- 'ui',
746
- fromEnv,
747
- fromSite,
748
- 'app',
749
- );
750
-
751
- uiImageTag = deployUIConfig.image.tag;
752
- uiRevision = deployUiRevisionConfig.revision;
753
-
754
- console.log(`Copying Latest UI Revision: ${uiRevision}`);
755
- }
756
-
757
- let ccImageTag, ccRevision;
758
- if (deployCCUI === true || deployCCUI === 'true') {
759
- const { deployConfig: deployCCConfig } = await readDeployConfig(
760
- 'cc',
761
- fromEnv,
762
- fromSite,
763
- 'values',
764
- );
765
-
766
- const { deployConfig: deployCCRevisionConfig } = await readDeployConfig(
767
- 'cc',
768
- fromEnv,
769
- fromSite,
770
- 'app',
771
- );
772
-
773
- ccImageTag = deployCCConfig.image.tag;
774
- ccRevision = deployCCRevisionConfig.revision;
775
-
776
- console.log(`Copying Latest CC Revision: ${ccRevision}`);
777
- }
778
-
779
- const { deployConfig: deployGraphQLServerConfig } = await readDeployConfig(
780
- 'graphql-server',
781
- fromEnv,
782
- fromSite,
783
- 'values',
784
- );
785
-
786
- const { deployConfig: deployGraphQLServerRevisionConfig } =
787
- await readDeployConfig('graphql-server', fromEnv, fromSite, 'app');
788
-
789
- const gqRevision = deployGraphQLServerRevisionConfig.revision;
790
-
791
- console.log(`Copying Latest GQ Server Revision: ${gqRevision}`);
792
-
793
- const graphqlImageTag = deployGraphQLServerConfig.image.tag;
794
- const graphqlStandardConfigRemoteBranch =
795
- deployGraphQLServerConfig.graphqlServer.standardConfigRemoteBranch;
796
-
797
- if (deployUI === true || deployUI === 'true') {
798
- console.log(
799
- `Copying Latest UI Image Tag: ${uiImageTag} from site: ${fromSite} to site: ${toSite}`,
800
- );
801
- }
802
-
803
- if (deployCCUI === true || deployCCUI === 'true') {
804
- console.log(
805
- `Copying Latest CC-UI Image Tag: ${ccImageTag} from site: ${fromSite} to site: ${toSite}`,
806
- );
807
- }
808
-
809
- console.log(
810
- `Copying Latest GraphQL Server Image Tag: ${deployGraphQLServerConfig.image.tag} from site: ${fromSite} to site: ${toSite}`,
811
- );
812
-
813
- const envConfig = environmentConfig[toEnv];
814
-
815
- let CORE_URL, SITE_HOST, CORE_API_CONTEXT, CONNECT_URL, DOCUPACE_HOST;
816
- const newUrl = envConfig.newUrl(toSite);
817
- const ccUrl = envConfig.ccUrl(toSite);
818
-
819
- SITE_HOST = `${newUrl}`;
820
-
821
- if (useNewDomain === true || useNewDomain === 'true') {
822
- const newUrl = envConfig.newUrl(toSite);
823
- CORE_URL = `${newUrl}/core`;
824
- // SITE_HOST = newUrl;
825
- CORE_API_CONTEXT = 'core';
826
- CONNECT_URL = `${newUrl}/connect`;
827
- DOCUPACE_HOST = envConfig.docupaceHost();
828
- } else {
829
- const oldUrl = envConfig.oldUrl(toSite);
830
- CORE_URL = oldUrl;
831
- // SITE_HOST = oldUrl;
832
- CORE_API_CONTEXT = toSite;
833
- CONNECT_URL = `${oldUrl}_ui`;
834
- }
835
-
836
- if (deployUI === true || deployUI === 'true') {
837
- await configureUI(
838
- SITE_HOST,
839
- CORE_URL,
840
- CONNECT_URL,
841
- DOCUPACE_HOST,
842
- toSite,
843
- toEnv,
844
- auth0Domain,
845
- auth0ClientId,
846
- auth0ClientSecret,
847
- auth0Token,
848
- uiSecretsPath,
849
- uiImageTag,
850
- uiRevision,
851
- repoPathToEnv,
852
- useS3Ui,
853
- );
854
- }
855
-
856
- if (deployCCUI === true || deployCCUI === 'true') {
857
- await configureCCUI(
858
- SITE_HOST,
859
- CORE_URL,
860
- CONNECT_URL,
861
- DOCUPACE_HOST,
862
- toSite,
863
- toEnv,
864
- auth0Domain,
865
- auth0ClientId,
866
- auth0ClientSecret,
867
- auth0Token,
868
- ccUISecretsPath,
869
- ccImageTag,
870
- ccRevision,
871
- repoPathToEnv,
872
- useS3Ui,
873
- ccUrl,
874
- );
875
- }
876
-
877
- await configureGraphQLServer(
878
- SITE_HOST,
879
- CORE_URL,
880
- DOCUPACE_HOST,
881
- toSite,
882
- toEnv,
883
- auth0Domain,
884
- auth0ClientId,
885
- auth0ClientSecret,
886
- auth0Token,
887
- graphqlSecretsPath,
888
- graphqlImageTag,
889
- gqRevision,
890
- graphqlStandardConfigRemoteBranch,
891
- repoPathToEnv,
892
- commonSecrets,
893
- useS3Gq,
894
- );
895
-
896
- console.log('Updating Core Site Config...');
897
- await updateCoreSiteConfig(toSite, toEnv, useS3Ui, useS3Gq);
898
- await pushDeployConfig(
899
- repoPathToEnv,
900
- `Config update for ${toSite} from ${fromSite} GraphQL: ${graphqlImageTag}`,
901
- );
902
- }
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+ import axios from 'axios';
4
+ import * as crypto from 'crypto';
5
+
6
+ import {
7
+ cloneEnvRepository,
8
+ cloneRepository,
9
+ pushDeployConfig,
10
+ readDeployConfig,
11
+ } from '../next/deploy.js';
12
+
13
+ import { getVaultSecrets, updateVaultSecrets } from './vault.js';
14
+
15
+ import {
16
+ coreSiteEnvMap,
17
+ environmentConfig,
18
+ getVaultSecretsConfigs,
19
+ } from '../next/config.js';
20
+
21
+ async function ensureDirectoryExists(dirPath) {
22
+ try {
23
+ await fs.promises.mkdir(dirPath, { recursive: true });
24
+ console.log(`Directory created or already exists: ${dirPath}`);
25
+ } catch (err) {
26
+ console.error(`Failed to create directory: ${err.message}`);
27
+ }
28
+ }
29
+
30
+ export async function getAuth0AuthToken(auth0Domain, clientId, clientSecret) {
31
+ try {
32
+ const response = await axios.post(
33
+ `https://${auth0Domain}/oauth/token`,
34
+ {
35
+ client_id: clientId,
36
+ client_secret: clientSecret,
37
+ audience: `https://${auth0Domain}/api/v2/`,
38
+ grant_type: 'client_credentials',
39
+ },
40
+ {
41
+ headers: {
42
+ 'Content-Type': 'application/json',
43
+ },
44
+ },
45
+ );
46
+
47
+ const authToken = response.data.access_token;
48
+ // console.log("Auth0 Auth Token:", authToken);
49
+ return authToken;
50
+ } catch (error) {
51
+ console.error(
52
+ 'Error fetching Auth0 token:',
53
+ error.response ? error.response.data : error.message,
54
+ );
55
+ }
56
+ }
57
+
58
+ async function configureUI(
59
+ siteHost,
60
+ coreURL,
61
+ connectURL,
62
+ docupaceHost,
63
+ site,
64
+ env,
65
+ auth0Domain,
66
+ auth0ClientId,
67
+ auth0ClientSecret,
68
+ auth0Token,
69
+ vaultSiteSecretsPath,
70
+ imageTag,
71
+ revision,
72
+ repoPath,
73
+ useS3,
74
+ ) {
75
+ console.log(
76
+ `Configuring UI for site: ${site} Host: ${siteHost} in env: ${env}`,
77
+ );
78
+ siteHost = siteHost.replace('https://', '');
79
+ coreURL = coreURL.replace('https://', '');
80
+ connectURL = connectURL.replace('https://', '');
81
+
82
+ try {
83
+ const auth0Response = await axios.get(
84
+ `https://${auth0Domain}/api/v2/clients`,
85
+ {
86
+ headers: { authorization: `Bearer ${auth0Token}` },
87
+ },
88
+ );
89
+
90
+ const uiClient = auth0Response.data.find(
91
+ (client) => client.name === 'docupace-ui-main',
92
+ );
93
+ const uiAuth0ClientId = uiClient.client_id;
94
+ const uiAuth0ClientSecret = uiClient.client_secret;
95
+
96
+ // Generate Auth0 Secret
97
+ const uiAuth0Secret = crypto
98
+ .randomBytes(48)
99
+ .toString('base64')
100
+ .replace(/[^a-zA-Z0-9]/g, '');
101
+
102
+ // Prepare data payload
103
+ console.log('Preparing Vault UI data payload...');
104
+ const uiSecretData = JSON.stringify({
105
+ data: {
106
+ AUTH0_CLIENT_ID: uiAuth0ClientId,
107
+ AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
108
+ AUTH0_SECRET: uiAuth0Secret,
109
+ },
110
+ });
111
+
112
+ await updateVaultSecrets(vaultSiteSecretsPath, uiSecretData);
113
+
114
+ let siteAWSSecrets = null;
115
+
116
+ if (useS3 === true || useS3 === 'true') {
117
+ const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
118
+ siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
119
+ console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
120
+ }
121
+
122
+ const awsS3Vars =
123
+ useS3 === true || useS3 === 'true'
124
+ ? `
125
+ AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
126
+ AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
127
+ AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
128
+ AWS_REGION: vault:secret/data/${site}/aws/config#AWS_REGION`
129
+ : '';
130
+
131
+ // Prepare ui.app.yaml
132
+ const uiAppYaml = `
133
+ repo: docupace-ui-main
134
+ revision: ${revision}
135
+ `.trim();
136
+
137
+ // Prepare ui.values.yaml
138
+ const uiValuesYaml = `
139
+ uiMain:
140
+ auth0BaseUrl: https://${siteHost}
141
+ auth0IssuerBaseUrl: https://${auth0Domain}
142
+ auth0ClientId: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_ID
143
+ graphqlClientUrl: https://${siteHost}/api/graphql
144
+ graphqlServerUrl: https://${siteHost}/api/graphql
145
+ connectUrl: https://${connectURL}
146
+ coreUrl: https://${coreURL}
147
+ env:
148
+ AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui/config#AUTH0_CLIENT_SECRET
149
+ AUTH0_SECRET: vault:secret/data/${site}/ui/config#AUTH0_SECRET${awsS3Vars ? '\n ' + awsS3Vars.trim() : ''}
150
+ image:
151
+ repository: registry.paperout.com/docupace-ui-main-${env}-docker-local/enterprise-ui-app
152
+ tag: ${imageTag}
153
+ ${
154
+ useS3 === true || useS3 === 'true'
155
+ ? `
156
+ serviceAccount:
157
+ create: true
158
+ annotations:
159
+ "helm.sh/hook": pre-install
160
+ "helm.sh/hook-weight": "-10"
161
+ eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket`
162
+ : ''
163
+ }
164
+ imagePullSecrets:
165
+ - name: jf-artifactory
166
+ ingress:
167
+ enabled: true
168
+ className: nginx
169
+ annotations:
170
+ external-dns.alpha.kubernetes.io/hostname: ${siteHost}
171
+ external-dns.alpha.kubernetes.io/zone: public
172
+ cert-manager.io/cluster-issuer: letsencrypt
173
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
174
+ hosts:
175
+ - host: ${siteHost}
176
+ paths:
177
+ - path: /
178
+ pathType: Prefix
179
+ tls:
180
+ - hosts:
181
+ - ${siteHost}
182
+ secretName: dp-next-ui-cert
183
+ externalConnectIngress:
184
+ enabled: true
185
+ className: nginx
186
+ annotations:
187
+ cert-manager.io/cluster-issuer: letsencrypt
188
+ external-dns.alpha.kubernetes.io/hostname: ${siteHost}
189
+ external-dns.alpha.kubernetes.io/zone: public
190
+ nginx.ingress.kubernetes.io/backend-protocol: HTTPS
191
+ nginx.ingress.kubernetes.io/configuration-snippet: |
192
+ proxy_set_header Host ${siteHost};
193
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 8k
194
+ hosts:
195
+ - host: ${siteHost}
196
+ paths:
197
+ - path: /core
198
+ - path: /core_b2b
199
+ - path: /core_reports
200
+ - path: /corerealm
201
+ - path: /connect
202
+ - path: /webstart
203
+ - path: /core_ws
204
+ - path: /core_docupload
205
+ - path: /core_ariws
206
+ - path: /core_restws
207
+ - path: /core_webdav
208
+ tls:
209
+ - hosts:
210
+ - ${siteHost}
211
+ secretName: dp-next-ui-cert
212
+ externalConnectService:
213
+ enabled: true
214
+ name: external-connect
215
+ domain: ${docupaceHost}
216
+ `.trim();
217
+
218
+ console.log('Writing configuration files...');
219
+ await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
220
+
221
+ await fs.writeFile(
222
+ `${repoPath}/dp/${site}/ui.app.yaml`,
223
+ uiAppYaml,
224
+ (err) => {
225
+ if (err) {
226
+ console.error('Failed to write the file:', err);
227
+ } else {
228
+ console.log(
229
+ `File ${repoPath}/dp/${site}/ui.app.yaml written successfully.`,
230
+ );
231
+ }
232
+ },
233
+ );
234
+
235
+ await fs.writeFile(
236
+ `${repoPath}/dp/${site}/ui.values.yaml`,
237
+ uiValuesYaml,
238
+ (err) => {
239
+ if (err) {
240
+ console.error('Failed to write the file:', err);
241
+ } else {
242
+ console.log(
243
+ `File ${repoPath}/dp/${site}/ui.values.yaml written successfully.`,
244
+ );
245
+ }
246
+ },
247
+ );
248
+ console.log('The UI part is done!');
249
+ } catch (error) {
250
+ console.error('Error configuring UI:', error);
251
+ }
252
+ }
253
+
254
+ async function configureCCUI(
255
+ siteHost,
256
+ coreURL,
257
+ connectURL,
258
+ docupaceHost,
259
+ site,
260
+ env,
261
+ auth0Domain,
262
+ auth0ClientId,
263
+ auth0ClientSecret,
264
+ auth0Token,
265
+ vaultSiteSecretsPath,
266
+ imageTag,
267
+ revision,
268
+ repoPath,
269
+ useS3,
270
+ ccUrl,
271
+ ) {
272
+ console.log(
273
+ `Configuring CC UI for site: ${site} Host: ${siteHost} in env: ${env}`,
274
+ );
275
+ siteHost = siteHost.replace('https://', '');
276
+ coreURL = coreURL.replace('https://', '');
277
+ connectURL = connectURL.replace('https://', '');
278
+ ccUrl = ccUrl.replace('https://', '');
279
+
280
+ try {
281
+ const auth0Response = await axios.get(
282
+ `https://${auth0Domain}/api/v2/clients`,
283
+ {
284
+ headers: { authorization: `Bearer ${auth0Token}` },
285
+ },
286
+ );
287
+
288
+ const uiClient = auth0Response.data.find(
289
+ (client) => client.name === 'docupace-ui-cc',
290
+ );
291
+ const uiAuth0ClientId = uiClient.client_id;
292
+ const uiAuth0ClientSecret = uiClient.client_secret;
293
+
294
+ // Generate Auth0 Secret
295
+ const uiAuth0Secret = crypto
296
+ .randomBytes(48)
297
+ .toString('base64')
298
+ .replace(/[^a-zA-Z0-9]/g, '');
299
+
300
+ // Prepare data payload
301
+ console.log('Preparing Vault CC UI data payload...');
302
+ const ccUISecretData = JSON.stringify({
303
+ data: {
304
+ AUTH0_CLIENT_ID: uiAuth0ClientId,
305
+ AUTH0_CLIENT_SECRET: uiAuth0ClientSecret,
306
+ AUTH0_SECRET: uiAuth0Secret,
307
+ },
308
+ });
309
+ console.log('Updating Vault Site Secret =>', vaultSiteSecretsPath);
310
+ await updateVaultSecrets(vaultSiteSecretsPath, ccUISecretData);
311
+
312
+ let siteAWSSecrets = null;
313
+
314
+ if (useS3 === true || useS3 === 'true') {
315
+ const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
316
+ siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
317
+ console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
318
+ }
319
+
320
+ const awsS3Vars =
321
+ useS3 === true || useS3 === 'true'
322
+ ? `
323
+ AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
324
+ AWS_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
325
+ AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
326
+ AWS_REGION: vault:secret/data/${site}/aws/config#AWS_REGION`
327
+ : '';
328
+
329
+ const uiCCAppYaml = `
330
+ repo: docupace-ui-main
331
+ revision: ${revision}
332
+ `.trim();
333
+
334
+ const uiCCValuesYaml = `
335
+ uiMain:
336
+ auth0BaseUrl: https://${ccUrl}
337
+ auth0IssuerBaseUrl: https://${auth0Domain}
338
+ auth0ClientId: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_ID
339
+ graphqlClientUrl: https://${siteHost}/api/graphql
340
+ graphqlServerUrl: https://${siteHost}/api/graphql
341
+ connectUrl: https://${connectURL}
342
+ coreUrl: https://${coreURL}
343
+ env:
344
+ AUTH0_AUDIENCE: core-api-access
345
+ AUTH0_CLIENT_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_CLIENT_SECRET
346
+ AUTH0_SECRET: vault:secret/data/${site}/ui-cc/config#AUTH0_SECRET${awsS3Vars ? '\n ' + awsS3Vars.trim() : ''}
347
+ image:
348
+ repository: registry.paperout.com/docupace-ui-main-${env}-docker-local/cc-ui-app
349
+ tag: ${imageTag}
350
+ imagePullSecrets:
351
+ - name: jf-artifactory
352
+ ingress:
353
+ enabled: true
354
+ className: nginx
355
+ annotations:
356
+ external-dns.alpha.kubernetes.io/hostname: ${ccUrl}
357
+ external-dns.alpha.kubernetes.io/zone: public
358
+ cert-manager.io/cluster-issuer: letsencrypt
359
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
360
+ hosts:
361
+ - host: ${ccUrl}
362
+ paths:
363
+ - path: /
364
+ pathType: Prefix
365
+ tls:
366
+ - hosts:
367
+ - ${ccUrl}
368
+ secretName: dp-cc-ui-cert
369
+ ${
370
+ useS3 === true || useS3 === 'true'
371
+ ? `
372
+ serviceAccount:
373
+ create: true
374
+ annotations:
375
+ "helm.sh/hook": pre-install
376
+ "helm.sh/hook-weight": "-10"
377
+ eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket`
378
+ : ''
379
+ }
380
+ `.trim();
381
+
382
+ console.log('Writing configuration files...');
383
+ await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
384
+
385
+ await fs.writeFile(
386
+ `${repoPath}/dp/${site}/cc.app.yaml`,
387
+ uiCCAppYaml,
388
+ (err) => {
389
+ if (err) {
390
+ console.error(
391
+ `Failed to write ${repoPath}/dp/${site}/cc.app.yaml file:`,
392
+ err,
393
+ );
394
+ } else {
395
+ console.log(
396
+ `File ${repoPath}/dp/${site}/cc.app.yaml written successfully.`,
397
+ );
398
+ }
399
+ },
400
+ );
401
+
402
+ await fs.writeFile(
403
+ `${repoPath}/dp/${site}/cc.values.yaml`,
404
+ uiCCValuesYaml,
405
+ (err) => {
406
+ if (err) {
407
+ console.error(
408
+ `Failed to write ${repoPath}/dp/${site}/cc.values.yaml file:`,
409
+ err,
410
+ );
411
+ } else {
412
+ console.log(
413
+ `File ${repoPath}/dp/${site}/cc.values.yaml written successfully.`,
414
+ );
415
+ }
416
+ },
417
+ );
418
+ console.log('CC-UI configuration is done!');
419
+ } catch (error) {
420
+ console.error('Error configuring CC-UI:', error);
421
+ }
422
+ }
423
+
424
+ export async function cleanAndWritePropertiesFile(configPath, content) {
425
+ try {
426
+ const cleanedContent = content
427
+ .split('\n')
428
+ .map((line) => line.trim())
429
+ .filter((line) => line !== '')
430
+ .join('\n');
431
+
432
+ await fs.writeFile(configPath, cleanedContent, 'utf8');
433
+ console.log(`Cleaned and written file to: ${configPath}`);
434
+ } catch (error) {
435
+ console.error(
436
+ `Error writing properties file to ${configPath}:`,
437
+ error.message,
438
+ );
439
+ process.exit(1);
440
+ }
441
+ }
442
+
443
+ export async function updateCoreSiteConfig(site, env, useS3Ui, useS3Gq) {
444
+ try {
445
+ const coreSiteEnv = coreSiteEnvMap[env];
446
+
447
+ const coreSiteConfigRepoPath = await cloneRepository(
448
+ `${coreSiteEnv}-site-settings`,
449
+ );
450
+
451
+ const configPath = path.join(
452
+ `${coreSiteEnv}-site-settings`,
453
+ site.toUpperCase(),
454
+ 'docucore-nextUI.properties',
455
+ );
456
+
457
+ let siteAWSSecrets = null;
458
+
459
+ if (
460
+ useS3Ui === true ||
461
+ useS3Ui === 'true' ||
462
+ useS3Gq === true ||
463
+ useS3Gq === 'true'
464
+ ) {
465
+ const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
466
+ siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
467
+ console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
468
+ }
469
+
470
+ const coreSiteConfig = `
471
+ ${
472
+ siteAWSSecrets
473
+ ? `
474
+ com.docupace.imports.files.FilesImportConfig.aws.accessKeyId=${siteAWSSecrets.AWS_ACCESS_KEY_ID}
475
+ com.docupace.imports.files.FilesImportConfig.aws.accessKeySecret=${siteAWSSecrets.AWS_SECRET_ACCESS_KEY}
476
+ com.docupace.imports.files.FilesImportConfig.aws.region=${siteAWSSecrets.AWS_REGION}`.trim()
477
+ : ''
478
+ }
479
+ `;
480
+
481
+ await fs.ensureDir(path.join(coreSiteConfigRepoPath, site.toUpperCase()));
482
+ await cleanAndWritePropertiesFile(configPath, coreSiteConfig);
483
+ await pushDeployConfig(
484
+ coreSiteConfigRepoPath,
485
+ `Core config: docucore-nextUI.properties for site: (${site.toUpperCase()}) update in env: (${env})`,
486
+ );
487
+ } catch (error) {
488
+ console.error('Error:', error.message);
489
+ process.exit(1);
490
+ }
491
+ }
492
+
493
+ async function configureGraphQLServer(
494
+ siteHost,
495
+ coreURL,
496
+ docupaceHost,
497
+ site,
498
+ env,
499
+ auth0Domain,
500
+ auth0ClientId,
501
+ auth0ClientSecret,
502
+ auth0Token,
503
+ vaultSiteSecretsPath,
504
+ imageTag,
505
+ revision,
506
+ standardConfigRemoteBranch,
507
+ repoPath,
508
+ commonSecrets,
509
+ useS3,
510
+ ) {
511
+ siteHost = siteHost.replace('https://', '');
512
+ coreURL = coreURL.replace('https://', '');
513
+ console.log(
514
+ `Configuring GraphQL Server for site: ${site} Host: ${siteHost} in env: ${env}`,
515
+ );
516
+
517
+ try {
518
+ const auth0Response = await axios.get(
519
+ `https://${auth0Domain}/api/v2/clients`,
520
+ {
521
+ headers: { authorization: `Bearer ${auth0Token}` },
522
+ },
523
+ );
524
+
525
+ const graphQLServerClient = auth0Response.data.find(
526
+ (client) => client.name === 'docupace-graphql',
527
+ );
528
+ const graphQLServerClientCredentials = auth0Response.data.find(
529
+ (client) => client.name === 'docupace-graphql-client-credentials',
530
+ );
531
+
532
+ const graphQLServerAuth0ClientId = graphQLServerClient.client_id;
533
+ const graphQLServerAuth0ClientSecret = graphQLServerClient.client_secret;
534
+
535
+ const graphQLServerCCAuth0ClientId =
536
+ graphQLServerClientCredentials.client_id;
537
+ const graphQLServerCCAuth0ClientSecret =
538
+ graphQLServerClientCredentials.client_secret;
539
+
540
+ // Prepare data payload
541
+ console.log('Preparing Vault GraphQL Server data payload...');
542
+ const graphQLServerSecretData = JSON.stringify({
543
+ data: {
544
+ AUTH0_CLIENT_ID: graphQLServerAuth0ClientId,
545
+ AUTH0_CLIENT_SECRET: graphQLServerAuth0ClientSecret,
546
+ AUTH0_CC_CLIENT_ID: graphQLServerCCAuth0ClientId,
547
+ AUTH0_CC_CLIENT_SECRET: graphQLServerCCAuth0ClientSecret,
548
+ CORE_PASSWORD: commonSecrets.CORE_PASSWORD,
549
+ REMOTE_CONFIG_PATH: commonSecrets.REMOTE_CONFIG_PATH,
550
+ STANDARD_CONFIG_REMOTE_PATH: commonSecrets.STANDARD_CONFIG_REMOTE_PATH,
551
+ },
552
+ });
553
+
554
+ await updateVaultSecrets(vaultSiteSecretsPath, graphQLServerSecretData);
555
+
556
+ let siteAWSSecrets = null;
557
+
558
+ if (useS3 === true || useS3 === 'true') {
559
+ const siteAWSSecretsPath = getVaultSecretsConfigs(site).awsSecretsPath;
560
+ siteAWSSecrets = await getVaultSecrets(siteAWSSecretsPath);
561
+ console.log(`siteAWSSecretsPath => ${siteAWSSecretsPath}`);
562
+ }
563
+
564
+ const awsS3Vars =
565
+ useS3 === true || useS3 === 'true'
566
+ ? `
567
+ AWS_ACCESS_KEY_ID: vault:secret/data/${site}/aws/config#AWS_ACCESS_KEY_ID
568
+ AWS_S3_BUCKET_NAME: vault:secret/data/${site}/aws/config#AWS_BUCKET_NAME
569
+ AWS_SECRET_ACCESS_KEY: vault:secret/data/${site}/aws/config#AWS_SECRET_ACCESS_KEY
570
+ AWS_REGION: vault:secret/data/${site}/aws/config#AWS_REGION`.trim()
571
+ : '';
572
+ // Prepare graphql-server.app.yaml
573
+ const graphQLServerAppYaml = `
574
+ repo: docupace-graphql-server
575
+ revision: ${revision}
576
+ `.trim();
577
+
578
+ // Prepare graphql-server.values.yaml
579
+ const graphQLServerValuesYaml = `
580
+ graphqlServer:
581
+ auth0Domain: https://${auth0Domain}
582
+ auth0ClientId: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_ID
583
+ auth0Audience: ${commonSecrets.CORE_API_IDENTIFIER}
584
+ baseUrl: https://${siteHost}/api/graphql
585
+ coreUrl: https://${coreURL}
586
+ integrationHubUrl: "https://${commonSecrets.INTEGRATION_HUB_URL}"
587
+ standardConfigRemoteBranch: ${standardConfigRemoteBranch}
588
+ apiLevel: "2"
589
+ env:
590
+ AUTH0_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CLIENT_SECRET
591
+ STANDARD_CONFIG_REMOTE_PATH: vault:secret/data/common/config#STANDARD_CONFIG_REMOTE_PATH
592
+ SITE_CONFIG_REMOTE_PATH: vault:secret/data/${site}/common/config#SITE_CONFIG_REMOTE_PATH
593
+ AUTH0_CC_CLIENT_ID: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_ID
594
+ AUTH0_CC_CLIENT_SECRET: vault:secret/data/${site}/graphql-server/config#AUTH0_CC_CLIENT_SECRET${awsS3Vars ? '\n ' + awsS3Vars.trim() : ''}
595
+ ${
596
+ useS3 === true || useS3 === 'true'
597
+ ? `
598
+ serviceAccount:
599
+ create: true
600
+ annotations:
601
+ "helm.sh/hook": pre-install
602
+ "helm.sh/hook-weight": "-10"
603
+ eks.amazonaws.com/role-arn: arn:aws:iam::${siteAWSSecrets.AWS_ACCOUNT_ID}:role/eks-pod-identity-connect-next-${env}-${site}-bucket`.trim()
604
+ : ''
605
+ }
606
+ image:
607
+ repository: registry.paperout.com/docupace-graphql-server-${env}-docker-local/docupace-graphql-server
608
+ tag: ${imageTag}
609
+ imagePullSecrets:
610
+ - name: jf-artifactory
611
+ ingress:
612
+ annotations:
613
+ external-dns.alpha.kubernetes.io/hostname: ${siteHost}
614
+ external-dns.alpha.kubernetes.io/zone: public
615
+ cert-manager.io/cluster-issuer: letsencrypt
616
+ nginx.ingress.kubernetes.io/proxy-buffer-size: 128k
617
+ enabled: true
618
+ className: nginx
619
+ hosts:
620
+ - host: ${siteHost}
621
+ paths:
622
+ - path: /api/graphql
623
+ pathType: Prefix
624
+ tls:
625
+ - hosts:
626
+ - ${siteHost}
627
+ secretName: dp-next-ui-cert`.trim();
628
+
629
+ // Write configuration files
630
+ console.log('Writing ArgoCD GraphQL Server configuration files...');
631
+ await ensureDirectoryExists(path.resolve(`${repoPath}/dp/${site}`));
632
+
633
+ await fs.writeFile(
634
+ `${repoPath}/dp/${site}/graphql-server.app.yaml`,
635
+ graphQLServerAppYaml,
636
+ (err) => {
637
+ if (err) {
638
+ console.error('Failed to write the file:', err);
639
+ } else {
640
+ console.log('File written successfully.');
641
+ }
642
+ },
643
+ );
644
+
645
+ await fs.writeFile(
646
+ `${repoPath}/dp/${site}/graphql-server.values.yaml`,
647
+ graphQLServerValuesYaml,
648
+ (err) => {
649
+ if (err) {
650
+ console.error(
651
+ `Failed to write ${repoPath}/dp/${site}/graphql-server.values.yaml file:`,
652
+ err,
653
+ );
654
+ } else {
655
+ console.log(
656
+ `File ${repoPath}/dp/${site}/graphql-server.values.yaml written successfully.`,
657
+ );
658
+ }
659
+ },
660
+ );
661
+ console.log('GraphQL Server configuration is done!');
662
+ } catch (error) {
663
+ console.error('Error configuring GraphQL Server:', error);
664
+ }
665
+ }
666
+
667
+ export async function configureFromSite(
668
+ fromSite,
669
+ toSite,
670
+ fromEnv,
671
+ toEnv,
672
+ deployUI,
673
+ deployGraphQLServer,
674
+ useNewDomain,
675
+ useS3Ui,
676
+ deployCCUI,
677
+ useS3Gq,
678
+ auth0Tenant,
679
+ ) {
680
+ console.log(
681
+ `Configuring Auth0 tenants and ArgoCD apps for site: ${toSite} in env: ${toEnv} from site: ${fromSite}`,
682
+ );
683
+ // Common Secrets
684
+ const commonSecretsPath = getVaultSecretsConfigs(toSite).commonSecretsPath;
685
+ console.log(`commonSecretsPath => ${commonSecretsPath}`);
686
+ const commonSecrets = await getVaultSecrets(commonSecretsPath);
687
+
688
+ // Site Common Secrets
689
+ const siteCommonSecretsPath =
690
+ getVaultSecretsConfigs(toSite).siteCommonSecretsPath;
691
+ console.log(`siteCommonSecretsPath => ${siteCommonSecretsPath}`);
692
+ const siteCommonSecrets = await getVaultSecrets(siteCommonSecretsPath);
693
+ let auth0Domain;
694
+ if (auth0Tenant === '') {
695
+ auth0Domain = `docupace-${toEnv}-${toSite}.us.auth0.com`;
696
+ } else {
697
+ auth0Domain = `${auth0Tenant}.us.auth0.com`;
698
+ }
699
+
700
+ const auth0ClientId = siteCommonSecrets.AUTH0_CLIENT_ID;
701
+ const auth0ClientSecret = siteCommonSecrets.AUTH0_CLIENT_SECRET;
702
+ const auth0Token = await getAuth0AuthToken(
703
+ auth0Domain,
704
+ auth0ClientId,
705
+ auth0ClientSecret,
706
+ );
707
+
708
+ // UI MAIN app
709
+ const uiSecretsPath = getVaultSecretsConfigs(toSite).uiSecretsPath;
710
+ console.log(`uiSecretsPath => ${uiSecretsPath}`);
711
+
712
+ // UI CC app
713
+ const ccUISecretsPath = getVaultSecretsConfigs(toSite).ccUISecretsPath;
714
+ console.log(`ccUISecretsPath => ${ccUISecretsPath}`);
715
+
716
+ // GraphQL-Server app
717
+ const graphqlSecretsPath =
718
+ getVaultSecretsConfigs(toSite).graphqlServerSecretsPath;
719
+ console.log(`graphqlSecretsPath => ${graphqlSecretsPath}`);
720
+
721
+ let repoPathFromEnv = '';
722
+ let repoPathToEnv = '';
723
+ // Clone repositories
724
+ if (fromEnv === toEnv) {
725
+ repoPathFromEnv = await cloneEnvRepository(fromEnv);
726
+ repoPathToEnv = repoPathFromEnv;
727
+ } else {
728
+ repoPathFromEnv = await cloneEnvRepository(fromEnv);
729
+ repoPathToEnv = await cloneEnvRepository(toEnv);
730
+ }
731
+
732
+ //TODO: clone fromEnv and toEnv. replace above with this
733
+
734
+ // const auth0RepoPath = await cloneRepository('auth0-site-setup');
735
+ let uiImageTag, uiRevision;
736
+ if (deployUI === true || deployUI === 'true') {
737
+ // Read deploy configs
738
+ const { deployConfig: deployUIConfig } = await readDeployConfig(
739
+ 'ui',
740
+ fromEnv,
741
+ fromSite,
742
+ 'values',
743
+ );
744
+ const { deployConfig: deployUiRevisionConfig } = await readDeployConfig(
745
+ 'ui',
746
+ fromEnv,
747
+ fromSite,
748
+ 'app',
749
+ );
750
+
751
+ uiImageTag = deployUIConfig.image.tag;
752
+ uiRevision = deployUiRevisionConfig.revision;
753
+
754
+ console.log(`Copying Latest UI Revision: ${uiRevision}`);
755
+ }
756
+
757
+ let ccImageTag, ccRevision;
758
+ if (deployCCUI === true || deployCCUI === 'true') {
759
+ const { deployConfig: deployCCConfig } = await readDeployConfig(
760
+ 'cc',
761
+ fromEnv,
762
+ fromSite,
763
+ 'values',
764
+ );
765
+
766
+ const { deployConfig: deployCCRevisionConfig } = await readDeployConfig(
767
+ 'cc',
768
+ fromEnv,
769
+ fromSite,
770
+ 'app',
771
+ );
772
+
773
+ ccImageTag = deployCCConfig.image.tag;
774
+ ccRevision = deployCCRevisionConfig.revision;
775
+
776
+ console.log(`Copying Latest CC Revision: ${ccRevision}`);
777
+ }
778
+
779
+ const { deployConfig: deployGraphQLServerConfig } = await readDeployConfig(
780
+ 'graphql-server',
781
+ fromEnv,
782
+ fromSite,
783
+ 'values',
784
+ );
785
+
786
+ const { deployConfig: deployGraphQLServerRevisionConfig } =
787
+ await readDeployConfig('graphql-server', fromEnv, fromSite, 'app');
788
+
789
+ const gqRevision = deployGraphQLServerRevisionConfig.revision;
790
+
791
+ console.log(`Copying Latest GQ Server Revision: ${gqRevision}`);
792
+
793
+ const graphqlImageTag = deployGraphQLServerConfig.image.tag;
794
+ const graphqlStandardConfigRemoteBranch =
795
+ deployGraphQLServerConfig.graphqlServer.standardConfigRemoteBranch;
796
+
797
+ if (deployUI === true || deployUI === 'true') {
798
+ console.log(
799
+ `Copying Latest UI Image Tag: ${uiImageTag} from site: ${fromSite} to site: ${toSite}`,
800
+ );
801
+ }
802
+
803
+ if (deployCCUI === true || deployCCUI === 'true') {
804
+ console.log(
805
+ `Copying Latest CC-UI Image Tag: ${ccImageTag} from site: ${fromSite} to site: ${toSite}`,
806
+ );
807
+ }
808
+
809
+ console.log(
810
+ `Copying Latest GraphQL Server Image Tag: ${deployGraphQLServerConfig.image.tag} from site: ${fromSite} to site: ${toSite}`,
811
+ );
812
+
813
+ const envConfig = environmentConfig[toEnv];
814
+
815
+ let CORE_URL, SITE_HOST, CORE_API_CONTEXT, CONNECT_URL, DOCUPACE_HOST;
816
+ const newUrl = envConfig.newUrl(toSite);
817
+ const ccUrl = envConfig.ccUrl(toSite);
818
+
819
+ SITE_HOST = `${newUrl}`;
820
+
821
+ if (useNewDomain === true || useNewDomain === 'true') {
822
+ const newUrl = envConfig.newUrl(toSite);
823
+ CORE_URL = `${newUrl}/core`;
824
+ // SITE_HOST = newUrl;
825
+ CORE_API_CONTEXT = 'core';
826
+ CONNECT_URL = `${newUrl}/connect`;
827
+ DOCUPACE_HOST = envConfig.docupaceHost();
828
+ } else {
829
+ const oldUrl = envConfig.oldUrl(toSite);
830
+ CORE_URL = oldUrl;
831
+ // SITE_HOST = oldUrl;
832
+ CORE_API_CONTEXT = toSite;
833
+ CONNECT_URL = `${oldUrl}_ui`;
834
+ }
835
+
836
+ if (deployUI === true || deployUI === 'true') {
837
+ await configureUI(
838
+ SITE_HOST,
839
+ CORE_URL,
840
+ CONNECT_URL,
841
+ DOCUPACE_HOST,
842
+ toSite,
843
+ toEnv,
844
+ auth0Domain,
845
+ auth0ClientId,
846
+ auth0ClientSecret,
847
+ auth0Token,
848
+ uiSecretsPath,
849
+ uiImageTag,
850
+ uiRevision,
851
+ repoPathToEnv,
852
+ useS3Ui,
853
+ );
854
+ }
855
+
856
+ if (deployCCUI === true || deployCCUI === 'true') {
857
+ await configureCCUI(
858
+ SITE_HOST,
859
+ CORE_URL,
860
+ CONNECT_URL,
861
+ DOCUPACE_HOST,
862
+ toSite,
863
+ toEnv,
864
+ auth0Domain,
865
+ auth0ClientId,
866
+ auth0ClientSecret,
867
+ auth0Token,
868
+ ccUISecretsPath,
869
+ ccImageTag,
870
+ ccRevision,
871
+ repoPathToEnv,
872
+ useS3Ui,
873
+ ccUrl,
874
+ );
875
+ }
876
+
877
+ await configureGraphQLServer(
878
+ SITE_HOST,
879
+ CORE_URL,
880
+ DOCUPACE_HOST,
881
+ toSite,
882
+ toEnv,
883
+ auth0Domain,
884
+ auth0ClientId,
885
+ auth0ClientSecret,
886
+ auth0Token,
887
+ graphqlSecretsPath,
888
+ graphqlImageTag,
889
+ gqRevision,
890
+ graphqlStandardConfigRemoteBranch,
891
+ repoPathToEnv,
892
+ commonSecrets,
893
+ useS3Gq,
894
+ );
895
+
896
+ console.log('Updating Core Site Config...');
897
+ await updateCoreSiteConfig(toSite, toEnv, useS3Ui, useS3Gq);
898
+ await pushDeployConfig(
899
+ repoPathToEnv,
900
+ `Config update for ${toSite} from ${fromSite} GraphQL: ${graphqlImageTag}`,
901
+ );
902
+ }