From 12db226cfde2df929bb8bcb0c7c51d04c8900d32 Mon Sep 17 00:00:00 2001
From: mtyszczak <mateusz.tyszczak@gmail.com>
Date: Tue, 3 Sep 2024 14:13:02 +0200
Subject: [PATCH] Add Wax spec swagger generation steps

---
 scripts/bash/npm-helpers/npm_build_package.sh | 10 +--
 .../bash/npm-helpers/npm_generate_version.sh  | 20 ++++-
 scripts/bash/npm-helpers/npm_pack_package.sh  | 28 ++++++
 templates/npm_projects.gitlab-ci.yml          | 87 ++++++++++++++++---
 4 files changed, 124 insertions(+), 21 deletions(-)
 create mode 100755 scripts/bash/npm-helpers/npm_pack_package.sh

diff --git a/scripts/bash/npm-helpers/npm_build_package.sh b/scripts/bash/npm-helpers/npm_build_package.sh
index e92618a..59d2e0a 100755
--- a/scripts/bash/npm-helpers/npm_build_package.sh
+++ b/scripts/bash/npm-helpers/npm_build_package.sh
@@ -8,15 +8,15 @@ REGISTRY_URL="${2:?Missing arg #2 pointing an NPM registry URL}"
 SCOPE="${3:?Missing arg #3 pointing a package scope}"
 PROJECT_NAME="${4:?Missing arg #4 pointing a project name}"
 OUTPUT_DIR="${5:?Missing arg #5 pointing an output directory}"
-DIST_TAG="${6:-dev}"
+COMMIT_REF_PROTECTED="${6:-}"
+COMMIT_TAG="${7:-}"
 
 pushd "${SOURCE_DIR}" # move to the project directory (where package.json file is located)
 
-"${SCRIPTPATH}/npm_generate_version.sh" "${SOURCE_DIR}" "${REGISTRY_URL}" "${SCOPE}" "${PROJECT_NAME}" "${DIST_TAG}"
+"${SCRIPTPATH}/npm_generate_version.sh" "${SOURCE_DIR}" "${REGISTRY_URL}" "${SCOPE}" "${PROJECT_NAME}" "${COMMIT_REF_PROTECTED}" "${COMMIT_TAG}"
 
 npm run build
-npm pack --pack-destination "${OUTPUT_DIR}" --json > "${OUTPUT_DIR}/built_package_info.json"
-BUILT_PACKAGE_NAME=$(jq -r .[].filename "${OUTPUT_DIR}/built_package_info.json")
-echo BUILT_PACKAGE_PATH="${OUTPUT_DIR}/${BUILT_PACKAGE_NAME}" > built_package_info.env
+
+"${SCRIPTPATH}/npm_pack_package.sh" "${SOURCE_DIR}" "${REGISTRY_URL}" "${SCOPE}" "${PROJECT_NAME}" "${OUTPUT_DIR}" "${COMMIT_REF_PROTECTED}" "${COMMIT_TAG}"
 
 popd
diff --git a/scripts/bash/npm-helpers/npm_generate_version.sh b/scripts/bash/npm-helpers/npm_generate_version.sh
index 42b9c8c..d864c40 100755
--- a/scripts/bash/npm-helpers/npm_generate_version.sh
+++ b/scripts/bash/npm-helpers/npm_generate_version.sh
@@ -12,7 +12,19 @@ SCOPE="${3:?Missing arg #3 pointing a package scope}"
 
 PROJECT_NAME="${4:?Missing arg #4 pointing a project name}"
 
-DIST_TAG=${5:-"dev"}
+COMMIT_REF_PROTECTED="${5:-}"
+
+COMMIT_TAG="${6:-}"
+
+if [ "${CI_COMMIT_REF_PROTECTED}" == "true" ]; then
+  if [ -n "${CI_COMMIT_TAG}" ]; then
+    DIST_TAG="latest" # if package is built for protected tag, let's mark it as latest
+  else
+    DIST_TAG="stable" # otherwise, any build for protected branch will produce stable package
+  fi
+else
+  DIST_TAG="dev"
+fi
 
 git config --global --add safe.directory '*'
 
@@ -33,7 +45,7 @@ TAG="${_TAG/\-${PROJECT_NAME}\-/}"
 
 echo "Corrected tag (skipped subproject -${PROJECT_NAME}- suffix): ${TAG}"
 
-echo "Preparing npm package for ${PROJECT_NAME}@${TAG} (#${SHORT_HASH})"
+echo "Preparing npm package for ${SCOPE}/${PROJECT_NAME}@${TAG} (#${SHORT_HASH})"
 
 if [ "${TAG}" = "" ]; then
   echo "Could not find a valid tag name for branch"
@@ -51,7 +63,9 @@ else
   NEW_VERSION="${TAG}-${TAG_TIME}"
 fi
 
