@docupace/pipeline 1.0.4 → 1.0.5-4.ervins

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 (46) hide show
  1. package/.prettierrc.cjs +12 -0
  2. package/README.md +136 -0
  3. package/bin/azuread_update_callbacks_for_app.sh +58 -0
  4. package/bin/next-changeset-validate.sh +8 -8
  5. package/eslint.config.js +26 -0
  6. package/next/changeset.sh +75 -75
  7. package/next/copy.sh +34 -34
  8. package/next/deploy.sh +40 -40
  9. package/next/execute.sh +123 -117
  10. package/next/sonar.sh +23 -23
  11. package/package.json +50 -28
  12. package/src/auth0/alias.js +72 -0
  13. package/src/auth0/cli.js +76 -0
  14. package/src/auth0/configure.js +783 -0
  15. package/src/auth0/export.js +43 -0
  16. package/src/auth0/metadata.js +132 -0
  17. package/src/auth0/vault.js +107 -0
  18. package/src/changeset/changeset-config.js +34 -0
  19. package/src/changeset/cli.js +200 -245
  20. package/src/changeset/create.js +205 -0
  21. package/src/changeset/package-util.js +86 -0
  22. package/src/changeset/util.js +43 -0
  23. package/src/changeset/validate.js +84 -44
  24. package/src/changeset/version.js +102 -0
  25. package/src/jenkins/setParams.groovy +58 -0
  26. package/src/next/alias.js +53 -0
  27. package/src/next/apache.js +73 -0
  28. package/src/next/cli.js +228 -59
  29. package/src/next/config.js +137 -0
  30. package/src/next/connect.js +227 -0
  31. package/src/next/copy.js +61 -27
  32. package/src/next/deploy.js +595 -128
  33. package/src/next/haproxy.js +71 -0
  34. package/src/next/jenkins.js +123 -0
  35. package/src/next/jira.js +84 -0
  36. package/src/next/logger.js +17 -0
  37. package/src/next/pipline.js +114 -0
  38. package/src/next/publish.js +71 -46
  39. package/src/next/pull.js +7 -7
  40. package/src/next/sonar.js +23 -23
  41. package/src/next/util.js +93 -0
  42. package/src/next/vault.js +45 -0
  43. package/terraform/apply.sh +37 -0
  44. package/terraform/init.sh +72 -0
  45. package/terraform/plan.sh +76 -0
  46. package/terraform/validate.sh +17 -0
