Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions .devcontainer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
{
// Set container runtime user
"build": {
"dockerfile": ".devcontainer/Dockerfile.dev",
"context": "./",
"args": {
"USERNAME": "${localEnv:USER}"
},
"options": [
"--no-cache"
]
},
"initializeCommand": ".devcontainer/init_env.sh",
"name": "dbgpt",
"workspaceFolder": "/app",
"workspaceMount": "source=${localWorkspaceFolder},target=/app,type=bind",
"runArgs": [
"--network",
"host",
"--runtime=nvidia",
"--gpus",
"all",
"-e",
"LOCAL_DB_HOST=${localEnv:LOCAL_DB_HOST}",
"-e",
"LOCAL_DB_PASSWORD=${localEnv:LOCAL_DB_PASSWORD}",
"-e",
"MYSQL_ROOT_PASSWORD=${localEnv:MYSQL_ROOT_PASSWORD}",
"-e",
"LLM_MODEL=${localEnv:LLM_MODEL}",
"-e",
"LANGUAGE=${localEnv:LANGUAGE}",
"-e",
"PROXY_SERVER_URL=${localEnv:PROXY_SERVER_URL}",
"-e",
"HF_HOME=/app/models"
],
"mounts": [
// sharing-git-credentials see https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials
// This will enable you to work with the repository code using Git inside the Dev container.
"source=${localEnv:SSH_AUTH_SOCK},target=/run/host-services/ssh-auth.sock,type=bind",
// mount to local models
// Persist the model to avoid redundant downloads.
"source=${localWorkspaceFolder}/models,target=/app/models,type=bind"
],
"containerEnv": {
"SSH_AUTH_SOCK": "/run/host-services/ssh-auth.sock"
},
"postCreateCommand": "chmod +x /app/.devcontainer/post-create.sh && /app/.devcontainer/post-create.sh",
"customizations": {
"vscode": {
"settings": {
"extensions.verifySignature": false,
"http.proxyStrictSSL": false,
"python.linting.flake8Enabled": true,
"python.languageServer": "Pylance",
"python.linting.enabled": true,
"terminal.integrated.defaultProfile.linux": "zsh",
"terminal.integrated.shell.linux": "/bin/zsh",
"python.linting.mypyEnabled": true,
"python.linting.provider": "ruff",
"python.formatting.provider": "ruff"
},
"extensions": [
"ms-python.python",
"ms-python.isort",
"ms-python.vscode-pylance",
"ms-python.autopep8",
"ms-vscode.makefile-tools",
"ms-python.flake8",
"ms-azuretools.vscode-docker",
"ms-python.mypy-type-checker",
"charliermarsh.ruff"
]
}
}
}
40 changes: 40 additions & 0 deletions .devcontainer/Dockerfile.dev
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
FROM eosphorosai/dbgpt:latest
ARG PYTHON_VERSION=3.11
ARG PIP_INDEX_URL="https://mirrors.aliyun.com/pypi/simple"
ARG USERNAME
ARG DEFAULT_VEN=/opt/.uv.venv
WORKDIR /app
COPY . .
USER root
# Set the GID and UID of the container and
# add a user to prevent permission mismatches
# between the container user (root) and the host user,
# and to resolve the issue of the host user lacking write permissions.
RUN . .devcontainer/.env && \
groupadd -g $USER_GID $USERNAME && \
useradd -u $USER_UID -g $USER_GID -m $USERNAME && \
chown -R $USER_UID:$USER_GID /app
RUN apt-get update && apt-get install -y \
git \
curl \
wget \
ssh zsh autojump curl git-flow vim sudo \
&& python${PYTHON_VERSION} -m pip install --upgrade pip \
&& python${PYTHON_VERSION} -m pip install --upgrade pipx \
&& pipx install -i $PIP_INDEX_URL uv --global \
&& chown -R $USERNAME:$USERNAME $DEFAULT_VEN \
&& echo "$USERNAME ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/$USERNAME \
&& chmod 0440 /etc/sudoers.d/$USERNAME
USER $USERNAME
ENV UV_LINK_MODE=copy \
PIP_INDEX_URL=$PIP_INDEX_URL \
VIRTUAL_ENV=$DEFAULT_VEN \
UV_PROJECT_ENVIRONMENT=$DEFAULT_VEN \
UV_PYTHON=$DEFAULT_VEN/bin/python3

