mirror of
https://github.com/Dokploy/templates
synced 2025-06-26 18:16:07 +00:00
182 lines
5.8 KiB
YAML
182 lines
5.8 KiB
YAML
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
|