Skip to content

Commit 03e9aa2

Browse files
committed
feat: rebuild rust image with browser tooling
1 parent 29a2a17 commit 03e9aa2

9 files changed

Lines changed: 300 additions & 29 deletions

File tree

.github/workflows/ci.yml

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ jobs:
5858
- name: Setup Node
5959
uses: actions/setup-node@v4
6060
with:
61-
node-version: "22"
61+
node-version: "24"
6262

6363
- name: Resolve tool versions
6464
id: versions
@@ -89,6 +89,23 @@ jobs:
8989
ATLAS_CLI_VERSION="${{ steps.versions.outputs.atlas_cli_version }}" \
9090
COPILOT_API_VERSION="${{ steps.versions.outputs.copilot_api_version }}"
9191
92+
- name: Smoke rust runtime and browser tooling
93+
shell: bash
94+
run: |
95+
set -euo pipefail
96+
docker run --rm deva-smoke:ci-rust bash -lc '
97+
bwrap --version
98+
go version | grep "go1.26.2"
99+
playwright --version
100+
playwright-mcp --help >/dev/null
101+
playwright install --list
102+
if command -v google-chrome >/dev/null 2>&1; then
103+
google-chrome --version
104+
else
105+
echo "google-chrome not installed on $(dpkg --print-architecture)"
106+
fi
107+
'
108+
92109
- name: Install and launch each agent without a TTY
93110
shell: bash
94111
run: |

.github/workflows/nightly-images.yml

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ on:
88
env:
99
REGISTRY: ghcr.io
1010
IMAGE_NAME: thevibeworks/deva
11+
GO_VERSION: 1.26.2
12+
PLAYWRIGHT_VERSION: 1.59.1
13+
PLAYWRIGHT_MCP_VERSION: 0.0.70
1114

1215
permissions:
1316
contents: read
@@ -35,7 +38,7 @@ jobs:
3538
- name: Setup Node
3639
uses: actions/setup-node@v4
3740
with:
38-
node-version: "22"
41+
node-version: "24"
3942

