Roo-Code/packages/evals/Dockerfile.runner
Chris Estreich 424bce6078
Add an option to use our cli for evals (#10456)
Co-authored-by: Roo Code <roomote@roocode.com>
2026-01-05 11:33:19 -08:00

175 lines
6.5 KiB
Text

# Build with:
# docker compose -f packages/evals/docker-compose.yml build runner
# Test with:
# docker compose -f packages/evals/docker-compose.yml run --rm runner bash
FROM debian:bookworm-slim AS base
# Install system packages (excluding language runtimes - those come from mise)
RUN apt-get update && \
apt-get install -y \
curl \
git \
vim \
jq \
netcat-openbsd \
apt-transport-https \
ca-certificates \
gnupg \
lsb-release \
wget \
gpg \
xvfb \
cmake \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Install Docker cli
RUN curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null \
&& apt-get update && apt-get install -y docker-ce-cli \
&& rm -rf /var/lib/apt/lists/*
# Install VS Code
RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg \
&& install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg \
&& echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" | tee /etc/apt/sources.list.d/vscode.list > /dev/null \
&& rm -f packages.microsoft.gpg \
&& apt-get update && apt-get install -y code \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /roo
# Install mise (https://mise.jdx.dev) for language runtime management
RUN curl https://mise.run | sh \
&& /root/.local/bin/mise --version
# Set up mise environment
ENV MISE_DATA_DIR="/root/.local/share/mise"
ENV PATH="/root/.local/share/mise/shims:/root/.local/bin:$PATH"
# Define language runtime versions (matching setup.sh)
ARG NODE_VERSION=20.19.2
ARG PYTHON_VERSION=3.13.2
ARG GO_VERSION=1.24.2
ARG RUST_VERSION=1.85.1
ARG JAVA_VERSION=openjdk-17
ARG UV_VERSION=0.7.11
# Install language runtimes via mise
RUN mise use --global node@${NODE_VERSION} \
&& mise use --global python@${PYTHON_VERSION} \
&& mise use --global go@${GO_VERSION} \
&& mise use --global rust@${RUST_VERSION} \
&& mise use --global java@${JAVA_VERSION} \
&& mise use --global uv@${UV_VERSION} \
&& mise reshim
# Verify installations
RUN node --version && python --version && go version && rustc --version && java --version && uv --version
# Install pnpm (after node is available from mise)
ENV PNPM_HOME="/root/.local/share/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN npm install -g pnpm npm-run-all
# Install VS Code extensions
ARG GOLANG_EXT_VERSION=0.46.1
ARG ESLINT_EXT_VERSION=3.0.10
ARG JAVA_EXT_VERSION=1.42.0
ARG PYTHON_EXT_VERSION=2025.6.1
ARG RUST_EXT_VERSION=0.3.2482
RUN mkdir -p /roo/.vscode-template \
&& yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension golang.go@${GOLANG_EXT_VERSION} \
&& yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension dbaeumer.vscode-eslint@${ESLINT_EXT_VERSION} \
&& yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension redhat.java@${JAVA_EXT_VERSION} \
&& yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension ms-python.python@${PYTHON_EXT_VERSION} \
&& yes | code --no-sandbox --user-data-dir /roo/.vscode-template --install-extension rust-lang.rust-analyzer@${RUST_EXT_VERSION}
# Copy evals
ARG EVALS_COMMIT=main
ARG EVALS_REPO_URL=https://github.com/RooCodeInc/Roo-Code-Evals.git
RUN git clone ${EVALS_REPO_URL} evals \
&& cd evals \
&& git checkout ${EVALS_COMMIT}
# Pre-warm Gradle wrapper cache (./gradlew downloads its own Gradle regardless of system install).
# Find a Java project with gradlew and run it to cache the distribution.
RUN find /roo/evals -name "gradlew" -type f | head -1 | xargs -I {} sh -c 'cd $(dirname {}) && ./gradlew --version'
# Sync python dependencies for evals
WORKDIR /roo/evals/python
RUN uv sync
WORKDIR /roo/repo
# Install npm packages
RUN mkdir -p \
scripts \
apps/cli \
packages/build \
packages/config-eslint \
packages/config-typescript \
packages/core \
packages/evals \
packages/ipc \
packages/telemetry \
packages/types \
packages/cloud \
packages/vscode-shim \
src \
webview-ui
COPY ./package.json ./
COPY ./pnpm-lock.yaml ./
COPY ./pnpm-workspace.yaml ./
COPY ./scripts/bootstrap.mjs ./scripts/
COPY ./apps/cli/package.json ./apps/cli/
COPY ./packages/build/package.json ./packages/build/
COPY ./packages/config-eslint/package.json ./packages/config-eslint/
COPY ./packages/config-typescript/package.json ./packages/config-typescript/
COPY ./packages/core/package.json ./packages/core/
COPY ./packages/evals/package.json ./packages/evals/
COPY ./packages/ipc/package.json ./packages/ipc/
COPY ./packages/telemetry/package.json ./packages/telemetry/
COPY ./packages/types/package.json ./packages/types/
COPY ./packages/cloud/package.json ./packages/cloud/
COPY ./packages/vscode-shim/package.json ./packages/vscode-shim/
COPY ./src/package.json ./src/
COPY ./webview-ui/package.json ./webview-ui/
RUN pnpm install
# Copy source code
COPY . ./
# Validate that .env.local exists and is not empty
RUN if [ ! -f "packages/evals/.env.local" ] || [ ! -s "packages/evals/.env.local" ]; then \
echo "ERROR: packages/evals/.env.local is missing or empty. Please create it with your API keys before building."; \
exit 1; \
fi
# Copy ENV secrets
COPY packages/evals/.env.local ./packages/evals/
# Copy the pre-installed VS Code extensions
RUN cp -r /roo/.vscode-template /roo/.vscode
# Build the Roo Code extension (for VSCode execution method)
RUN pnpm vsix -- --out ../bin/roo-code.vsix \
&& yes | code --no-sandbox --user-data-dir /roo/.vscode --install-extension bin/roo-code.vsix
# Build the extension bundle and CLI (for CLI execution method)
# The CLI requires the extension bundle (src/dist/extension.js) and the CLI build (apps/cli/dist/index.js)
RUN pnpm --filter roo-cline bundle \
&& pnpm --filter @roo-code/cli build
# Copy entrypoint script
COPY packages/evals/.docker/entrypoints/runner.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENV DATABASE_URL=postgresql://postgres:password@db:5432/evals_development
ENV REDIS_URL=redis://redis:6379
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]