post-create.sh 4.98 KB
Newer Older
1
2
3
#!/bin/bash
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

set -eu

# Ensure we're not running as root
if [ "$(id -u)" -eq 0 ]; then
    echo "❌ ERROR: This script should not be run as root!"
    echo "The script should run as the 'ubuntu' user, not root."
    echo "Current user: $(whoami) (UID: $(id -u))"
    exit 1
fi

# Verify we're running as the expected user
if [ "$(whoami)" != "ubuntu" ]; then
    echo "⚠️  WARNING: Expected to run as 'ubuntu' user, but running as '$(whoami)'"
    echo "This might cause permission issues."
fi

echo "Running post-create script as user: $(whoami) (UID: $(id -u))"
22

23
trap 'echo "❌ ERROR: Command failed at line $LINENO: $BASH_COMMAND"; echo "⚠️ This was unexpected and setup was not completed. Can try to resolve yourself and then manually run the rest of the commands in this file or file a bug."' ERR
24

25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
retry() {
    # retries for connectivity issues in installs
    local retries=3
    local count=0
    until "$@"; do
        exit_code=$?
        wait_time=$((2 ** count))
        echo "Command failed with exit code $exit_code. Retrying in $wait_time seconds..."
        sleep $wait_time
        count=$((count + 1))
        if [ $count -ge $retries ]; then
            echo "Command failed after $retries attempts."
            return $exit_code
        fi
    done
    return 0
}
42

43
set -x
44

45
# Changing permission to match local user since volume mounts default to root ownership
46
47
48
# Note: sudo is used here because the volume mount may have root ownership
mkdir -p $HOME/.cache
sudo chown -R ubuntu:ubuntu $HOME/.cache $HOME/dynamo
49

50
51
52
# Pre-commit hooks
cd $HOME/dynamo && pre-commit install && retry pre-commit install-hooks
pre-commit run --all-files || true # don't fail the build if pre-commit hooks fail
53

54
# Set build directory
55
56
export CARGO_TARGET_DIR=${CARGO_TARGET_DIR:-$HOME/dynamo/.build/target}
mkdir -p $CARGO_TARGET_DIR
57

58
59
60
uv pip uninstall --yes ai-dynamo ai-dynamo-runtime 2>/dev/null || true

# Build project, with `dev` profile it will be saved at $CARGO_TARGET_DIR/debug
61
cargo build --locked --profile dev --features mistralrs
62

63
# install the python bindings
64
(cd $HOME/dynamo/lib/bindings/python && retry maturin develop)
65
66

# installs overall python packages, grabs binaries from .build/target/debug
67
cd $HOME/dynamo && retry env DYNAMO_BIN_PATH=$CARGO_TARGET_DIR/debug uv pip install -e .
68

69
70
71
72
73
74
75
76
77
78
79
80
81
82
# Extract the PYTHONPATH line from README.md
PYTHONPATH_LINE=$(grep "^export PYTHONPATH=" $DYNAMO_HOME/README.md | head -n1)
if [ -n "$PYTHONPATH_LINE" ]; then
    # Remove the ${PYTHONPATH}: prefix if it exists, then replace $(pwd) with the actual path
    MODIFIED_LINE=$(echo "$PYTHONPATH_LINE" | sed 's/\${PYTHONPATH}://g' | sed "s|\$(pwd)|$DYNAMO_HOME|g")
    eval "$MODIFIED_LINE"
    # Also add to .bashrc for persistence (with expanded path)
    if ! grep -q "export PYTHONPATH=" ~/.bashrc; then
        # MODIFIED_LINE already has $DYNAMO_HOME expanded to /home/ubuntu/dynamo
        echo "$MODIFIED_LINE" >> ~/.bashrc
    fi
else
    # Back-up version if README.md changed. This is the version from 2025-08-19
    export PYTHONPATH=$DYNAMO_HOME/components/frontend/src:$DYNAMO_HOME/components/planner/src:$DYNAMO_HOME/components/backends/vllm/src:$DYNAMO_HOME/components/backends/sglang/src:$DYNAMO_HOME/components/backends/trtllm/src:$DYNAMO_HOME/components/backends/llama_cpp/src:$DYNAMO_HOME/components/backends/mocker/src
83
84
85
86
87
fi

if ! grep -q "export GPG_TTY=" ~/.bashrc; then
    echo "export GPG_TTY=$(tty)" >> ~/.bashrc
fi
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123

# Unset empty tokens/variables to avoid issues with authentication and SSH
if ! grep -q "# Unset empty tokens" ~/.bashrc; then
    echo -e "\n# Unset empty tokens and environment variables" >> ~/.bashrc
    echo '[ -z "$HF_TOKEN" ] && unset HF_TOKEN' >> ~/.bashrc
    echo '[ -z "$GITHUB_TOKEN" ] && unset GITHUB_TOKEN' >> ~/.bashrc
    echo '[ -z "$SSH_AUTH_SOCK" ] && unset SSH_AUTH_SOCK' >> ~/.bashrc
fi

$HOME/dynamo/deploy/dynamo_check.py --import-check-only

{ set +x; } 2>/dev/null

# Check SSH agent forwarding status
echo "🔍 Checking SSH agent forwarding status..."
if [ -n "$SSH_AUTH_SOCK" ]; then
    if ssh-add -l > /dev/null 2>&1; then
        echo "SSH agent forwarding is working - found $(ssh-add -l | wc -l) key(s)"
    else
        echo "⚠️  SSH_AUTH_SOCK is set but ssh-add failed - agent may not be accessible"
    fi
else
    echo "⚠️ SSH agent forwarding not configured - SSH_AUTH_SOCK is not set"
fi

cat <<EOF

✅ SUCCESS: Built cargo project, installed Python bindings, configured pre-commit hooks

Example commands:
  cargo build --locked --profile dev              # Build Rust project in $CARGO_TARGET_DIR
  cd lib/bindings/python && maturin develop --uv  # Update Python bindings (if you changed them)
  cargo fmt && cargo clippy                       # Format and lint code before committing
  cargo doc --no-deps                             # Generate documentation
  uv pip install -e .                             # Install various Python packages Dynamo depends on
EOF