4043
- name: Resolve versions
4144
id: versions
@@ -59,7 +62,7 @@ jobs:
5962
6063
build-base:
6164
name: Build Nightly Base Image
62-
needs: resolve-versions
65+
needs: [resolve-versions, build-core]
6366
runs-on: ubuntu-latest
6467
steps:
6568
- name: Checkout
@@ -107,10 +110,60 @@ jobs:
107110
GEMINI_CLI_VERSION=${{ needs.resolve-versions.outputs.gemini_cli_version }}
108111
ATLAS_CLI_VERSION=${{ needs.resolve-versions.outputs.atlas_cli_version }}
109112
COPILOT_API_VERSION=${{ needs.resolve-versions.outputs.copilot_api_version }}
113+
GO_VERSION=${{ env.GO_VERSION }}
114+
115+
build-core:
116+
name: Build Nightly Core Image
117+
needs: resolve-versions
118+
runs-on: ubuntu-latest
119+
steps:
120+
- name: Checkout
121+
uses: actions/checkout@v4
122+
123+
- name: Set up QEMU
124+
uses: docker/setup-qemu-action@v3
125+
126+
- name: Set up Docker Buildx
127+
uses: docker/setup-buildx-action@v3
128+
129+
- name: Log in to Container Registry
130+
uses: docker/login-action@v3
131+
with:
132+
registry: ${{ env.REGISTRY }}
133+
username: ${{ github.actor }}
134+
password: ${{ secrets.GITHUB_TOKEN }}
135+
136+
- name: Extract metadata
137+
id: meta-core
138+
uses: docker/metadata-action@v5
139+
with:
140+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
141+
tags: |
142+
type=raw,value=nightly-core
143+
type=raw,value=nightly-${{ needs.resolve-versions.outputs.stamp }}-core
144+
labels: |
145+
org.opencontainers.image.title=deva-nightly-core
146+
org.opencontainers.image.description=Nightly deva core image for downstream profile builds
147+
148+
- name: Build and push core image
149+
uses: docker/build-push-action@v5
150+
with:
151+
context: .
152+
file: ./Dockerfile
153+
target: agent-base
154+
platforms: linux/amd64,linux/arm64
155+
push: true
156+
tags: ${{ steps.meta-core.outputs.tags }}
157+
labels: ${{ steps.meta-core.outputs.labels }}
158+
cache-from: type=gha,scope=nightly-core
159+
cache-to: type=gha,mode=max,scope=nightly-core
160+
build-args: |
161+
COPILOT_API_VERSION=${{ needs.resolve-versions.outputs.copilot_api_version }}
162+
GO_VERSION=${{ env.GO_VERSION }}
110163
111164
build-rust:
112165
name: Build Nightly Rust Image
113-
needs: [resolve-versions, build-base]
166+
needs: [resolve-versions, build-core]
114167
runs-on: ubuntu-latest
115168
steps:
116169
- name: Checkout
@@ -153,18 +206,26 @@ jobs:
153206
cache-from: type=gha,scope=nightly-rust
154207
cache-to: type=gha,mode=max,scope=nightly-rust
155208
build-args: |
156-
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:nightly-${{ needs.resolve-versions.outputs.stamp }}
209+
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:nightly-${{ needs.resolve-versions.outputs.stamp }}-core
210+
CLAUDE_CODE_VERSION=${{ needs.resolve-versions.outputs.claude_code_version }}
211+
CODEX_VERSION=${{ needs.resolve-versions.outputs.codex_version }}
212+
GEMINI_CLI_VERSION=${{ needs.resolve-versions.outputs.gemini_cli_version }}
213+
ATLAS_CLI_VERSION=${{ needs.resolve-versions.outputs.atlas_cli_version }}
214+
PLAYWRIGHT_VERSION=${{ env.PLAYWRIGHT_VERSION }}
215+
PLAYWRIGHT_MCP_VERSION=${{ env.PLAYWRIGHT_MCP_VERSION }}
157216
158217
summary:
159218
name: Nightly Summary
160-
needs: [resolve-versions, build-base, build-rust]
219+
needs: [resolve-versions, build-core, build-base, build-rust]
161220
runs-on: ubuntu-latest
162221
steps:
163222
- name: Publish summary
164223
run: |
165224
cat <<EOF >> "$GITHUB_STEP_SUMMARY"
166225
## Published Nightly Images
167226
227+
- \`ghcr.io/thevibeworks/deva:nightly-core\`
228+
- \`ghcr.io/thevibeworks/deva:nightly-${{ needs.resolve-versions.outputs.stamp }}-core\`
168229
- \`ghcr.io/thevibeworks/deva:nightly\`
169230
- \`ghcr.io/thevibeworks/deva:nightly-${{ needs.resolve-versions.outputs.stamp }}\`
170231
- \`ghcr.io/thevibeworks/deva:nightly-rust\`

.github/workflows/release.yml

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ on:
1414
env:
1515
REGISTRY: ghcr.io
1616
IMAGE_NAME: thevibeworks/deva
17+
GO_VERSION: 1.26.2
18+
PLAYWRIGHT_VERSION: 1.59.1
19+
PLAYWRIGHT_MCP_VERSION: 0.0.70
1720

1821
jobs:
1922
prepare:
@@ -51,7 +54,7 @@ jobs:
5154
- name: Setup Node
5255
uses: actions/setup-node@v4
5356
with:
54-
node-version: "22"
57+
node-version: "24"
5558

5659
- name: Resolve versions
5760
id: versions
@@ -73,7 +76,7 @@ jobs:
7376
7477
build-and-push:
7578
name: Build and Push Docker Image
76-
needs: [prepare, resolve-versions]
79+
needs: [prepare, resolve-versions, build-and-push-core]
7780
runs-on: ubuntu-latest
7881
permissions:
7982
contents: read
@@ -123,11 +126,66 @@ jobs:
123126
GEMINI_CLI_VERSION=${{ needs.resolve-versions.outputs.gemini_cli_version }}
124127
ATLAS_CLI_VERSION=${{ needs.resolve-versions.outputs.atlas_cli_version }}
125128
COPILOT_API_VERSION=${{ needs.resolve-versions.outputs.copilot_api_version }}
129+
GO_VERSION=${{ env.GO_VERSION }}
130+
131+
build-and-push-core:
132+
name: Build and Push Core Image
133+
needs: [prepare, resolve-versions]
134+
runs-on: ubuntu-latest
135+
permissions:
136+
contents: read
137+
packages: write
138+
steps:
139+
- name: Checkout
140+
uses: actions/checkout@v4
141+
with:
142+
ref: ${{ needs.prepare.outputs.release_tag }}
143+
144+
- name: Set up QEMU
145+
uses: docker/setup-qemu-action@v3
146+
147+
- name: Set up Docker Buildx
148+
uses: docker/setup-buildx-action@v3
149+
150+
- name: Log in to Container Registry
151+
uses: docker/login-action@v3
152+
with:
153+
registry: ${{ env.REGISTRY }}
154+
username: ${{ github.actor }}
155+
password: ${{ secrets.GITHUB_TOKEN }}
156+
157+
- name: Extract metadata for core image
158+
id: meta-core
159+
uses: docker/metadata-action@v5
160+
with:
161+
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
162+
tags: |
163+
type=raw,value=${{ needs.prepare.outputs.release_tag }}-core
164+
type=raw,value=core
165+
labels: |
166+
org.opencontainers.image.title=deva-core
167+
org.opencontainers.image.description=Stable deva core image for downstream profile builds
168+
169+
- name: Build and push core image
170+
uses: docker/build-push-action@v5
171+
with:
172+
context: .
173+
file: ./Dockerfile
174+
target: agent-base
175+
platforms: linux/amd64,linux/arm64
176+
push: true
177+
tags: ${{ steps.meta-core.outputs.tags }}
178+
labels: ${{ steps.meta-core.outputs.labels }}
179+
cache-from: type=gha
180+
cache-to: type=gha,mode=max
181+
build-args: |
182+
COPILOT_API_VERSION=${{ needs.resolve-versions.outputs.copilot_api_version }}
183+
GO_VERSION=${{ env.GO_VERSION }}
126184
127185
build-and-push-rust:
128186
name: Build and Push Rust Profile Image
129187
runs-on: ubuntu-latest
130-
needs: [prepare, build-and-push]
188+
needs: [prepare, resolve-versions, build-and-push-core]
131189
permissions:
132190
contents: read
133191
packages: write
@@ -171,12 +229,18 @@ jobs:
171229
cache-from: type=gha
172230
cache-to: type=gha,mode=max
173231
build-args: |
174-
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.prepare.outputs.release_tag }}
232+
BASE_IMAGE=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ needs.prepare.outputs.release_tag }}-core
233+
CLAUDE_CODE_VERSION=${{ needs.resolve-versions.outputs.claude_code_version }}
234+
CODEX_VERSION=${{ needs.resolve-versions.outputs.codex_version }}
235+
GEMINI_CLI_VERSION=${{ needs.resolve-versions.outputs.gemini_cli_version }}
236+
ATLAS_CLI_VERSION=${{ needs.resolve-versions.outputs.atlas_cli_version }}
237+
PLAYWRIGHT_VERSION=${{ env.PLAYWRIGHT_VERSION }}
238+
PLAYWRIGHT_MCP_VERSION=${{ env.PLAYWRIGHT_MCP_VERSION }}
175239
176240
release:
177241
name: Create GitHub Release
178242
runs-on: ubuntu-latest
179-
needs: [prepare, build-and-push, build-and-push-rust]
243+
needs: [prepare, build-and-push-core, build-and-push, build-and-push-rust]
180244
permissions:
181245
contents: write
182246
steps:

Dockerfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
3030
openssh-client rsync \
3131
shellcheck bat fd-find silversearcher-ag \
3232
vim \
33-
procps psmisc zsh socat \
33+
procps psmisc zsh socat bubblewrap \
3434
libevent-dev libncurses-dev bison
3535

3636
# Prevent noisy setlocale warnings at shell startup
@@ -43,7 +43,7 @@ RUN git lfs install --system
4343
# Install language runtimes in parallel-friendly layers
4444
FROM base AS runtimes
4545

46-
ARG NODE_MAJOR=22
46+
ARG NODE_MAJOR=24
4747
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
4848
--mount=type=cache,target=/var/lib/apt,sharing=locked \
4949
curl -fsSL https://deb.nodesource.com/setup_${NODE_MAJOR}.x | bash - && \
@@ -60,12 +60,13 @@ RUN curl -LsSf https://astral.sh/uv/install.sh | sh
6060
# Pre-install Python 3.14t (free-threaded) for uv
6161
RUN /root/.local/bin/uv python install 3.14t
6262

63+
ARG GO_VERSION=1.26.2
6364
RUN --mount=type=cache,target=/tmp/go-cache,sharing=locked \
6465
ARCH=$(dpkg --print-architecture) && \
6566
GO_ARCH=$([ "$ARCH" = "amd64" ] && echo "amd64" || echo "arm64") && \
6667
cd /tmp/go-cache && \
67-
wget -q https://go.dev/dl/go1.22.0.linux-${GO_ARCH}.tar.gz && \
68-
tar -C /usr/local -xzf go1.22.0.linux-${GO_ARCH}.tar.gz
68+
wget -q "https://go.dev/dl/go${GO_VERSION}.linux-${GO_ARCH}.tar.gz" && \
69+
tar -C /usr/local -xzf "go${GO_VERSION}.linux-${GO_ARCH}.tar.gz"
6970

7071
# Install Copilot API (ericc-ch fork with latest features)
7172
# Placed at end of runtimes stage to avoid invalidating cache for stable runtimes

Dockerfile.rust

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,24 @@ ARG CLAUDE_CODE_VERSION=2.1.81
1212
ARG CODEX_VERSION=0.116.0
1313
ARG GEMINI_CLI_VERSION=0.35.0
1414
ARG ATLAS_CLI_VERSION=v0.1.4
15+
ARG PLAYWRIGHT_VERSION=1.59.1
16+
ARG PLAYWRIGHT_MCP_VERSION=0.0.70
1517
ARG RUST_TOOLCHAINS="stable"
1618
ARG RUST_TARGETS="wasm32-unknown-unknown"
1719

1820
LABEL org.opencontainers.image.claude_code_version=${CLAUDE_CODE_VERSION}
1921
LABEL org.opencontainers.image.codex_version=${CODEX_VERSION}
2022
LABEL org.opencontainers.image.gemini_cli_version=${GEMINI_CLI_VERSION}
2123
LABEL org.opencontainers.image.atlas_cli_version=${ATLAS_CLI_VERSION}
24+
LABEL org.opencontainers.image.playwright_version=${PLAYWRIGHT_VERSION}
25+
LABEL org.opencontainers.image.playwright_mcp_version=${PLAYWRIGHT_MCP_VERSION}
2226

2327
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
2428

2529
ENV RUSTUP_HOME=/opt/rustup \
2630
CARGO_HOME=/opt/cargo \
27-
PATH=/opt/cargo/bin:$PATH
31+
PATH=/opt/cargo/bin:$PATH \
32+
PLAYWRIGHT_BROWSERS_PATH=/home/deva/.cache/ms-playwright
2833

2934
USER root
3035

@@ -47,6 +52,20 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
4752
apt-get update && \
4853
apt-get install -y --no-install-recommends clickhouse-client
4954

55+
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
56+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
57+
set -euxo pipefail && \
58+
ARCH=$(dpkg --print-architecture) && \
59+
if [ "$ARCH" = "amd64" ]; then \
60+
mkdir -p /etc/apt/keyrings && \
61+
curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg && \
62+
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list && \
63+
apt-get update && \
64+
apt-get install -y --no-install-recommends google-chrome-stable; \
65+
else \
66+
echo "Skipping google-chrome-stable on unsupported architecture: $ARCH"; \
67+
fi
68+
5069
RUN --mount=type=cache,target=/tmp/rust-cache,sharing=locked \
5170
set -euxo pipefail && \
5271
mkdir -p "$RUSTUP_HOME" "$CARGO_HOME" && \
@@ -82,8 +101,15 @@ RUN echo 'export PATH="/opt/cargo/bin:$PATH"' >> "$DEVA_HOME/.zshrc" && \
82101
USER $DEVA_USER
83102
WORKDIR $DEVA_HOME
84103

104+
COPY --chown=deva:deva scripts/install-browser-tooling.sh /tmp/install-browser-tooling.sh
85105
COPY --chown=deva:deva scripts/install-agent-tooling.sh /tmp/install-agent-tooling.sh
86106

107+
RUN --mount=type=cache,target=/home/deva/.npm,uid=${DEVA_UID},gid=${DEVA_GID},sharing=locked \
108+
--mount=type=cache,target=/var/cache/apt,sharing=locked \
109+
--mount=type=cache,target=/var/lib/apt,sharing=locked \
110+
bash /tmp/install-browser-tooling.sh && \
111+
rm -f /tmp/install-browser-tooling.sh
112+
87113
RUN --mount=type=cache,target=/home/deva/.npm,uid=${DEVA_UID},gid=${DEVA_GID},sharing=locked \
88114
bash /tmp/install-agent-tooling.sh && \
89115
rm -f /tmp/install-agent-tooling.sh

0 commit comments

Comments
 (0)