-git checkout "${PROJECT_DIR}/package.json" # be sure we're on clean version
+if ! git check-ignore "${PROJECT_DIR}/package.json"; then
+  git checkout "${PROJECT_DIR}/package.json" # be sure we're on clean version, but only if not under .gitignore
+fi
 
 jq ".name = \"${SCOPE}/${PROJECT_NAME}\" | .version = \"$NEW_VERSION\" | .publishConfig.registry = \"https://${REGISTRY_URL}\" | .publishConfig.tag = \"${DIST_TAG}\"" "${PROJECT_DIR}/package.json" > "${PROJECT_DIR}/package.json.tmp"
 
diff --git a/scripts/bash/npm-helpers/npm_pack_package.sh b/scripts/bash/npm-helpers/npm_pack_package.sh
new file mode 100755
index 0000000..54d2718
--- /dev/null
+++ b/scripts/bash/npm-helpers/npm_pack_package.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+set -e
+
+SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
+
+SOURCE_DIR="${1:?Missing arg #1 specifying a project source directory}"
+REGISTRY_URL="${2:?Missing arg #2 pointing an NPM registry URL}"
+SCOPE="${3:?Missing arg #3 pointing a package scope}"
+PROJECT_NAME="${4:?Missing arg #4 pointing a project name}"
+OUTPUT_DIR="${5:?Missing arg #5 pointing an output directory}"
+COMMIT_REF_PROTECTED="${6:-}"
+COMMIT_TAG="${7:-}"
+
+pushd "${SOURCE_DIR}" # move to the project directory (where package.json file is located)
+
+"${SCRIPTPATH}/npm_generate_version.sh" "${SOURCE_DIR}" "${REGISTRY_URL}" "${SCOPE}" "${PROJECT_NAME}" "${COMMIT_REF_PROTECTED}" "${COMMIT_TAG}"
+
+npm pack --pack-destination "${OUTPUT_DIR}" --json > "${OUTPUT_DIR}/built_package_info.json"
+BUILT_PACKAGE_NAME=$(jq -r .[].filename "${OUTPUT_DIR}/built_package_info.json")
+{
+  echo PACKAGE_SOURCE_DIR="${SOURCE_DIR}"
+  echo BUILT_PACKAGE_PATH="${OUTPUT_DIR}/${BUILT_PACKAGE_NAME}"
+} > "${SOURCE_DIR}/built_package_info.env"
+
+echo "built_package_info.env file contents:"
+cat "${SOURCE_DIR}/built_package_info.env"
+
+popd
diff --git a/templates/npm_projects.gitlab-ci.yml b/templates/npm_projects.gitlab-ci.yml
index 5132e5e..c7402d3 100644
--- a/templates/npm_projects.gitlab-ci.yml
+++ b/templates/npm_projects.gitlab-ci.yml
@@ -3,10 +3,10 @@ include:
 
 variables:
   # uses registry.gitlab.syncad.com/hive/common-ci-configuration/emsdk:3.1.62-1
-  EMSCRIPTEN_IMAGE_TAG: "3.1.62-1@sha256:98b3062135cc4e31b9efc8343e2b8c0c66b25efad18c5b7255237797ebdad286"
+  EMSCRIPTEN_IMAGE_TAG: "3.1.62-1@sha256:1bc4876054017a7199b821f251f7e7a5d694616310410b13816e7ecff2d648d4"
   EMSCRIPTEN_IMAGE: "registry.gitlab.syncad.com/hive/common-ci-configuration/emsdk:$EMSCRIPTEN_IMAGE_TAG"
 
-.npm_based_job_base:
+.node_based_job_base:
   extends: .job-defaults
 
   variables:
@@ -22,8 +22,79 @@ variables:
     - . "${NVM_DIR}/nvm.sh"  # This loads nvm environment
     - nvm use "${NODEJS_VERSION}"  # Force usage of preconfigured NodeJS version
     - cd "${SOURCE_DIR}"  # move to the project directory (where package.json file is located)
+
+.npm_based_job_base:
+  extends: .node_based_job_base
+
+  before_script:
+    - !reference [.node_based_job_base, before_script]
     - pnpm install --frozen-lockfile  # install all required dependencies
 
