Skip to content

Generate Images from PlantUML and drawio (Debug Edition) #51

Generate Images from PlantUML and drawio (Debug Edition)

Generate Images from PlantUML and drawio (Debug Edition) #51

name: Generate Images from PlantUML and drawio (Debug Edition)
on:
push:
paths:
- 'src/plantuml/**'
- 'src/drawio/**'
branches:
- main
- github_action_test
workflow_dispatch:
inputs:
regenerate_all:
description: 'Regenerate all images (not just changed ones)'
required: false
default: false
type: boolean
env:
OUTPUT_DIR: images
PLANTUML_PREFIX: uml_
DRAWIO_PREFIX: diagram_
jobs:
generate_images:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- name: 📋 Debug - Environment Info
run: |
echo "🐧 Runner OS: $(lsb_release -d)"
echo "💾 Memory: $(free -h | grep Mem)"
echo "💿 Disk: $(df -h /)"
echo "🏃 Runner: $RUNNER_NAME"
echo "📅 Date: $(date)"
- name: 📥 Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: 📋 Debug - Repository Info
run: |
echo "📁 Repository: ${{ github.repository }}"
echo "🌿 Branch: ${{ github.ref_name }}"
echo "📝 Commit: ${{ github.sha }}"
echo "🎯 Event: ${{ github.event_name }}"
echo "🔄 Regenerate all: '${{ github.event.inputs.regenerate_all }}'"
echo "📂 Working directory: $(pwd)"
- name: 📁 Create output directory
run: |
mkdir -p ${{ env.OUTPUT_DIR }}
echo "📁 Output directory: ${{ env.OUTPUT_DIR }}"
echo "📊 Prefixes: PlantUML='${{ env.PLANTUML_PREFIX }}' | Draw.io='${{ env.DRAWIO_PREFIX }}'"
- name: 📋 Debug - Repository Structure
run: |
echo "=== Repository structure ==="
find . -name "*.puml" -o -name "*.plantuml" -o -name "*.drawio" -o -name "*.dio" | head -20 || echo "No diagram files found"
echo ""
echo "=== src/plantuml contents ==="
if [ -d "src/plantuml" ]; then
ls -la src/plantuml/
echo "PlantUML file count: $(find src/plantuml -name "*.puml" -o -name "*.plantuml" | wc -l)"
else
echo "❌ src/plantuml directory not found"
fi
echo ""
echo "=== src/drawio contents ==="
if [ -d "src/drawio" ]; then
ls -la src/drawio/
echo "Draw.io file count: $(find src/drawio -name "*.drawio" -o -name "*.dio" | wc -l)"
else
echo "❌ src/drawio directory not found"
fi
- name: ☕ Set up JDK 11
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '11'
- name: 📋 Debug - Java Info
run: |
echo "☕ Java version: $(java -version 2>&1 | head -1)"
echo "🏠 JAVA_HOME: $JAVA_HOME"
echo "📁 Java location: $(which java)"
- name: ⚡ Install dependencies (optimized)
run: |
echo "🔄 Starting optimized package installation..."
# Disable man-db auto-update to save 3-5 minutes!
sudo rm /var/lib/man-db/auto-update
echo "🚫 Disabled man-db auto-update"
# Update package list
sudo apt-get update
echo "📦 Package list updated"
# Install Graphviz without recommendations (faster)
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \
--no-install-recommends \
--no-install-suggests \
graphviz
echo "🎨 Graphviz installed successfully"
# Verify installation
dot -V 2>&1 || echo "❌ Graphviz verification failed"
- name: 📥 Download and setup PlantUML
run: |
echo "📥 Downloading PlantUML..."
wget --progress=dot:giga \
https://github.com/plantuml/plantuml/releases/latest/download/plantuml.jar \
-O /tmp/plantuml.jar
echo "📊 PlantUML file size: $(ls -lh /tmp/plantuml.jar | awk '{print $5}')"
echo "✅ PlantUML downloaded successfully"
echo "🧪 Testing PlantUML installation..."
echo "PlantUML Version: $(java -jar /tmp/plantuml.jar -version)"
- name: 🎨 Generate PlantUML images (debug mode)
continue-on-error: true
run: |
echo "=== 🎨 Generating PlantUML images ==="
output_abs=$(pwd)/${{ env.OUTPUT_DIR }}
echo "📁 Output directory: $output_abs"
# Determine processing mode
if [ "${{ github.event.inputs.regenerate_all }}" = "true" ] || [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "🔄 FULL REGENERATION MODE - Processing all files"
puml_files=$(find $(pwd)/src/plantuml -name "*.puml" -o -name "*.plantuml" 2>/dev/null)
if [ -z "$puml_files" ]; then
echo "❌ No PlantUML files found in src/plantuml/"
exit 0
fi
echo "📋 Found PlantUML files:"
echo "$puml_files"
else
echo "⚡ INCREMENTAL MODE - Processing only changed files"
changed_puml_files=$(git diff --name-only HEAD~1 HEAD | grep -E '\.(puml|plantuml)$' | grep '^src/plantuml/' || true)
if [ -z "$changed_puml_files" ]; then
echo "ℹ️ No PlantUML files changed in this commit"
exit 0
fi
echo "📋 Changed PlantUML files:"
echo "$changed_puml_files"
puml_files="$changed_puml_files"
fi
echo "📊 Processing $(echo "$puml_files" | wc -l) PlantUML file(s)..."
for file in $puml_files; do
echo "===================="
echo "🔄 Processing: $file"
# Convert relative path to absolute if needed
if [[ "$file" != /* ]]; then
file="$(pwd)/$file"
fi
# process file
base=$(basename "$file" | sed 's/\.[^.]*$//')
prefix_base="${{ env.PLANTUML_PREFIX }}${base}"
echo "📝 Prefix Base name: $prefix_base"
echo "📊 File size: $(ls -lh "$file" | awk '{print $5}')"
# Show file content preview
echo "👀 File content preview (first 5 lines):"
head -5 "$file" | sed 's/^/ | /'
echo " | ..."
# Generate PNG
echo ""
echo "🖼️ Generating PNG for: $file"
java -jar /tmp/plantuml.jar -tpng -nometadata -scale 4 "$file" || echo " WARNING: PNG generation command may have failed for $file (Exit Code: $?)" >&2
png_exit_code=$?
echo "📊 PNG generation exit code: $png_exit_code"
if [ -n "$png_exit_code" ] && [ "$png_exit_code" -ne 0 ]; then
echo "❌ PNG generation failed!"
else
echo "✅ PNG generation command completed"
fi
# search for generated output file type because plantuml's output filename ist the plantuml diagram name and not the *.puml file name
generated_file=(`find "$(dirname "$file")" -maxdepth 1 -name "*.png"`)
# Rename with prefix
if [ -f "$generated_file" ]; then
mv "$generated_file" "${output_abs}/${prefix_base}.png"
echo "✅ Renamed PNG: ${output_abs}/${prefix_base}.png"
else
echo "❌ Generated PNG not found: $generated_file"
fi
# Check for PNG file in output directory
if [ -f "${output_abs}/${prefix_base}.png" ]; then
echo "✅ Final PNG: ${output_abs}/${prefix_base}.png"
else
echo "❌ Expected PNG not found: ${output_abs}/${prefix_base}.png"
fi
# Generate SVG with full debugging
echo ""
echo "🎭 Generating SVG for: $file"
java -jar /tmp/plantuml.jar -tsvg -nometadata "$file" -o "$output_abs" || echo " WARNING: SVG generation command may have failed for $file (Exit Code: $?)" >&2
svg_exit_code=$?
echo "📊 SVG generation exit code: $svg_exit_code"
if [ -n "$svg_exit_code" ] && [ "$svg_exit_code" -ne 0 ]; then
echo "❌ SVG generation failed!"
else
echo "✅ SVG generation command completed"
fi
# search for generated output file type because plantuml's output filename ist the plantuml diagram name and not the *.puml file name
generated_file=(`find "$(dirname "$file")" -maxdepth 1 -name "*.svg"`)
# Rename with prefix
if [ -f "$generated_file" ]; then
mv "$generated_file" "${output_abs}/${prefix_base}.svg"
echo "✅ Renamed SVG: ${output_abs}/${prefix_base}.svg"
else
echo "❌ Generated SVG not found: $generated_file"
fi
# Check for SVG files
if [ -f "${output_abs}/${prefix_base}.svg" ]; then
echo "✅ Final SVG: ${output_abs}/${prefix_base}.svg"
else
echo "❌ Expected SVG not found: ${output_abs}/${prefix_base}.svg"
fi
echo "📁 Final output directory state:"
ls -la "$output_abs"/ 2>/dev/null | sed 's/^/ | /' || echo " | No output directory"
echo "===================="
done
- name: 🎯 Generate Draw.io images (debug mode)
continue-on-error: true
run: |
echo "=== 🎯 Generating Draw.io images ==="
# Determine processing mode
if [ "${{ github.event.inputs.regenerate_all }}" = "true" ] || [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "🔄 FULL REGENERATION MODE - Processing all files"
drawio_files=$(find src/drawio -name "*.drawio" -o -name "*.dio" 2>/dev/null)
if [ -z "$drawio_files" ]; then
echo "❌ No drawio files found in src/drawio/"
exit 0
fi
echo "📋 Found drawio files:"
echo "$drawio_files"
else
echo "⚡ INCREMENTAL MODE - Processing only changed files"
changed_drawio_files=$(git diff --name-only HEAD~1 HEAD | grep -E '\.(drawio|dio)$' | grep '^src/drawio/' || true)
if [ -z "$changed_drawio_files" ]; then
echo "ℹ️ No drawio files changed in this commit"
exit 0
fi
echo "📋 Changed drawio files:"
echo "$changed_drawio_files"
drawio_files="$changed_drawio_files"
fi
echo "📊 Processing $(echo "$drawio_files" | wc -l) Draw.io file(s)..."
for file in $drawio_files; do
echo "===================="
echo "🔄 Processing: $file"
base=$(basename "$file" | sed 's/\.[^.]*$//')
prefix_base="${{ env.DRAWIO_PREFIX }}${base}"
echo "📝 Prefix Base name: $prefix_base"
echo "📊 File size: $(ls -lh "$file" | awk '{print $5}')"
# Generate PNG with debugging
echo "🖼️ Generating PNG for: $file"
docker run --rm \
-v "$(pwd):/data" \
rlespinasse/drawio-export:4.4.0 \
--format png \
--output "${{ env.OUTPUT_DIR }}" \
"$file" \
2>&1 | sed 's/^/ | /'
png_exit_code=$?
echo "📊 Docker PNG exit code: $png_exit_code"
# Check and rename PNG
if [ -f "${{ env.OUTPUT_DIR }}/${base}.png" ]; then
mv "${{ env.OUTPUT_DIR }}/${base}.png" "${{ env.OUTPUT_DIR }}/${prefix_base}.png"
echo "✅ Generated PNG: ${{ env.OUTPUT_DIR }}/${prefix_base}.png"
else
echo "❌ PNG not created: ${{ env.OUTPUT_DIR }}/${prefix_base}.png"
echo "📁 Current output directory contents:"
ls -la "${{ env.OUTPUT_DIR }}/" | sed 's/^/ | /'
fi
# Generate SVG with debugging
echo "🎭 Generating SVG for: $file"
docker run --rm \
-v "$(pwd):/data" \
rlespinasse/drawio-export:4.4.0 \
--format svg \
--output "${{ env.OUTPUT_DIR }}" \
"$file" \
2>&1 | sed 's/^/ | /'
svg_exit_code=$?
echo "📊 Docker SVG exit code: $svg_exit_code"
# Check and rename SVG
if [ -f "${{ env.OUTPUT_DIR }}/${base}.svg" ]; then
mv "${{ env.OUTPUT_DIR }}/${base}.svg" "${{ env.OUTPUT_DIR }}/${prefix_base}.svg"
echo "✅ Generated SVG: ${{ env.OUTPUT_DIR }}/${prefix_base}.svg"
else
echo "❌ SVG not created: ${{ env.OUTPUT_DIR }}/${prefix_base}.svg"
echo "📁 Current output directory contents:"
ls -la "${{ env.OUTPUT_DIR }}/" | sed 's/^/ | /'
fi
echo "📁 Final output directory state:"
ls -la "${{ env.OUTPUT_DIR }}/" | sed 's/^/ | /'
echo "===================="
done
- name: 📊 Show results (debug)
run: |
echo "=== 📊 Final Results ==="
echo "📁 Generated files in ${{ env.OUTPUT_DIR }}:"
if [ -d "${{ env.OUTPUT_DIR }}" ]; then
ls -la "${{ env.OUTPUT_DIR }}/" | sed 's/^/ | /'
echo ""
echo "📈 Statistics:"
echo " 📄 Total files: $(ls "${{ env.OUTPUT_DIR }}/" 2>/dev/null | wc -l)"
echo " 🖼️ PNG files: $(ls "${{ env.OUTPUT_DIR }}"/*.png 2>/dev/null | wc -l)"
echo " 🎭 SVG files: $(ls "${{ env.OUTPUT_DIR }}"/*.svg 2>/dev/null | wc -l)"
echo " 🎨 PlantUML files: $(ls "${{ env.OUTPUT_DIR }}/${{ env.PLANTUML_PREFIX }}"* 2>/dev/null | wc -l)"
echo " 🎯 Draw.io files: $(ls "${{ env.OUTPUT_DIR }}/${{ env.DRAWIO_PREFIX }}"* 2>/dev/null | wc -l)"
else
echo " ❌ No images directory found"
fi
echo ""
echo "=== 📋 Git Status ==="
git status | sed 's/^/ | /'
- name: 📤 Commit generated images (debug)
run: |
echo "=== 📤 Committing generated images ==="
git config --global user.name 'GitHub Actions'
git config --global user.email 'actions@github.com'
echo "✅ Git config set"
if [ -d "${{ env.OUTPUT_DIR }}" ] && [ "$(ls -A ${{ env.OUTPUT_DIR }})" ]; then
echo "📁 Images directory exists and has content"
git add ${{ env.OUTPUT_DIR }}/
echo "✅ Added images to git staging"
# Count changes
changed_count=$(git diff --staged --name-only | wc -l)
echo "📊 Files staged for commit: $changed_count"
if [ "$changed_count" -gt 0 ]; then
echo "📋 Files to be committed:"
git diff --staged --name-only | sed 's/^/ | /'
if [ "${{ github.event.inputs.regenerate_all }}" = "true" ]; then
commit_msg="🔄 Regenerate all images from PlantUML and drawio files"
else
commit_msg="⚡ Auto-update images for changed PlantUML/drawio files ($changed_count files)"
fi
echo "📝 Commit message: $commit_msg"
git commit -m "$commit_msg"
echo "✅ Committed successfully"
echo "📤 Pushing to remote..."
git push
echo "✅ $changed_count image files committed and pushed to ${{ github.ref_name }}"
else
echo "ℹ️ No changes to commit"
fi
else
echo "❌ No images to commit (directory empty or doesn't exist)"
fi
echo "=== 🏁 Workflow completed ==="