mirror of
https://github.com/csunny/DB-GPT.git
synced 2025-07-31 15:47:05 +00:00
chore(build):add vscode devcontainer config (#2466)
# Description **Compatible with Linux and Windows Subsystem for Linux (WSL) environments only.** - Add VS Code devcontainer development environment configuration - Use VS Code's **Dev Container** extension to build a containerized development environment. Leverage the `eosphorosai/dbgpt:latest` image as the development environment to avoid repeated dependency installations and improve development efficiency. - Follow the guide [Developing inside a Container](https://code.visualstudio.com/docs/devcontainers/containers) to set up the Dev Container: - Install the **Dev Containers** extension. - Use the shortcut `Ctrl+Shift+P` to open the command palette, then enter `Dev Containers: Open Folder in Container`. - Set git ssh [sharing-git-credentials](https://code.visualstudio.com/remote/advancedcontainers/sharing-git-credentials) - Before the first launch, please execute the .devcontainer/init_env.sh script in the project root directory in **host**. # How Has This Been Tested? Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration # Snapshots: Include snapshots for easier review. # Checklist: - [x] My code follows the style guidelines of this project - [x] I have already rebased the commits and make the commit message conform to the project standard. - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [x] I have made corresponding changes to the documentation - [x] Any dependent changes have been merged and published in downstream modules
This commit is contained in:
commit
4af28e40d8
77
.devcontainer.json
Executable file
77
.devcontainer.json
Executable file
@ -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
.devcontainer/Dockerfile.dev
Normal file
40
.devcontainer/Dockerfile.dev
Normal file
@ -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
.devcontainer/dbgpt.pth
Normal file
8
.devcontainer/dbgpt.pth
Normal file
@ -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
.devcontainer/init_env.sh
Executable file
54
.devcontainer/init_env.sh
Executable file
@ -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
.devcontainer/post-create.sh
Executable file
70
.devcontainer/post-create.sh
Executable file
@ -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
Makefile
7
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
|
||||
|
@ -28,7 +28,7 @@ members = [
|
||||
"packages/dbgpt-core",
|
||||
"packages/dbgpt-ext",
|
||||
"packages/dbgpt-serve",
|
||||
"packages/dbgpt-accelerator/*"
|
||||
"packages/dbgpt-accelerator/dbgpt-acc*"
|
||||
]
|
||||
|
||||
[tool.uv]
|
||||
|
Loading…
Reference in New Issue
Block a user