+.filter_out_swagger_json:
+  extends: .node_based_job_base
+  variables:
+    # The directory containing sources to be built - it can be overrided by derived job
+    SOURCE_DIR: "${CI_PROJECT_DIR}"
+    DIST_DIR: "${SOURCE_DIR}/build"
+    INPUT_SQL_SWAGGER_FILE: "${SOURCE_DIR}/endpoints/endpoint_schema.sql"
+    JSON_SWAGGER_FILE: "${DIST_DIR}/swagger-doc.json"
+
+  script:
+    - mkdir -vp "${DIST_DIR}"
+    - cat "${INPUT_SQL_SWAGGER_FILE}" | sed -n '/^  openapi json = \$\$/,/^\$\$/ { /^  openapi json = \$\$/d; /^\$\$/d; p }' > "${JSON_SWAGGER_FILE}"
+    - echo BUILT_JSON_SWAGGER_FILE="${JSON_SWAGGER_FILE}" > "${SOURCE_DIR}/built_swagger_json.env"
+
+  artifacts:
+    reports:
+      dotenv:
+        - "${SOURCE_DIR}/built_swagger_json.env"  # contains path to produced tgz
+    paths:
+      - "${JSON_SWAGGER_FILE}"
+    when: always
+    expire_in: 1 week
+
+.generate_swagger_package:
+  extends: .node_based_job_base
+  variables:
+    # The directory containing sources to be built - it can be overrided by derived job
+    SOURCE_DIR: "${CI_PROJECT_DIR}"
+    DIST_DIR: "${SOURCE_DIR}/build"
+    INPUT_JSON_SWAGGER_FILE: "${DIST_DIR}/swagger-doc.json"
+    OUT_DIR: "${DIST_DIR}/generated"
+    WAX_SPEC_GENERATOR_VERSION: "1.1.0-240903102246"
+    NPM_ALREADY_BUILT: 1
+    # Those variables should be overwriten by the derived job
+    NAMESPACE: ""
+    # Target package meta information - they should be overrided by derived job
+    NPM_PACKAGE_SCOPE: ""
+    NPM_PACKAGE_NAME: ""
+    NPM_REGISTRY_URL: "gitlab.syncad.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/"
+
+  before_script:
+    - mkdir -vp "${DIST_DIR}"
+    - pushd "${DIST_DIR}"
+    - echo @hiveio:registry=https://gitlab.syncad.com/api/v4/groups/136/-/packages/npm/ >> .npmrc
+    # Ignore package version as it will be replaced in the next step - npm generate version script
+    - npx --yes @hiveio/wax-spec-generator@${WAX_SPEC_GENERATOR_VERSION} generate-wax-spec -i "${INPUT_JSON_SWAGGER_FILE}" -o "${OUT_DIR}" -N "${NAMESPACE}" -e --npm-name "${NPM_PACKAGE_SCOPE}/${NPM_PACKAGE_NAME}" --npm-version "0.0.0"
+    - popd
+
+  script:
+    - /home/emscripten/scripts/npm_pack_package.sh "${OUT_DIR}" "${NPM_REGISTRY_URL}" "${NPM_PACKAGE_SCOPE}" "${NPM_PACKAGE_NAME}" "${DIST_DIR}" "${CI_COMMIT_REF_PROTECTED}" "${CI_COMMIT_TAG}"
+
+  artifacts:
+    reports:
+      dotenv:
+        - "${OUT_DIR}/built_package_info.env"  # contains path to produced tgz
+        - "${OUT_DIR}/built_package_version_info.env"  # contains information related to generated package version and git revision
+
+    paths:
+      - "${OUT_DIR}"  # Built source used for package.json manipulation
+      - "${DIST_DIR}/*.tgz"  # Built package for publishing
+      - "${DIST_DIR}/built_package_info.json"
+
+    when: always
+    expire_in: 1 week
+
 # Base definition for job performing an npm build step. Outputs packaged project in *.tgz form
 # tgz package path can be received by `BUILT_PACKAGE_PATH` .env variable
 .npm_build_template:
@@ -41,17 +112,7 @@ variables:
     NPM_REGISTRY_URL: "gitlab.syncad.com/api/v4/projects/${CI_PROJECT_ID}/packages/npm/"
 
   script:
-    - |
-      if [ "${CI_COMMIT_REF_PROTECTED}" == "true" ]; then
-        if [ -n "${CI_COMMIT_TAG}" ]; then
-          DIST_TAG="latest" # if package is built for protected tag, let's mark it as latest
-        else
-          DIST_TAG="stable" # otherwise, any build for protected branch will produce stable package
-        fi
-      else
-        DIST_TAG="dev"
-      fi
-      /home/emscripten/scripts/npm_build_package.sh "${SOURCE_DIR}" "${NPM_REGISTRY_URL}" "${NPM_PACKAGE_SCOPE}" "${NPM_PACKAGE_NAME}" "${DIST_DIR}" "${DIST_TAG}"
+    - /home/emscripten/scripts/npm_build_package.sh "${SOURCE_DIR}" "${NPM_REGISTRY_URL}" "${NPM_PACKAGE_SCOPE}" "${NPM_PACKAGE_NAME}" "${DIST_DIR}" "${CI_COMMIT_REF_PROTECTED}" "${CI_COMMIT_TAG}"
 
   artifacts:
     reports:
-- 
GitLab