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
  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
27
  TARGET_GRAPH_FILE="docs/assets/contributing/dockerfile-stages-dependency.png"
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

  # 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