From e95d6fa3bdcdc2c0d15a8378400e4191e3d528c0 Mon Sep 17 00:00:00 2001 From: Ian Date: Sat, 3 Oct 2026 22:54:34 +0200 Subject: [PATCH] ref: refactored scripts --- Dockerfile | 45 +++++++++++----------------- build.sh | 86 +++++++++++++++++++++++------------------------------- dev.sh | 46 +++++++++++------------------ 3 files changed, 70 insertions(+), 107 deletions(-) diff --git a/Dockerfile b/Dockerfile index d734dae..fbf3bd8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,10 +9,6 @@ ARG OPENCODE_VERSION=2.0.3 ARG DEV_UID=1000 ARG DEV_GID=1000 -# Move the pre-existing ubuntu user/group away from 1000:1000 -RUN groupmod --gid 1234 ubuntu \ - && usermod --uid 1234 --gid 1234 ubuntu - ENV DEBIAN_FRONTEND=noninteractive SHELL ["/bin/bash", "-o", "pipefail", "-c"] @@ -53,37 +49,35 @@ RUN apt-get update \ zip \ && update-alternatives --set java /usr/lib/jvm/java-17-openjdk-amd64/bin/java \ && update-alternatives --set javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac \ - # && rm -rf /var/lib/apt/lists/* + && rm -rf /var/lib/apt/lists/* \ && echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen \ - && locale-gen + && locale-gen \ + && ln -s "$(command -v fdfind)" /usr/local/bin/fd COPY ./certs /usr/local/share/ca-certificates RUN update-ca-certificates ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt -# Runtime user -RUN groupadd --gid "${DEV_GID}" dev \ - && useradd \ - --uid "${DEV_UID}" \ - --gid "${DEV_GID}" \ - --create-home \ - --shell /bin/bash dev +# Remove ubuntu user and create the dev one +RUN (userdel -r ubuntu 2>/dev/null || true) \ + && (groupdel ubuntu 2>/dev/null || true) \ + && groupadd --gid "${DEV_GID}" dev \ + && useradd --uid "${DEV_UID}" --gid "${DEV_GID}" --create-home --shell /bin/bash dev # Node.js + OpenCode -RUN curl -fsSLO \ - "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.xz" \ - && tar -xJf \ - "node-v${NODE_VERSION}-linux-x64.tar.xz" \ - -C /usr/local \ - --strip-components=1 \ - && rm "node-v${NODE_VERSION}-linux-x64.tar.xz" \ +RUN f="node-v${NODE_VERSION}-linux-x64.tar.xz" \ + && curl -fsSLO "https://nodejs.org/dist/v${NODE_VERSION}/${f}" \ + && curl -fsSLO "https://nodejs.org/dist/v${NODE_VERSION}/SHASUMS256.txt" \ + && grep " ${f}\$" SHASUMS256.txt | sha256sum -c - \ + && tar -xJf "node-v${NODE_VERSION}-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ + && rm -f "${f}" SHASUMS256.txt \ && echo -n "node version: " && node --version \ && echo -n "npm version: " && npm --version \ && npm install -g "@opencode/cli@${OPENCODE_VERSION}" \ && echo -n "opencode version: " && opencode --version \ && npm cache clean --force -# User directories +# User directories and dot expansion RUN mkdir -p \ /workspace \ /home/dev/.config/opencode \ @@ -92,11 +86,8 @@ RUN mkdir -p \ /home/dev/.cache/pip \ /home/dev/.npm \ /home/dev/.m2 \ - && chown -R dev:dev \ - /workspace \ - /home/dev - -RUN printf '%s\n' 'shopt -s dotglob' >> /etc/bash.bashrc + && chown -R dev:dev /workspace /home/dev \ + && printf '%s\n' 'shopt -s dotglob' >> /etc/bash.bashrc # Runtime USER dev @@ -107,8 +98,6 @@ ENV HOME=/home/dev \ PIP_CACHE_DIR=/home/dev/.cache/pip \ NPM_CONFIG_CACHE=/home/dev/.npm -RUN echo 'for f in /host-bash/*; do [ -r "$f" ] && source "$f"; done' >> ~/.bashrc - WORKDIR /workspace ENTRYPOINT ["/usr/local/bin/opencode-dev-entrypoint"] diff --git a/build.sh b/build.sh index 0603794..93ee6fa 100755 --- a/build.sh +++ b/build.sh @@ -5,59 +5,45 @@ SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" UBUNTU_VERSION="${UBUNTU_VERSION:-26.04}" -# OPENCODE_VERSION=$(curl -fsSI https://github.com/anomalyco/opencode/releases/latest | sed -n 's/^location:.*\/tag\/v\{0,1\}\(.*\)\r$/\1/ip') NODE_VERSION="${NODE_VERSION:-24.21.0}" OPENCODE_VERSION="${OPENCODE_VERSION:-2.0.3}" +IMAGE="${IMAGE_REPO:-localhost/opencode-dev}" -IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}" -# IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}" -# IMAGE="${IMAGE_REPO}:${IMAGE_TAG}" -IMAGE="${IMAGE_REPO}" - -NO_CACHE=() -if [[ "${1:-}" == "--no-cache" ]]; then - NO_CACHE+=(--no-cache) - shift -fi - -UPDATE=0 -if [[ "${1:-}" == "--update" ]]; then - UPDATE=1 - shift -fi - -DRY_RUN=false -if [[ "${1:-}" == "--dry-run" ]]; then - DRY_RUN=true - shift -fi - -if (($#)); then - echo "Usage: $0 [--no-cache] [--update] [--dry-run]" >&2 +usage() { + echo "Usage: $0 [--no-cache] [--update] [--dry-run]" exit 2 +} + +BUILD_OPTS=() +DRY_RUN=0 +while (($#)); do + case "$1" in + --no-cache) BUILD_OPTS+=(--no-cache) ;; + --update) BUILD_OPTS+=(--no-cache --pull=newer) ;; + --dry-run) DRY_RUN=1 ;; + -h|--help) usage ;; + *) echo "Unknown option: $1" >&2; usage ;; + esac + shift +done + +CMD=( + podman build + "${BUILD_OPTS[@]}" + --build-arg "UBUNTU_VERSION=${UBUNTU_VERSION}" + --build-arg "NODE_VERSION=${NODE_VERSION}" + --build-arg "OPENCODE_VERSION=${OPENCODE_VERSION}" + --build-arg "DEV_UID=$(id -u)" + --build-arg "DEV_GID=$(id -g)" + -t "$IMAGE" + . +) + +if ((DRY_RUN)); then + printf 'running:'; printf ' %q' "${CMD[@]}"; echo + exit 0 fi -if ((UPDATE)); then - echo "Update requested: rebuilding ${IMAGE} with current Ubuntu package metadata." - podman rmi $(podman images -q ${IMAGE_REPO}) -fi - -DEV_UID="$(id -u)" -DEV_GID="$(id -g)" - -if [ ${DRY_RUN} == false ]; then - podman build \ - "${NO_CACHE[@]}" \ - --build-arg "UBUNTU_VERSION=${UBUNTU_VERSION}" \ - --build-arg "NODE_VERSION=${NODE_VERSION}" \ - --build-arg "OPENCODE_VERSION=${OPENCODE_VERSION}" \ - --build-arg "DEV_UID=${DEV_UID}" \ - --build-arg "DEV_GID=${DEV_GID}" \ - -t "$IMAGE" \ - . - - echo - echo "Built: $IMAGE" -else - echo "running: podman build ${NO_CACHE[@]} --build-arg UBUNTU_VERSION=${UBUNTU_VERSION} --build-arg NODE_VERSION=${NODE_VERSION} -t $IMAGE" -fi +"${CMD[@]}" +echo +echo "Built: $IMAGE" diff --git a/dev.sh b/dev.sh index 470b16a..273bf5f 100755 --- a/dev.sh +++ b/dev.sh @@ -3,13 +3,16 @@ set -euo pipefail SCRIPT_DIR=$(realpath -- "$(dirname -- "${BASH_SOURCE[0]}")") -BASE_DIR="${OPENCODE_DEV_HOME:-$HOME/opencode-dev}" IMAGE_REPO="${IMAGE_REPO:-localhost/opencode-dev}" -# OPENCODE_VERSION="${OPENCODE_VERSION:-1.18.32}" -# IMAGE_TAG="${IMAGE_TAG:-${OPENCODE_VERSION}}" IMAGE="${IMAGE_REPO}" +if ! podman image exists "$IMAGE"; then + echo "Image $IMAGE does not exist. Build it first with ./build.sh" >&2 + exit 1 +fi + # Folders +BASE_DIR="${OPENCODE_DEV_HOME:-$HOME/opencode-dev}" PROJECTS_DIR="${PROJECT_DIR:-$BASE_DIR/projects}" OPC_CONFIG="${OPENCODE_CONFIG:-$BASE_DIR/opencode-config}" OPC_DATA="${OPENCODE_SHARE_DATA:-$BASE_DIR/opencode-data}" @@ -18,7 +21,11 @@ M2_FOLDER="${M2_FOLDER:-$BASE_DIR/m2}" NPM_MODULES="${NPM_MODULES:-$BASE_DIR/npm-modules}" NPM_CACHE="${NPM_CACHE:-$BASE_DIR/npm-cache}" PIP_CACHE="${PIP_CACHE:-$BASE_DIR/pip-cache}" -BASH_FOLDER="${BASH_FOLDER:-$BASE_DIR/bash}" + +if [[ ! -d "$PROJECTS_DIR" ]]; then + echo "Project directory missing: $PROJECTS_DIR" >&2 + exit 1 +fi mkdir -p \ "$BASE_DIR" \ @@ -29,17 +36,7 @@ mkdir -p \ "$M2_FOLDER" \ "$NPM_MODULES" \ "$NPM_CACHE" \ - "$PIP_CACHE" \ - "$BASH_FOLDER" - -if [[ ! -f "$HOME/.gitconfig" ]]; then - echo "WARNING: $HOME/.gitconfig does not exist; Git will use container defaults." >&2 -fi - -if ! podman image exists "$IMAGE"; then - echo "Image $IMAGE does not exist. Build it first with ./build.sh" >&2 - exit 1 -fi + "$PIP_CACHE" START_DIR="${1:-$PROJECTS_DIR}" shift || true @@ -56,11 +53,6 @@ else START_DIR="/workspace/${START_DIR#./}" fi -if [[ ! -d "$PROJECTS_DIR" ]]; then - echo "Project directory missing: $PROJECTS_DIR" >&2 - exit 1 -fi - ARGS=( run --rm -it --name opencode-dev @@ -83,18 +75,14 @@ ARGS=( -v "$NPM_CACHE:/home/dev/.npm:rw" -v "$PIP_CACHE:/home/dev/.cache/pip:rw" -v "$PROJECTS_DIR:/workspace:rw" - -v "$HOME/.gitconfig:/home/dev/.gitconfig:ro" - # -v "$HOME/.ssh:/home/dev/.ssh:ro" - -v "$BASH_FOLDER:/host-bash:ro" -v "$SCRIPT_DIR/entrypoint.sh:/usr/local/bin/opencode-dev-entrypoint:ro" ) -# if [[ -n "${SSH_AUTH_SOCK:-}" && -S "$SSH_AUTH_SOCK" ]]; then -# ARGS+=( -# -e SSH_AUTH_SOCK=/tmp/ssh-agent.sock -# -v "$SSH_AUTH_SOCK:/tmp/ssh-agent.sock" -# ) -# fi +if [[ -f "$HOME/.gitconfig" ]]; then + ARGS+=(-v "$HOME/.gitconfig:/home/dev/.gitconfig:ro") +else + echo "WARNING: host .gitconfig not found" +fi # Additional bind mounts: # ./dev.sh /project --mount "$HOME/other:/extra"