name: Validate Blueprints Structure and Meta on: pull_request: branches: - main push: branches: - main jobs: validate: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Validate blueprint folders and files run: | echo "🔍 Validating blueprints folder structure..." ERROR=0 # Loop through each blueprint folder for dir in blueprints/*; do if [ -d "$dir" ]; then TEMPLATE_NAME=$(basename "$dir") COMPOSE_FILE="$dir/docker-compose.yml" TEMPLATE_FILE="$dir/template.toml" if [ ! -f "$COMPOSE_FILE" ]; then echo "❌ Missing docker-compose.yml in $TEMPLATE_NAME" ERROR=1 fi if [ ! -f "$TEMPLATE_FILE" ]; then echo "❌ Missing template.toml in $TEMPLATE_NAME" ERROR=1 fi fi done if [ $ERROR -eq 1 ]; then echo "❌ Blueprint folder validation failed." exit 1 else echo "✅ Blueprint folders validated successfully." fi - name: Validate meta.json structure and required fields run: | echo "🔍 Validating meta.json structure and required fields..." # First check if meta.json exists and is valid JSON if [ ! -f "meta.json" ]; then echo "❌ meta.json file not found" exit 1 fi if ! jq empty meta.json 2>/dev/null; then echo "❌ meta.json is not a valid JSON file" exit 1 fi ERROR=0 ERRORS_FOUND="" # Debug: Show total number of entries TOTAL_ENTRIES=$(jq '. | length' meta.json) echo "📊 Total entries in meta.json: $TOTAL_ENTRIES" # Get all entries at once and process them TOTAL_INDEX=$(($TOTAL_ENTRIES - 1)) for i in $(seq 0 $TOTAL_INDEX); do entry=$(jq -c ".[$i]" meta.json) INDEX=$((i + 1)) echo "-------------------------------------------" echo "🔍 Checking entry #$INDEX..." # Get the ID for better error reporting ID=$(echo "$entry" | jq -r '.id // "UNKNOWN"') echo "📝 Processing entry with ID: $ID" # Validate required top-level fields for field in "id" "name" "version" "description" "logo" "links" "tags"; do if [ "$(echo "$entry" | jq "has(\"$field\")")" != "true" ]; then ERROR_MSG="❌ Entry #$INDEX (ID: $ID) is missing required field: $field" echo "$ERROR_MSG" ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n" ERROR=1 fi done # Validate links object required fields if [ "$(echo "$entry" | jq 'has("links")')" == "true" ]; then for link_field in "github" "website" "docs"; do if [ "$(echo "$entry" | jq ".links | has(\"$link_field\")")" != "true" ]; then ERROR_MSG="❌ Entry #$INDEX (ID: $ID): links object is missing required field: $link_field" echo "$ERROR_MSG" ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n" ERROR=1 fi done fi # Validate tags array is not empty if [ "$(echo "$entry" | jq '.tags | length')" -eq 0 ]; then ERROR_MSG="❌ Entry #$INDEX (ID: $ID): tags array cannot be empty" echo "$ERROR_MSG" ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n" ERROR=1 fi done echo "-------------------------------------------" if [ $ERROR -eq 1 ]; then echo "❌ meta.json structure validation failed." echo -e "Summary of all errors found:${ERRORS_FOUND}" exit 1 else echo "✅ meta.json structure validated successfully." fi - name: Validate meta.json matches blueprint folders and logo files run: | echo "🔍 Validating meta.json against blueprint folders and logos..." ERROR=0 # Read all blueprint folder names into an array FOLDERS=($(ls -1 blueprints)) # Extract ids and logos from meta.json IDS_AND_LOGOS=$(jq -c '.[] | {id, logo}' meta.json) # Validate each id in meta.json exists as a folder for item in $IDS_AND_LOGOS; do ID=$(echo "$item" | jq -r '.id') LOGO=$(echo "$item" | jq -r '.logo') # Check if folder exists if [ ! -d "blueprints/$ID" ]; then echo "❌ meta.json id \"$ID\" does not have a matching folder in blueprints/" ERROR=1 continue fi # Check if logo file exists inside its folder if [ ! -f "blueprints/$ID/$LOGO" ]; then echo "❌ Logo \"$LOGO\" defined for \"$ID\" does not exist in blueprints/$ID/" ERROR=1 fi done # Validate each folder has a matching id in meta.json META_IDS=$(jq -r '.[].id' meta.json) for FOLDER in "${FOLDERS[@]}"; do FOUND=0 for ID in $META_IDS; do if [ "$FOLDER" == "$ID" ]; then FOUND=1 break fi done if [ "$FOUND" -eq 0 ]; then echo "❌ Folder \"$FOLDER\" has no matching id in meta.json" ERROR=1 fi done if [ $ERROR -eq 1 ]; then echo "❌ meta.json validation failed." exit 1 else echo "✅ meta.json validated successfully." fi