Vendor opencode source for docker build
This commit is contained in:
38
opencode/packages/containers/README.md
Normal file
38
opencode/packages/containers/README.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# CI containers
|
||||
|
||||
Prebuilt images intended to speed up GitHub Actions jobs by baking in
|
||||
large, slow-to-install dependencies. These are designed for Linux jobs
|
||||
that can use `job.container` in workflows.
|
||||
|
||||
Images
|
||||
|
||||
- `base`: Ubuntu 24.04 with common build tools and utilities
|
||||
- `bun-node`: `base` plus Bun and Node.js 24
|
||||
- `rust`: `bun-node` plus Rust (stable, minimal profile)
|
||||
- `tauri-linux`: `rust` plus Tauri Linux build dependencies
|
||||
- `publish`: `bun-node` plus Docker CLI and AUR tooling
|
||||
|
||||
Build
|
||||
|
||||
```
|
||||
REGISTRY=ghcr.io/anomalyco TAG=24.04 bun ./packages/containers/script/build.ts
|
||||
REGISTRY=ghcr.io/anomalyco TAG=24.04 bun ./packages/containers/script/build.ts --push
|
||||
```
|
||||
|
||||
Workflow usage
|
||||
|
||||
```
|
||||
jobs:
|
||||
build-cli:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: ghcr.io/anomalyco/build/bun-node:24.04
|
||||
```
|
||||
|
||||
Notes
|
||||
|
||||
- These images only help Linux jobs. macOS and Windows jobs cannot run
|
||||
inside Linux containers.
|
||||
- `--push` publishes multi-arch (amd64 + arm64) images using Buildx.
|
||||
- If a job uses Docker Buildx, the container needs access to the host
|
||||
Docker daemon (or `docker-in-docker` with privileged mode).
|
||||
18
opencode/packages/containers/base/Dockerfile
Normal file
18
opencode/packages/containers/base/Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
||||
FROM ubuntu:24.04
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
ca-certificates \
|
||||
curl \
|
||||
git \
|
||||
jq \
|
||||
openssh-client \
|
||||
pkg-config \
|
||||
python3 \
|
||||
unzip \
|
||||
xz-utils \
|
||||
zip \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
24
opencode/packages/containers/bun-node/Dockerfile
Normal file
24
opencode/packages/containers/bun-node/Dockerfile
Normal file
@@ -0,0 +1,24 @@
|
||||
ARG REGISTRY=ghcr.io/anomalyco
|
||||
FROM ${REGISTRY}/build/base:24.04
|
||||
|
||||
SHELL ["/bin/bash", "-lc"]
|
||||
|
||||
ARG NODE_VERSION=24.4.0
|
||||
ARG BUN_VERSION=1.3.5
|
||||
|
||||
ENV BUN_INSTALL=/opt/bun
|
||||
ENV PATH=/opt/bun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
RUN set -euo pipefail; \
|
||||
arch=$(uname -m); \
|
||||
node_arch=x64; \
|
||||
if [ "$arch" = "aarch64" ]; then node_arch=arm64; fi; \
|
||||
curl -fsSL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${node_arch}.tar.xz" \
|
||||
| tar -xJf - -C /usr/local --strip-components=1; \
|
||||
corepack enable
|
||||
|
||||
RUN set -euo pipefail; \
|
||||
curl -fsSL https://bun.sh/install | bash -s -- "bun-v${BUN_VERSION}"; \
|
||||
bun --version; \
|
||||
node --version; \
|
||||
npm --version
|
||||
10
opencode/packages/containers/publish/Dockerfile
Normal file
10
opencode/packages/containers/publish/Dockerfile
Normal file
@@ -0,0 +1,10 @@
|
||||
ARG REGISTRY=ghcr.io/anomalyco
|
||||
FROM ${REGISTRY}/build/bun-node:24.04
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
docker.io \
|
||||
pacman-package-manager \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
13
opencode/packages/containers/rust/Dockerfile
Normal file
13
opencode/packages/containers/rust/Dockerfile
Normal file
@@ -0,0 +1,13 @@
|
||||
ARG REGISTRY=ghcr.io/anomalyco
|
||||
FROM ${REGISTRY}/build/bun-node:24.04
|
||||
|
||||
ARG RUST_TOOLCHAIN=stable
|
||||
|
||||
ENV CARGO_HOME=/opt/cargo
|
||||
ENV RUSTUP_HOME=/opt/rustup
|
||||
ENV PATH=/opt/cargo/bin:/opt/bun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
|
||||
RUN set -euo pipefail; \
|
||||
curl -fsSL https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain "${RUST_TOOLCHAIN}"; \
|
||||
rustc --version; \
|
||||
cargo --version
|
||||
77
opencode/packages/containers/script/build.ts
Normal file
77
opencode/packages/containers/script/build.ts
Normal file
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env bun
|
||||
|
||||
import { $ } from "bun"
|
||||
import path from "path"
|
||||
import { fileURLToPath } from "url"
|
||||
|
||||
const rootDir = fileURLToPath(new URL("../../..", import.meta.url))
|
||||
process.chdir(rootDir)
|
||||
|
||||
const reg = process.env.REGISTRY ?? "ghcr.io/anomalyco"
|
||||
const tag = process.env.TAG ?? "24.04"
|
||||
const push = process.argv.includes("--push") || process.env.PUSH === "1"
|
||||
|
||||
const root = path.join(rootDir, "package.json")
|
||||
const pkg = await Bun.file(root).json()
|
||||
const manager = pkg.packageManager ?? ""
|
||||
const bun = manager.startsWith("bun@") ? manager.slice(4) : ""
|
||||
if (!bun) throw new Error("packageManager must be bun@<version>")
|
||||
|
||||
const images = ["base", "bun-node", "rust", "tauri-linux", "publish"]
|
||||
|
||||
const setup = async () => {
|
||||
if (!push) return
|
||||
const list = await $`docker buildx ls`.text()
|
||||
if (list.includes("opencode")) {
|
||||
await $`docker buildx use opencode`
|
||||
return
|
||||
}
|
||||
await $`docker buildx create --name opencode --use`
|
||||
}
|
||||
|
||||
await setup()
|
||||
|
||||
const platform = "linux/amd64,linux/arm64"
|
||||
|
||||
for (const name of images) {
|
||||
const image = `${reg}/build/${name}:${tag}`
|
||||
const file = `packages/containers/${name}/Dockerfile`
|
||||
if (name === "base") {
|
||||
if (push) {
|
||||
console.log(`docker buildx build --platform ${platform} -f ${file} -t ${image} --push .`)
|
||||
await $`docker buildx build --platform ${platform} -f ${file} -t ${image} --push .`
|
||||
}
|
||||
if (!push) {
|
||||
console.log(`docker build -f ${file} -t ${image} .`)
|
||||
await $`docker build -f ${file} -t ${image} .`
|
||||
}
|
||||
}
|
||||
if (name === "bun-node") {
|
||||
if (push) {
|
||||
console.log(
|
||||
`docker buildx build --platform ${platform} -f ${file} -t ${image} --build-arg REGISTRY=${reg} --build-arg BUN_VERSION=${bun} --push .`,
|
||||
)
|
||||
await $`docker buildx build --platform ${platform} -f ${file} -t ${image} --build-arg REGISTRY=${reg} --build-arg BUN_VERSION=${bun} --push .`
|
||||
}
|
||||
if (!push) {
|
||||
console.log(`docker build -f ${file} -t ${image} --build-arg REGISTRY=${reg} --build-arg BUN_VERSION=${bun} .`)
|
||||
await $`docker build -f ${file} -t ${image} --build-arg REGISTRY=${reg} --build-arg BUN_VERSION=${bun} .`
|
||||
}
|
||||
}
|
||||
if (name !== "base" && name !== "bun-node") {
|
||||
if (push) {
|
||||
console.log(
|
||||
`docker buildx build --platform ${platform} -f ${file} -t ${image} --build-arg REGISTRY=${reg} --push .`,
|
||||
)
|
||||
await $`docker buildx build --platform ${platform} -f ${file} -t ${image} --build-arg REGISTRY=${reg} --push .`
|
||||
}
|
||||
if (!push) {
|
||||
console.log(`docker build -f ${file} -t ${image} --build-arg REGISTRY=${reg} .`)
|
||||
await $`docker build -f ${file} -t ${image} --build-arg REGISTRY=${reg} .`
|
||||
}
|
||||
}
|
||||
|
||||
if (push) {
|
||||
console.log(`pushed ${image}`)
|
||||
}
|
||||
}
|
||||
12
opencode/packages/containers/tauri-linux/Dockerfile
Normal file
12
opencode/packages/containers/tauri-linux/Dockerfile
Normal file
@@ -0,0 +1,12 @@
|
||||
ARG REGISTRY=ghcr.io/anomalyco
|
||||
FROM ${REGISTRY}/build/rust:24.04
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libappindicator3-dev \
|
||||
libwebkit2gtk-4.1-dev \
|
||||
librsvg2-dev \
|
||||
patchelf \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
8
opencode/packages/containers/tsconfig.json
Normal file
8
opencode/packages/containers/tsconfig.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/tsconfig",
|
||||
"extends": "@tsconfig/bun/tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"lib": ["ESNext", "DOM", "DOM.Iterable"],
|
||||
"noUncheckedIndexedAccess": false
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user