package/next/execute.sh CHANGED
@@ -1,117 +1,123 @@
1
- #!/bin/bash
2
-
3
- # Usage: ./pipeline.sh <function> <BITBUCKET_REPO_SLUG>
4
- # Example: ./pipeline.sh build docupace-ui-main
5
-
6
- set -e # Enable command tracing
7
- GIT_SHA=$(git log --pretty=format:'%h' -n 1)
8
- JF_REGISTRY_FULL_URL="${JF_REGISTRY_URL}/${JF_REGISTRY_REPO_NAME}"
9
- PARAM1=$2
10
- PARAM2=$3
11
-
12
- pull() {
13
- IMAGE_NAME=$2
14
- docker pull "${JF_REGISTRY_FULL_URL}/${IMAGE_NAME}"
15
- }
16
-
17
- # Function to run Sonar analysis
18
- sonar() {
19
- export DOCKER_HOST=""
20
- IMAGE_NAME="${BITBUCKET_REPO_SLUG}:sha-${GIT_SHA}"
21
- SONAR_CONTAINER_NAME="${BITBUCKET_REPO_SLUG}-${GIT_SHA}"
22
-
23
- echo "Running Sonar analysis on Docker image ${IMAGE_NAME}..."
24
-
25
- # Remove any existing container with the same name
26
- if [ "$(docker ps -a --filter "name=$SONAR_CONTAINER_NAME" --format "{{.Names}}")" ]; then
27
- docker rm -f $SONAR_CONTAINER_NAME
28
- fi
29
-
30
- cd "$ROOT_DIR"
31
- docker run --rm \
32
- -e BRANCH=$BITBUCKET_BRANCH \
33
- -e PR_ID=$BITBUCKET_PR_ID \
34
- -e PR_DESTINATION_BRANCH=$BITBUCKET_PR_DESTINATION_BRANCH \
35
- -e SONAR_TOKEN=$SONAR_TOKEN \
36
- --name $SONAR_CONTAINER_NAME $IMAGE_NAME pnpm sonar
37
- }
38
-
39
- # Function to publish the Docker image
40
-
41
-
42
- loginRegistry() {
43
- echo ${JF_REGISTRY_PASSWORD_DEV} | docker login --username ${JF_REGISTRY_USER_DEV} --password-stdin ${JF_REGISTRY_URL}
44
- }
45
-
46
- logoutRegistry() {
47
- docker logout ${JF_REGISTRY_URL}
48
- }
49
-
50
- copy() {
51
- DIR="$(dirname "$0")"
52
- bash $DIR/copy.sh
53
- }
54
-
55
- publish() {
56
- BUILD_IMAGE_NAME="${BITBUCKET_REPO_SLUG}:build-${BITBUCKET_BUILD_NUMBER}"
57
- IMAGE_NAME="${BITBUCKET_REPO_SLUG}:sha-${GIT_SHA}"
58
- export DOCKER_HOST=""
59
-
60
- echo "Publishing Docker image ${IMAGE_NAME}..."
61
-
62
- loginRegistry
63
-
64
- # Check if the image already exists in the registry
65
- if docker manifest inspect ${JF_REGISTRY_FULL_URL}/${IMAGE_NAME} >/dev/null 2>&1; then
66
- echo "Tag sha-${GIT_SHA} already exists in the remote repository. Skipping push."
67
- else
68
- docker tag ${IMAGE_NAME} "${JF_REGISTRY_FULL_URL}/${IMAGE_NAME}"
69
- docker push "${JF_REGISTRY_FULL_URL}/${IMAGE_NAME}"
70
- fi
71
-
72
- # Tag and push the build image
73
- docker tag ${IMAGE_NAME} "${JF_REGISTRY_FULL_URL}/${BUILD_IMAGE_NAME}"
74
- docker push "${JF_REGISTRY_FULL_URL}/${BUILD_IMAGE_NAME}"
75
-
76
- # Tag and push each Git tag as a Docker tag
77
- GIT_TAGS=$(git tag --points-at HEAD)
78
- for GIT_TAG in ${GIT_TAGS}; do
79
- docker tag ${IMAGE_NAME} "${JF_REGISTRY_FULL_URL}/${BITBUCKET_REPO_SLUG}:${GIT_TAG}"
80
- docker push "${JF_REGISTRY_FULL_URL}/${BITBUCKET_REPO_SLUG}:${GIT_TAG}"
81
- done
82
-
83
- # Logout from Docker registry
84
- loginRegistry
85
- }
86
-
87
- # Function to deploy
88
- # application - ui|graphql
89
- # site
90
- deploy() {
91
- echo "Deploying $PARAM1 application for site $PARAM2..."
92
- DIR="$(dirname "$0")"
93
- bash $DIR/deploy.sh $PARAM1 $PARAM2
94
- }
95
-
96
- # Main logic to call the appropriate function
97
- case "$1" in
98
- build)
99
- build
100
- ;;
101
- sonar)
102
- sonar
103
- ;;
104
- publish)
105
- publish
106
- ;;
107
- deploy)
108
- deploy
109
- ;;
110
- copy)
111
- copy
112
- ;;
113
- *)
114
- echo "Usage: $0 {build|sonar|publish|deploy|copy} <BITBUCKET_REPO_SLUG>"
115
- exit 1
116
- ;;
117
- esac
1
+ #!/bin/bash
2
+
3
+ # Usage: ./pipeline.sh <function> <BITBUCKET_REPO_SLUG>
4
+ # Example: ./pipeline.sh build docupace-ui-main
5
+
6
+ set -e # Enable command tracing
7
+ GIT_SHA=$(git log --pretty=format:'%h' -n 1)
8
+ JF_REGISTRY_FULL_URL="${JF_REGISTRY_URL}/${JF_REGISTRY_REPO_NAME}"
9
+ PARAM1=$2
10
+ PARAM2=$3
11
+
12
+ pull() {
13
+ IMAGE_NAME=$2
14
+ docker pull "${JF_REGISTRY_FULL_URL}/${IMAGE_NAME}"
15
+ }
16
+
17
+ # Function to run Sonar analysis
18
+ sonar() {
19
+ export DOCKER_HOST=""
20
+ IMAGE_NAME="${BITBUCKET_REPO_SLUG}:sha-${GIT_SHA}"
21
+ SONAR_CONTAINER_NAME="${BITBUCKET_REPO_SLUG}-${GIT_SHA}"
22
+
23
+ echo "Running Sonar analysis on Docker image ${IMAGE_NAME}..."
24
+
25
+ # Remove any existing container with the same name
26
+ if [ "$(docker ps -a --filter "name=$SONAR_CONTAINER_NAME" --format "{{.Names}}")" ]; then
27
+ docker rm -f $SONAR_CONTAINER_NAME
28
+ fi
29
+
30
+ cd "$ROOT_DIR"
31
+ docker run --rm \
32
+ -e BRANCH=$BITBUCKET_BRANCH \
33
+ -e PR_ID=$BITBUCKET_PR_ID \
34
+ -e PR_DESTINATION_BRANCH=$BITBUCKET_PR_DESTINATION_BRANCH \
35
+ -e SONAR_TOKEN=$SONAR_TOKEN \
36
+ --name $SONAR_CONTAINER_NAME $IMAGE_NAME pnpm sonar
37
+ }
38
+
39
+ # Function to publish the Docker image
40
+
41
+
42
+ loginRegistry() {
43
+ echo ${JF_REGISTRY_PASSWORD_DEV} | docker login --username ${JF_REGISTRY_USER_DEV} --password-stdin ${JF_REGISTRY_URL}
44
+ }
45
+
46
+ logoutRegistry() {
47
+ docker logout ${JF_REGISTRY_URL}
48
+ }
49
+
50
+ copy() {
51
+ DIR="$(dirname "$0")"
52
+ bash $DIR/copy.sh
53
+ }
54
+
55
+ publish() {
56
+ SLUG_SUFFIX=""
57
+ if [ -n "$APP_NAME" ]; then
58
+ SLUG_SUFFIX="-${APP_NAME}"
59
+ fi
60
+
61
+ BUILD_IMAGE_NAME="${BITBUCKET_REPO_SLUG}${SLUG_SUFFIX}:build-${BITBUCKET_BUILD_NUMBER}"
62
+ IMAGE_NAME="${BITBUCKET_REPO_SLUG}${SLUG_SUFFIX}:sha-${GIT_SHA}"
63
+
64
+ export DOCKER_HOST=""
65
+
66
+ echo "Publishing Docker image ${IMAGE_NAME}..."
67
+
68
+ loginRegistry
69
+
70
+ # Check if the image already exists in the registry
71
+ if docker manifest inspect ${JF_REGISTRY_FULL_URL}/${IMAGE_NAME} >/dev/null 2>&1; then
72
+ echo "Tag sha-${GIT_SHA} already exists in the remote repository. Skipping push."
73
+ else
74
+ docker tag ${IMAGE_NAME} "${JF_REGISTRY_FULL_URL}/${IMAGE_NAME}"
75
+ docker push "${JF_REGISTRY_FULL_URL}/${IMAGE_NAME}"
76
+ fi
77
+
78
+ # Tag and push the build image
79
+ docker tag ${IMAGE_NAME} "${JF_REGISTRY_FULL_URL}/${BUILD_IMAGE_NAME}"
80
+ docker push "${JF_REGISTRY_FULL_URL}/${BUILD_IMAGE_NAME}"
81
+
82
+ # Tag and push each Git tag as a Docker tag
83
+ GIT_TAGS=$(git tag --points-at HEAD)
84
+ for GIT_TAG in ${GIT_TAGS}; do
85
+ docker tag ${IMAGE_NAME} "${JF_REGISTRY_FULL_URL}/${BITBUCKET_REPO_SLUG}:${GIT_TAG}"
86
+ docker push "${JF_REGISTRY_FULL_URL}/${BITBUCKET_REPO_SLUG}:${GIT_TAG}"
87
+ done
88
+
89
+ # Logout from Docker registry
90
+ loginRegistry
91
+ }
92
+
93
+ # Function to deploy
94
+ # application - ui|graphql
95
+ # site
96
+ deploy() {
97
+ echo "Deploying $PARAM1 application for site $PARAM2..."
98
+ DIR="$(dirname "$0")"
99
+ bash $DIR/deploy.sh $PARAM1 $PARAM2
100
+ }
101
+
102
+ # Main logic to call the appropriate function
103
+ case "$1" in
104
+ build)
105
+ build
106
+ ;;
107
+ sonar)
108
+ sonar
109
+ ;;
110
+ publish)
111
+ publish
112
+ ;;
113
+ deploy)
114
+ deploy
115
+ ;;
116
+ copy)
117
+ copy
118
+ ;;
119
+ *)
120
+ echo "Usage: $0 {build|sonar|publish|deploy|copy} <BITBUCKET_REPO_SLUG>"
121
+ exit 1
122
+ ;;
123
+ esac
package/next/sonar.sh CHANGED
@@ -1,23 +1,23 @@
1
- #!/bin/bash
2
-
3
- # Initialize sonar-scanner command with common parameters
4
- SONAR_CMD="npx sonarqube-scanner"
5
-
6
- echo "PR_ID=$PR_ID"
7
- echo "BRANCH=$BRANCH"
8
- echo "PR_DESTINATION_BRANCH=$PR_DESTINATION_BRANCH"
9
-
10
- # Determine the type of scan based on environment variables
11
- if [[ ! -z "$PR_ID" ]]; then
12
- SONAR_CMD+=" \
13
- -Dsonar.pullrequest.key=$PR_ID \
14
- -Dsonar.pullrequest.branch=$BRANCH \
15
- -Dsonar.pullrequest.base=$PR_DESTINATION_BRANCH"
16
- else
17
- SONAR_CMD+=" \
18
- -Dsonar.branch.name=$BRANCH"
19
- fi
20
-
21
- # Execute the sonar-scanner command
22
- echo "Running: $SONAR_CMD"
23
- $SONAR_CMD
1
+ #!/bin/bash
2
+
3
+ # Initialize sonar-scanner command with common parameters
4
+ SONAR_CMD="npx sonarqube-scanner"
5
+
6
+ echo "PR_ID=$PR_ID"
7
+ echo "BRANCH=$BRANCH"
8
+ echo "PR_DESTINATION_BRANCH=$PR_DESTINATION_BRANCH"
9
+
10
+ # Determine the type of scan based on environment variables
11
+ if [[ ! -z "$PR_ID" ]]; then
12
+ SONAR_CMD+=" \
13
+ -Dsonar.pullrequest.key=$PR_ID \
14
+ -Dsonar.pullrequest.branch=$BRANCH \
15
+ -Dsonar.pullrequest.base=$PR_DESTINATION_BRANCH"
16
+ else
17
+ SONAR_CMD+=" \
18
+ -Dsonar.branch.name=$BRANCH"
19
+ fi
20
+
21
+ # Execute the sonar-scanner command
22
+ echo "Running: $SONAR_CMD"
23
+ $SONAR_CMD
package/package.json CHANGED
@@ -1,28 +1,50 @@
1
- {
2
- "name": "@docupace/pipeline",
3
- "version": "1.0.4",
4
- "description": "",
5
- "main": "index.js",
6
- "type": "module",
7
- "bin": {
8
- "dp-changeset-cli": "src/changeset/cli.js",
9
- "dp-next-cli": "src/next/cli.js"
10
- },
11
- "keywords": [
12
- "bash"
13
- ],
14
- "author": "",
15
- "license": "ISC",
16
- "dependencies": {
17
- "@changesets/cli": "^2.27.10",
18
- "commander": "^12.1.0",
19
- "dotenv": "^16.4.7",
20
- "js-yaml": "^4.1.0",
21
- "openai": "^4.76.3",
22
- "zod": "^3.24.1",
23
- "zx": "^8.2.4"
24
- },
25
- "devDependencies": {
26
- "esbuild": "^0.24.0"
27
- }
28
- }
1
+ {
2
+ "name": "@docupace/pipeline",
3
+ "version": "1.0.54.ervins",
4
+ "description": "",
5
+ "main": "index.js",
6
+ "type": "module",
7
+ "scripts": {
8
+ "test-deploy-core": "dp-next-cli deploy-core-pipeline dev template",
9
+ "test-deploy-from-site": "dp-next-cli deploy-from-site --from-env dev --to-env dev --from-site financialdev --to-site template --deploy-core true",
10
+ "test-run-pipline": "dp-next-cli run-pipeline -r docupace-next-e2e -b master -p run-tests-qa",
11
+ "test-validate": "dp-changset-cli validate",
12
+ "test-create": "dp-changset-cli create-changeset"
13
+ },
14
+ "bin": {
15
+ "dp-changeset-cli": "src/changeset/cli.js",
16
+ "dp-next-cli": "src/next/cli.js",
17
+ "dp-auth0-cli": "src/auth0/cli.js"
18
+ },
19
+ "keywords": [
20
+ "bash"
21
+ ],
22
+ "author": "",
23
+ "license": "ISC",
24
+ "dependencies": {
25
+ "@changesets/cli": "^2.27.10",
26
+ "@docupace/core-client": "^0.1.59",
27
+ "@docupace/pipeline": "^1.0.33-alpha-2",
28
+ "auth0-deploy-cli": "^8.8.0",
29
+ "axios": "^1.7.9",
30
+ "commander": "^12.1.0",
31
+ "dotenv": "^16.4.7",
32
+ "fs-extra": "^11.3.0",
33
+ "inquirer": "^12.6.1",
34
+ "js-yaml": "^4.1.0",
35
+ "lodash": "^4.17.21",
36
+ "openai": "^4.76.3",
37
+ "semver": "^7.7.2",
38
+ "zod": "^3.24.1",
39
+ "zx": "^8.3.0"
40
+ },
41
+ "devDependencies": {
42
+ "@eslint/js": "^9.17.0",
43
+ "esbuild": "^0.24.0",
44
+ "eslint": "^9.17.0",
45
+ "eslint-config-prettier": "^9.1.0",
46
+ "eslint-plugin-prettier": "^5.2.1",
47
+ "globals": "^15.14.0",
48
+ "prettier": "^3.4.2"
49
+ }
50
+ }
@@ -0,0 +1,72 @@
1
+ import axios from 'axios';
2
+
3
+ import { createAlias } from '../next/alias.js';
4
+
5
+ import { getAuth0AuthToken } from './configure.js';
6
+
7
+ import { getVaultSecrets } from './vault.js';
8
+
9
+ import { getVaultSecretsConfigs } from '../next/config.js';
10
+
11
+ import { cloneEnvRepository, readDeployConfig } from '../next/deploy.js';
12
+
13
+ export async function getCCAlias({ application, auth0Domain, auth0AuthToken }) {
14
+ console.log(`Forming alias name for application ${application}...`);
15
+
16
+ try {
17
+ const auth0Response = await axios.get(
18
+ `https://${auth0Domain}/api/v2/clients`,
19
+ {
20
+ headers: { authorization: `Bearer ${auth0AuthToken}` },
21
+ },
22
+ );
23
+
24
+ const appAuth0ClientIdData = auth0Response.data.find(
25
+ (client) => client.name === `${application}`,
26
+ );
27
+ const appAuth0ClientId = appAuth0ClientIdData.client_id;
28
+
29
+ console.log(`Client Credentials Alias: ${appAuth0ClientId}@clients`);
30
+ return `${appAuth0ClientId}@clients`;
31
+ } catch (err) {
32
+ console.error(
33
+ `Failed to form alias name for application: ${application}: ${err.message}`,
34
+ );
35
+ }
36
+ }
37
+
38
+ export async function configureAlias(site, env, username, password, realm) {
39
+ console.log(`Creating alias for site: ${site} in env: ${env}`);
40
+ // Site Common Secrets
41
+ const siteCommonSecretsPath =
42
+ getVaultSecretsConfigs(site).siteCommonSecretsPath;
43
+ console.log(`siteCommonSecretsPath => ${siteCommonSecretsPath}`);
44
+ const siteCommonSecrets = await getVaultSecrets(siteCommonSecretsPath);
45
+
46
+ const auth0Domain = `docupace-${env}-${site}.us.auth0.com`;
47
+ const auth0ClientId = siteCommonSecrets.AUTH0_CLIENT_ID;
48
+ const auth0ClientSecret = siteCommonSecrets.AUTH0_CLIENT_SECRET;
49
+ const auth0Token = await getAuth0AuthToken(
50
+ auth0Domain,
51
+ auth0ClientId,
52
+ auth0ClientSecret,
53
+ );
54
+
55
+ await cloneEnvRepository(env);
56
+
57
+ const { deployConfig: deployGraphQLServerConfig } = await readDeployConfig(
58
+ 'graphql-server',
59
+ env,
60
+ site,
61
+ 'values',
62
+ );
63
+ const coreUrl = deployGraphQLServerConfig.graphqlServer.coreUrl;
64
+
65
+ const clientCredentialsAlias = await getCCAlias({
66
+ application: 'docupace-graphql-client-credentials',
67
+ auth0Domain: auth0Domain,
68
+ auth0AuthToken: auth0Token,
69
+ });
70
+
71
+ await createAlias(coreUrl, username, password, realm, clientCredentialsAlias);
72
+ }
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { Command } from 'commander';
4
+ import { configureFromSite } from './configure.js';
5
+ import { getVaultSecrets } from './vault.js';
6
+
7
+ import dotenv from 'dotenv';
8
+ import { configureAlias } from './alias.js';
9
+ import { exportConf } from './export.js';
10
+ import { getAuth0Metadata } from './metadata.js';
11
+
12
+ dotenv.config({ path: ['.env.pipeline.local', 'config/.env.pipeline.local'] });
13
+
14
+ const program = new Command();
15
+
16
+ program
17
+ .command(
18
+ 'configureFromSite <fromSite> <toSite> <fromEnv> <toEnv> <deployUI> <deployGraphQLServer> <useNewDomain> <useS3> <deployCCUI>',
19
+ )
20
+ .description('Configure the Auth0 tenants in env for the given site')
21
+ .action(
22
+ async (
23
+ fromSite,
24
+ toSite,
25
+ fromEnv,
26
+ toEnv,
27
+ deployUI,
28
+ deployGraphQLServer,
29
+ useNewDomain,
30
+ useS3,
31
+ deployCCUI,
32
+ ) => {
33
+ await configureFromSite(
34
+ fromSite,
35
+ toSite,
36
+ fromEnv,
37
+ toEnv,
38
+ deployUI,
39
+ deployGraphQLServer,
40
+ useNewDomain,
41
+ useS3 === 'true' || useS3 === true,
42
+ deployCCUI,
43
+ );
44
+ },
45
+ );
46
+
47
+ program
48
+ .command('getVaultSecrets <vaultPath>')
49
+ .description('Get Secrets for Vault PATH')
50
+ .action(async (vaultPath) => {
51
+ const data = await getVaultSecrets(vaultPath);
52
+ console.log(JSON.stringify(data, 'null', 2));
53
+ });
54
+
55
+ program
56
+ .command('configureAlias <site> <env> <username> <password> <realm>')
57
+ .description('Configure Core Alias for the given site')
58
+ .action(async (site, env, username, password, realm) => {
59
+ await configureAlias(site, env, username, password, realm);
60
+ });
61
+
62
+ program
63
+ .command('exportConf <site> <env>')
64
+ .description('Export Auth0 configuration for the given site')
65
+ .action(async (site, env) => {
66
+ await exportConf(site, env);
67
+ });
68
+
69
+ program
70
+ .command('getAuth0Metadata <site> <env>')
71
+ .description('Get Auth0 metadata for the given site')
72
+ .action(async (site, env) => {
73
+ await getAuth0Metadata(site, env);
74
+ });
75
+
76
+ program.parse(process.argv);