RUN . $DEFAULT_VEN/bin/activate && \
uv pip install --prefix $VIRTUAL_ENV -r pyproject.toml --all-extras --index-url=$PIP_INDEX_URL && \
uv pip install --prefix $VIRTUAL_ENV -r requirements/dev-requirements.txt --index-url=$PIP_INDEX_URL && \
uv pip install --prefix $VIRTUAL_ENV -r requirements/lint-requirements.txt --index-url=$PIP_INDEX_URL && \
cp .devcontainer/dbgpt.pth /opt/.uv.venv/lib/python${PYTHON_VERSION}/site-packages/dbgpt.pth && \
python -c "import dbgpt; print(dbgpt.__version__)"
8 changes: 8 additions & 0 deletions .devcontainer/dbgpt.pth
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/app/packages/dbgpt-app/src
/app/packages/dbgpt-accelerator
/app/packages/dbgpt-accelerator/src
/app/packages/dbgpt-core/src
/app/packages/dbgpt-client/src
/app/packages/dbgpt-ext/src
/app/packages/dbgpt-serve/src
/app/packages/dbgpt-app/src
54 changes: 54 additions & 0 deletions .devcontainer/init_env.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
OS=$(uname -s)
USERNAME="$USER"
USER_UID=$(id -u "$USER")

if [ "$OS" = "Linux" ]; then
GROUPNAME=$(id -gn "$USER")
USER_GID=$(id -g "$USER")
else
GROUPNAME="root"
USER_GID="0"
fi

printf "OS=%s\nUSERNAME=%s\nUSER_UID=%s\nGROUPNAME=%s\nUSER_GID=%s\n" \
"$OS" \
"$USERNAME" \
"$USER_UID" \
"$GROUPNAME" \
"$USER_GID" > .devcontainer/.env

# sharing-git-credentials see https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials
init_ssh_agent(){
# Define code block to insert (with unique identifier comment)
SSH_AGENT_CODE='# SSH Agent Auto Management[ID:ssh_agent_v1]
if [ -z "$SSH_AUTH_SOCK" ]; then
RUNNING_AGENT="$(ps -ax | grep '\''ssh-agent -s'\'' | grep -v grep | wc -l | tr -d '\''[:space:]'\'')"
if [ "$RUNNING_AGENT" = "0" ]; then
ssh-agent -s &> $HOME/.ssh/ssh-agent
fi
eval $(cat $HOME/.ssh/ssh-agent) > /dev/null
ssh-add 2> /dev/null
fi
# END_SSH_AGENT_CODE'

# Auto detect shell type
TARGET_FILE="$HOME/.bashrc"
if [[ "$SHELL" == *"zsh"* ]]; then
TARGET_FILE="$HOME/.zshrc"
fi

# Create .ssh directory if not exists
mkdir -p "$HOME/.ssh"

# Check for existing code block
if ! grep -q 'END_SSH_AGENT_CODE' "$TARGET_FILE"; then
echo "Adding SSH agent management code to ${TARGET_FILE}..."
echo "$SSH_AGENT_CODE" >> "$TARGET_FILE"
echo "Code added successfully. Please run source ${TARGET_FILE} to apply changes immediately"
else
echo "Existing SSH agent code detected, no need to add again"
fi
}
init_ssh_agent
mkdir -p models
70 changes: 70 additions & 0 deletions .devcontainer/post-create.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#!/bin/bash
set -e
cd /app

# Install Oh My Zsh with mirror fallback
if [ ! -f ~/.oh-my-zsh/oh-my-zsh.sh ]; then
echo "Installing Oh My Zsh..."
REPO=mirrors/oh-my-zsh REMOTE=https://gitee.com/mirrors/oh-my-zsh.git sh -c "$(curl -fsSL https://gitee.com/mirrors/oh-my-zsh/raw/master/tools/install.sh)" "" --unattended
fi

