# Cloud runner image. Ubuntu 24.04 so `runs-on: ubuntu-latest` workflows behave like they do on GitHub: # apt package names, PPAs via add-apt-repository, and build tools are what those workflows expect. FROM node:24-bookworm AS node FROM ubuntu:24.04 ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && apt-get install -y --no-install-recommends \ git ca-certificates curl wget unzip zip xz-utils jq coreutils sudo gnupg lsb-release \ software-properties-common build-essential python3 python3-pip python3-venv \ && rm -rf /var/lib/apt/lists/* COPY --from=node /usr/local/bin/node /usr/local/bin/node COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules RUN ln -s ../lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \ && ln -s ../lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx \ && ln -s ../lib/node_modules/corepack/dist/corepack.js /usr/local/bin/corepack \ && node --version && npm --version # The latest stable Go, checksum-verified against go.dev's release list (resolved when the image is built). RUN set -eux; \ releases="$(curl -fsSL 'https://go.dev/dl/?mode=json')"; \ version="$(printf '%s' "$releases" | jq -r '.[0].version')"; \ file="$version.linux-amd64.tar.gz"; \ sum="$(printf '%s' "$releases" | jq -r --arg f "$file" '.[0].files[] | select(.filename == $f) | .sha256')"; \ curl -fsSL -o /tmp/go.tgz "https://go.dev/dl/$file"; \ echo "$sum /tmp/go.tgz" | sha256sum -c -; \ tar -C /usr/local -xzf /tmp/go.tgz; rm /tmp/go.tgz; \ ln -s /usr/local/go/bin/go /usr/local/bin/go; ln -s /usr/local/go/bin/gofmt /usr/local/bin/gofmt; \ go version ENV PATH=/root/go/bin:/usr/local/go/bin:$PATH RUN curl -fsSL https://bun.sh/install | bash && ln -s /root/.bun/bin/bun /usr/local/bin/bun WORKDIR /workspace CMD ["sleep", "infinity"]