update-dockerfile-graph.sh 2.49 KB
Newer Older
1
2
3
4
5
6
#!/bin/bash
# Update Dockerfile dependency graph when docker/Dockerfile changes.
# This script is designed to be used as a pre-commit hook.

set -euo pipefail

7
8
9
10
11
# Accept file paths as arguments
FILES=("$@")

# Check if docker/Dockerfile is among the provided files
if printf '%s\n' "${FILES[@]}" | grep -q "^docker/Dockerfile$"; then
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  echo "docker/Dockerfile has changed, attempting to update dependency graph..."

  # Check if Docker is installed and running
  if ! command -v docker &> /dev/null; then
    echo "Warning: Docker command not found. Skipping Dockerfile graph update."
    echo "Please install Docker to automatically update the graph: https://docs.docker.com/get-docker/"
    exit 0
  fi
  if ! docker info &> /dev/null; then
    echo "Warning: Docker daemon is not running. Skipping Dockerfile graph update."
    echo "Please start Docker to automatically update the graph."
    exit 0
  fi

  # Define the target file path
  TARGET_GRAPH_FILE="docs/source/assets/contributing/dockerfile-stages-dependency.png"

  # Ensure target directory exists
  mkdir -p "$(dirname "$TARGET_GRAPH_FILE")"

  # Store old image hash in a variable if the file exists
  OLD_HASH=""
  if [ -f "$TARGET_GRAPH_FILE" ]; then
    OLD_HASH=$(sha256sum "$TARGET_GRAPH_FILE")
  fi
  
  # Generate Dockerfile graph
  echo "Running dockerfilegraph tool..."
  docker run \
    --rm \
    --user "$(id -u):$(id -g)" \
    --workdir /workspace \
    --volume "$(pwd)":/workspace \
    ghcr.io/patrickhoefler/dockerfilegraph:alpine \
    --output png \
    --dpi 200 \
    --max-label-length 50 \
    --filename docker/Dockerfile \
    --legend
  
  echo "Finding generated PNG file..."
  # Check for Dockerfile.png in the root directory (most likely location)
  if [ -f "./Dockerfile.png" ]; then
    echo "Found generated file at: ./Dockerfile.png"
    mv "./Dockerfile.png" "$TARGET_GRAPH_FILE"
  else
    # Try to find it elsewhere
    DOCKERFILE_PNG=$(find . -name "Dockerfile.png" -type f | head -1)
    
    if [ -n "$DOCKERFILE_PNG" ]; then
      echo "Found generated file at: $DOCKERFILE_PNG"
      mv "$DOCKERFILE_PNG" "$TARGET_GRAPH_FILE"
    else
      echo "Error: Could not find the generated PNG file"
      find . -name "*.png" -type f -mmin -5
      exit 1
    fi
  fi
  
  # Check if the graph has changed
  NEW_HASH=$(sha256sum "$TARGET_GRAPH_FILE")
  if [ "$NEW_HASH" != "$OLD_HASH" ]; then
    echo "Graph has changed. Please stage the updated file: $TARGET_GRAPH_FILE"
    exit 1
  else
    echo "No changes in graph detected."
  fi
fi

81
exit 0