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