Firehose Bot 5d20a21499 Add init script for demo skill
Installs chrome and rodney
2026-05-18 22:06:20 +01:00

132 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
# init.sh — Set up the demo skill's headless Chrome container
#
# Prerequisites:
# - go (for installing showboat & rodney)
# - docker
#
# This script:
# 1. Installs showboat and rodney if missing
# 2. Downloads Chromium for the host (macOS, via rodney)
# 3. Downloads Chromium for the Docker image (Linux_x64, from GCS)
# 4. Copies Linux binary into chrome/ (the Docker build context)
# 5. Builds the demo-chrome image
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CHROME_DIR="$SKILL_DIR/chrome"
IMAGE_NAME="${1:-demo-chrome}"
echo "==> Checking prerequisites..."
# ------------------------------------------------------------------
# 1. Install CLI tools
# ------------------------------------------------------------------
GO_BIN_DIR="$(go env GOBIN 2>/dev/null || echo "$HOME/go/bin")"
export PATH="$GO_BIN_DIR:$PATH"
if ! command -v showboat &>/dev/null; then
echo "==> Installing showboat..."
go install github.com/simonw/showboat@latest
else
echo " showboat: ok"
fi
if ! command -v rodney &>/dev/null; then
echo "==> Installing rodney..."
go install github.com/simonw/rodney@latest
else
echo " rodney: ok"
fi
# ------------------------------------------------------------------
# 2. Download macOS Chromium for local rodney
# ------------------------------------------------------------------
echo "==> Downloading macOS Chromium via rodney..."
rodney start 2>/dev/null || true
rodney stop 2>/dev/null || true
ROD_CACHE="$HOME/.cache/rod/browser"
if [ -d "$ROD_CACHE" ]; then
CHROMIUM_DIR=$(ls -d "$ROD_CACHE"/chromium-* 2>/dev/null | head -1)
else
echo "ERROR: rod cache not found at $ROD_CACHE"
exit 1
fi
if [ -z "$CHROMIUM_DIR" ]; then
echo "ERROR: No chromium-* directory found in $ROD_CACHE"
exit 1
fi
echo " macOS Chromium at: $CHROMIUM_DIR"
# Extract revision number from directory name (e.g. chromium-1321438)
REVISION=$(basename "$CHROMIUM_DIR" | sed 's/chromium-//')
echo " Revision: $REVISION"
# ------------------------------------------------------------------
# 3. Download Linux Chromium for the Docker image
# ------------------------------------------------------------------
LINUX_ZIP="/tmp/chrome-linux-$REVISION.zip"
LINUX_EXTRACT="/tmp/chrome-linux-extract"
echo "==> Downloading Linux_x64 Chromium (revision $REVISION)..."
if [ ! -f "$LINUX_ZIP" ]; then
curl -fSL \
"https://storage.googleapis.com/chromium-browser-snapshots/Linux_x64/$REVISION/chrome-linux.zip" \
-o "$LINUX_ZIP"
echo " Downloaded: $LINUX_ZIP"
else
echo " Already cached: $LINUX_ZIP"
fi
# ------------------------------------------------------------------
# 4. Extract and copy into build context
# ------------------------------------------------------------------
echo "==> Extracting Linux Chromium into $CHROME_DIR ..."
rm -rf "$LINUX_EXTRACT" "$CHROME_DIR"
mkdir -p "$LINUX_EXTRACT"
unzip -q "$LINUX_ZIP" -d "$LINUX_EXTRACT"
# chrome-linux.zip contains a single chrome-linux/ directory
mv "$LINUX_EXTRACT/chrome-linux" "$CHROME_DIR"
# IMPORTANT: set suid on the sandbox binary so Chrome can sandbox child processes
if [ -f "$CHROME_DIR/chrome_sandbox" ]; then
chmod 4755 "$CHROME_DIR/chrome_sandbox"
fi
echo "==> Files in $CHROME_DIR:"
ls -lh "$CHROME_DIR/" | head -15
# Clean up extraction temp
rm -rf "$LINUX_EXTRACT"
# ------------------------------------------------------------------
# 5. Build Docker image
# ------------------------------------------------------------------
echo "==> Building Docker image '$IMAGE_NAME' ..."
docker build --tag "$IMAGE_NAME" "$SKILL_DIR"
# ------------------------------------------------------------------
# 6. Verify
# ------------------------------------------------------------------
echo ""
echo "==> Success!"
echo " Image: $IMAGE_NAME"
echo ""
echo " Run the container:"
echo " docker run -d --name demo-chrome \\"
echo " --cap-add=SYS_ADMIN --cap-drop=ALL \\"
echo " --security-opt=no-new-privileges:false \\"
echo " -p 9222:9222 \\"
echo " $IMAGE_NAME"
echo ""
echo " Connect rodney to it:"
echo " rodney connect localhost:9222"
echo ""
echo " Stop the container:"
echo " docker stop demo-chrome && docker rm demo-chrome"