|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +echo "📦 [cache] npm ci run" |
| 4 | + |
| 5 | +PROJECT_DIR="${PWD}" |
| 6 | +NPM_CACHE_ROOT=${NPM_CACHE_ROOT:-${HOME}/.cache/npm-cache} |
| 7 | +NODE_ENV=${NODE_ENV:-development} |
| 8 | +NODE_VERSION=$(node --version) |
| 9 | + |
| 10 | +echo "" |
| 11 | +echo "========================" |
| 12 | +echo " project directory: ${PROJECT_DIR}" |
| 13 | +echo " npm cache root: ${NPM_CACHE_ROOT}" |
| 14 | +echo " node version: ${NODE_VERSION}" |
| 15 | +echo " node env: ${NODE_ENV}" |
| 16 | +echo "========================" |
| 17 | +echo "" |
| 18 | + |
| 19 | +PACKAGE_FILE="${PWD}/package.json" |
| 20 | +PACKAGE_LOCK_FILE="${PWD}/package-lock.json" |
| 21 | + |
| 22 | +echo " package-lock file: ${PACKAGE_LOCK_FILE}" |
| 23 | + |
| 24 | +PACKAGES_HASH=$(sha1sum "${PACKAGE_LOCK_FILE}" | cut -d ' ' -f1) |
| 25 | +echo " hash: ${PACKAGES_HASH}" |
| 26 | +echo "" |
| 27 | + |
| 28 | +PACKAGES_CACHE_DIR="${NPM_CACHE_ROOT}/${NODE_VERSION}-${NODE_ENV}/${PACKAGES_HASH}" |
| 29 | + |
| 30 | +if [ -d "${PACKAGES_CACHE_DIR}" ] && [ -f "${PACKAGES_CACHE_DIR}/package-lock.json" ]; then |
| 31 | + if ! cmp --silent "${PACKAGE_FILE}" "${PACKAGES_CACHE_DIR}/package.json"; then |
| 32 | + echo "⚠️ WARNING ⚠️ package.json changed:" |
| 33 | + echo "" |
| 34 | + diff --color "${PACKAGES_CACHE_DIR}/package.json" package.json |
| 35 | + echo "" |
| 36 | + echo "- if changes could affect [package-lock.json], run: rm -rf node_modules && npm install --package-lock-only && npm run deps" |
| 37 | + echo "" |
| 38 | + echo "- or copy package.json to cached dir to ignore difference: cp package.json ${PACKAGES_CACHE_DIR}/package.json" |
| 39 | + echo "" |
| 40 | + fi |
| 41 | + |
| 42 | + echo "🎯 cache found: ${PACKAGES_CACHE_DIR}" |
| 43 | + echo "" |
| 44 | + |
| 45 | + shopt -s dotglob |
| 46 | + rm -rf node_modules/* && cp -R "${PACKAGES_CACHE_DIR}/node_modules/." node_modules/ |
| 47 | + shopt -u dotglob |
| 48 | + |
| 49 | + echo " ✅ cache loaded..." |
| 50 | +else |
| 51 | + echo "⚠️ cache not found: ${PACKAGES_CACHE_DIR}" |
| 52 | + |
| 53 | + echo "" |
| 54 | + echo " installing..." |
| 55 | + echo "" |
| 56 | + |
| 57 | + npm ci --legacy-peer-deps=false --production=false --cache "${NPM_CACHE_ROOT}" --prefer-offline --no-audit |
| 58 | + NPM_CI_EXIT_CODE="$?" |
| 59 | + |
| 60 | + echo "" |
| 61 | + |
| 62 | + if [ "${NPM_CI_EXIT_CODE}" == "0" ]; then |
| 63 | + if [ ! -d "${PACKAGES_CACHE_DIR}" ]; then |
| 64 | + mkdir -p "${PACKAGES_CACHE_DIR}" |
| 65 | + |
| 66 | + cp -R node_modules "${PACKAGES_CACHE_DIR}/node_modules" |
| 67 | + cp package.json "${PACKAGES_CACHE_DIR}/package.json" |
| 68 | + cp package-lock.json "${PACKAGES_CACHE_DIR}/package-lock.json" |
| 69 | + |
| 70 | + echo "✅ cache created: ${PACKAGES_CACHE_DIR}" |
| 71 | + echo "" |
| 72 | + else |
| 73 | + echo "⚠️ cache directory already exists..." |
| 74 | + echo "" |
| 75 | + fi |
| 76 | + else |
| 77 | + echo "❌ failed to run 'npm ci'" |
| 78 | + echo "" |
| 79 | + exit 1 |
| 80 | + fi |
| 81 | +fi |
0 commit comments