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:
Aries-ckt 2025-03-19 22:58:09 +08:00 committed by GitHub
commit 4af28e40d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 254 additions and 4 deletions

77
.devcontainer.json Executable file
View 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"
]
}
}
}

View 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
View 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
View 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
View 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!"

View File

@ -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

View File

@ -28,7 +28,7 @@ members = [
"packages/dbgpt-core",
"packages/dbgpt-ext",
"packages/dbgpt-serve",
"packages/dbgpt-accelerator/*"
"packages/dbgpt-accelerator/dbgpt-acc*"
]
[tool.uv]