afv-library/skills/configuring-code-analyzer/scripts/check-prerequisites.sh

190 lines
6.2 KiB
Bash
Executable File

#!/bin/bash
# check-prerequisites.sh
# Checks all Code Analyzer prerequisites and reports status.
# Usage: bash <skill_dir>/scripts/check-prerequisites.sh
#
# Exit codes:
# 0 = All prerequisites met
# 1 = Some prerequisites missing (details in output)
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
PASS="${GREEN}PASS${NC}"
FAIL="${RED}FAIL${NC}"
WARN="${YELLOW}WARN${NC}"
MISSING_COUNT=0
WARNINGS_COUNT=0
echo "========================================="
echo " Code Analyzer Prerequisites Check"
echo "========================================="
echo ""
# --- Check sf CLI ---
echo -n "Salesforce CLI (sf): "
if command -v sf &> /dev/null; then
SF_VERSION=$(sf --version 2>&1 | head -1)
echo -e "${PASS} - ${SF_VERSION}"
else
echo -e "${FAIL} - Not installed"
echo " Install: npm install -g @salesforce/cli"
MISSING_COUNT=$((MISSING_COUNT + 1))
fi
# --- Check Code Analyzer Plugin ---
echo -n "Code Analyzer plugin: "
if command -v sf &> /dev/null; then
CA_VERSION=$(sf plugins --core 2>&1 | grep -i "code-analyzer" | head -1)
if [ -n "$CA_VERSION" ]; then
echo -e "${PASS} - ${CA_VERSION}"
else
echo -e "${FAIL} - Not installed"
echo " Install: sf plugins install @salesforce/plugin-code-analyzer"
MISSING_COUNT=$((MISSING_COUNT + 1))
fi
else
echo -e "${FAIL} - Cannot check (sf CLI missing)"
MISSING_COUNT=$((MISSING_COUNT + 1))
fi
# --- Check Java ---
echo -n "Java 11+ (PMD, CPD, SFGE): "
if command -v java &> /dev/null; then
JAVA_VERSION=$(java -version 2>&1 | head -1)
# Extract major version number
JAVA_MAJOR=$(java -version 2>&1 | head -1 | sed -E 's/.*"([0-9]+)\..*/\1/')
if [ "$JAVA_MAJOR" -ge 11 ] 2>/dev/null; then
echo -e "${PASS} - ${JAVA_VERSION}"
else
echo -e "${WARN} - ${JAVA_VERSION} (need 11+)"
echo " Upgrade: brew install openjdk@11"
WARNINGS_COUNT=$((WARNINGS_COUNT + 1))
fi
else
echo -e "${FAIL} - Not installed"
echo " Install: brew install openjdk@11 (macOS) / sdk install java 11.0.x-tem"
echo " Needed for: PMD, CPD, SFGE engines"
MISSING_COUNT=$((MISSING_COUNT + 1))
fi
# --- Check JAVA_HOME ---
echo -n "JAVA_HOME: "
if [ -n "${JAVA_HOME:-}" ]; then
echo -e "${PASS} - ${JAVA_HOME}"
else
echo -e "${WARN} - Not set (may cause issues with some Java installations)"
WARNINGS_COUNT=$((WARNINGS_COUNT + 1))
fi
# --- Check Node.js ---
echo -n "Node.js 18+ (ESLint, RetireJS): "
if command -v node &> /dev/null; then
NODE_VERSION=$(node --version 2>&1)
NODE_MAJOR=$(echo "$NODE_VERSION" | sed -E 's/v([0-9]+)\..*/\1/')
if [ "$NODE_MAJOR" -ge 18 ] 2>/dev/null; then
echo -e "${PASS} - ${NODE_VERSION}"
else
echo -e "${WARN} - ${NODE_VERSION} (need 18+)"
echo " Upgrade: nvm install 20 && nvm use 20"
WARNINGS_COUNT=$((WARNINGS_COUNT + 1))
fi
else
echo -e "${FAIL} - Not installed"
echo " Install: brew install node@20 (macOS) / nvm install 20"
echo " Needed for: ESLint, RetireJS engines"
MISSING_COUNT=$((MISSING_COUNT + 1))
fi
# --- Check Python 3 ---
echo -n "Python 3 (Flow engine): "
if command -v python3 &> /dev/null; then
PY_VERSION=$(python3 --version 2>&1)
echo -e "${PASS} - ${PY_VERSION}"
else
echo -e "${WARN} - Not installed (only needed for Flow scanning)"
echo " Install: brew install python3 (macOS) / apt install python3 (Linux)"
echo " Needed for: Flow engine only"
WARNINGS_COUNT=$((WARNINGS_COUNT + 1))
fi
# --- Check authenticated org ---
echo -n "Authenticated Org (ApexGuru): "
if command -v sf &> /dev/null; then
ORG_INFO=$(sf org display 2>&1)
if echo "$ORG_INFO" | grep -qi "username\|access token"; then
ORG_USER=$(echo "$ORG_INFO" | grep -i "username" | head -1 | awk '{print $NF}')
echo -e "${PASS} - ${ORG_USER}"
else
echo -e "${WARN} - No default org (only needed for ApexGuru)"
echo " Login: sf org login web --alias my-org"
WARNINGS_COUNT=$((WARNINGS_COUNT + 1))
fi
else
echo -e "${WARN} - Cannot check (sf CLI missing)"
WARNINGS_COUNT=$((WARNINGS_COUNT + 1))
fi
# --- Check for existing config ---
echo ""
echo "-----------------------------------------"
echo -n "Config file (code-analyzer.yml): "
if [ -f "code-analyzer.yml" ] || [ -f "code-analyzer.yaml" ]; then
CONFIG_FILE=$(ls code-analyzer.yml code-analyzer.yaml 2>/dev/null | head -1)
echo -e "${PASS} - Found: ${CONFIG_FILE}"
else
echo -e "${WARN} - Not found (will use defaults)"
echo " Generate: sf code-analyzer config --output-file code-analyzer.yml"
fi
# --- Check project type ---
echo -n "Project type: "
HAS_APEX=false
HAS_LWC=false
HAS_FLOWS=false
HAS_SFDX=false
[ -d "force-app" ] && HAS_APEX=true
find . -maxdepth 4 -path "*/lwc/*" -name "*.js" 2>/dev/null | head -1 | grep -q . && HAS_LWC=true
find . -maxdepth 4 -name "*.flow-meta.xml" 2>/dev/null | head -1 | grep -q . && HAS_FLOWS=true
[ -f "sfdx-project.json" ] || [ -f "sf-project.json" ] && HAS_SFDX=true
PROJECT_TYPES=""
[ "$HAS_APEX" = true ] && PROJECT_TYPES="${PROJECT_TYPES}Apex, "
[ "$HAS_LWC" = true ] && PROJECT_TYPES="${PROJECT_TYPES}LWC, "
[ "$HAS_FLOWS" = true ] && PROJECT_TYPES="${PROJECT_TYPES}Flows, "
[ "$HAS_SFDX" = true ] && PROJECT_TYPES="${PROJECT_TYPES}SFDX Project, "
if [ -n "$PROJECT_TYPES" ]; then
echo "${PROJECT_TYPES%, }"
else
echo "Unknown (no Salesforce project markers found)"
fi
# --- Summary ---
echo ""
echo "========================================="
echo " Summary"
echo "========================================="
if [ $MISSING_COUNT -eq 0 ] && [ $WARNINGS_COUNT -eq 0 ]; then
echo -e "${GREEN}All prerequisites met! Ready to scan.${NC}"
exit 0
elif [ $MISSING_COUNT -eq 0 ]; then
echo -e "${YELLOW}${WARNINGS_COUNT} warning(s) - some engines may not work.${NC}"
echo "Core functionality (PMD, ESLint) should work if Java and Node.js are available."
exit 0
else
echo -e "${RED}${MISSING_COUNT} required prerequisite(s) missing.${NC}"
[ $WARNINGS_COUNT -gt 0 ] && echo -e "${YELLOW}${WARNINGS_COUNT} additional warning(s).${NC}"
echo ""
echo "Install missing prerequisites before running Code Analyzer."
exit 1
fi