# Install plugins with mirror switching
plugins=(
"zsh-users/zsh-autosuggestions"
"zsh-users/zsh-syntax-highlighting"
)

for plugin in "${plugins[@]}"; do
repo_name=$(basename $plugin)
if [ ! -d ~/.oh-my-zsh/custom/plugins/$repo_name ]; then
echo "Installing plugin: $plugin"
# Clone from GitHub with Gitee mirror fallback
git clone --depth=1 https://github.com/$plugin.git ~/.oh-my-zsh/custom/plugins/$repo_name || \
git clone --depth=1 https://gitee.com/zsh-users/$repo_name.git ~/.oh-my-zsh/custom/plugins/$repo_name
fi
done


# Install theme with mirror fallback
if [ ! -d ~/.oh-my-zsh/custom/themes/powerlevel10k ]; then
echo "Installing powerlevel10k theme..."
# Clone from GitHub with Gitee mirror fallback
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/.oh-my-zsh/custom/themes/powerlevel10k || \
git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ~/.oh-my-zsh/custom/themes/powerlevel10k
fi

# Configuration section remains the same...
# Apply custom configuration
if [ -f /workspace/.devcontainer/zshrc-config ]; then
cp /workspace/.devcontainer/zshrc-config ~/.zshrc
else
# Generate basic .zshrc if no custom configuration exists
cat << EOF >> ~/.zshrc
export ZSH="\$HOME/.oh-my-zsh"
ZSH_THEME="robbyrussell"
plugins=(git zsh-autosuggestions zsh-syntax-highlighting autojump)
source \$ZSH/oh-my-zsh.sh

# Enable autojump
[[ -s /usr/share/autojump/autojump.sh ]] && source /usr/share/autojump/autojump.sh
EOF
fi

# Ensure autojump configuration is applied (even if custom configuration exists)
if ! grep -q "autojump.sh" ~/.zshrc; then
echo '[[ -s /usr/share/autojump/autojump.sh ]] && source /usr/share/autojump/autojump.sh' >> ~/.zshrc
fi
cat << EOF >> ~/.zshrc
# Add the following to ~/.zshrc
load_env() {
if [ -f /app/.env ]; then
ENV_CONTENT=$(grep -vE '^#|^$' /app/.env | xargs)
if [ -n "$ENV_CONTENT" ]; then
export $ENV_CONTENT
fi
fi
}
load_env
EOF
rm -rf .venv.make
echo "Post-create setup completed!"
7 changes: 4 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,14 @@ $(VENV)/.venv-timestamp: uv.lock
testenv: $(VENV)/.testenv

$(VENV)/.testenv: $(VENV)/bin/activate
uv sync --all-packages \
. $(VENV_BIN)/activate && uv sync --active --all-packages \
--extra "base" \
--extra "proxy_openai" \
--extra "rag" \
--extra "storage_chromadb" \
--extra "dbgpts" \
--link-mode=copy
cp .devcontainer/dbgpt.pth $(VENV)/lib/python3.11/site-packages
touch $(VENV)/.testenv


Expand Down Expand Up @@ -69,7 +70,7 @@ fmt-check: setup ## Check Python code formatting and style without making change
pre-commit: fmt-check test test-doc mypy ## Run formatting and unit tests before committing

test: $(VENV)/.testenv ## Run unit tests
$(VENV_BIN)/pytest dbgpt
$(VENV_BIN)/pytest --pyargs dbgpt

.PHONY: test-doc
test-doc: $(VENV)/.testenv ## Run doctests
Expand All @@ -88,7 +89,7 @@ mypy: $(VENV)/.testenv ## Run mypy checks

.PHONY: coverage
coverage: setup ## Run tests and report coverage
$(VENV_BIN)/pytest dbgpt --cov=dbgpt
$(VENV_BIN)/pytest --pyargs dbgpt --cov=dbgpt

.PHONY: clean
clean: ## Clean up the environment
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ members = [
"packages/dbgpt-core",
"packages/dbgpt-ext",
"packages/dbgpt-serve",
"packages/dbgpt-accelerator/*"
"packages/dbgpt-accelerator/dbgpt-acc*"
]

[tool.uv]
Expand Down