diff --git a/.devcontainer.json b/.devcontainer.json new file mode 100755 index 000000000..d416d61d5 --- /dev/null +++ b/.devcontainer.json @@ -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" + ] + } + } +} \ No newline at end of file diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev new file mode 100644 index 000000000..4528cc193 --- /dev/null +++ b/.devcontainer/Dockerfile.dev @@ -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__)" \ No newline at end of file diff --git a/.devcontainer/dbgpt.pth b/.devcontainer/dbgpt.pth new file mode 100644 index 000000000..b4f79cbee --- /dev/null +++ b/.devcontainer/dbgpt.pth @@ -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 \ No newline at end of file diff --git a/.devcontainer/init_env.sh b/.devcontainer/init_env.sh new file mode 100755 index 000000000..221ee6c82 --- /dev/null +++ b/.devcontainer/init_env.sh @@ -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 \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100755 index 000000000..902edd2a1 --- /dev/null +++ b/.devcontainer/post-create.sh @@ -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!" \ No newline at end of file diff --git a/Makefile b/Makefile index 51399cf26..184b743c8 100644 --- a/Makefile +++ b/Makefile @@ -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 @@ -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 @@ -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 diff --git a/pyproject.toml b/pyproject.toml index 2f3abe753..4bb9d8c72 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,7 @@ members = [ "packages/dbgpt-core", "packages/dbgpt-ext", "packages/dbgpt-serve", - "packages/dbgpt-accelerator/*" + "packages/dbgpt-accelerator/dbgpt-acc*" ] [tool.uv]