Skip to content

Commit

Permalink
Use docker to build deno cli on a debian env
Browse files Browse the repository at this point in the history
Instead of managing deps locally on the dev machine, use docker to manage build env for
a quick deno cli build from source

fixes: denoland#27648
  • Loading branch information
muthu90tech committed Jan 15, 2025
1 parent 70c822b commit d69a1ce
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ gclient_config.py_entries
/tests/napi/node_modules
/tests/napi/build
/tests/napi/third_party_tests/node_modules
.buildtool

# MacOS generated files
.DS_Store
Expand Down
29 changes: 29 additions & 0 deletions tools/buildtools/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Use Ubuntu 24.04 LTS as the base image
FROM ubuntu:24.04

WORKDIR /mnt
RUN apt-get update && apt-get install -y \
curl \
build-essential \
libssl-dev \
pkg-config \
wget \
cmake \
libglib2.0-dev \
lsb-release \
software-properties-common \
gnupg \
&& rm -rf /var/lib/apt/lists/*

RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

# Add the Cargo and Rust binaries to the PATH
ENV PATH="/root/.cargo/bin:${PATH}"

# Verify the installation
RUN rustc --version && cargo --version

RUN wget https://apt.llvm.org/llvm.sh && \
chmod +x llvm.sh && \
./llvm.sh 17 && \
apt-get install --install-recommends -y cmake libglib2.0-dev
90 changes: 90 additions & 0 deletions tools/buildtools/denobuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/bin/bash

is_debian_based() {
if [ -f /etc/os-release ]; then
source /etc/os-release
if [[ "$ID_LIKE" == *debian* || "$ID" == *debian* ]]; then
return 0
fi
fi
return 1
}

if ! is_debian_based; then
echo "Only works on debian based systems"
exit 1
fi

buildtools_folder="$(realpath $(dirname "$0"))"
deno_root="$(realpath "$buildtools_folder/../..")"

if command -v docker &> /dev/null
then
echo "Docker is installed."
docker --version
else
echo "Docker is not installed."
exit 1
fi

DOCKERFILE="$buildtools_folder/Dockerfile"
IMAGE_NAME="denobuildtool"
IMAGE_TAG="current"
BUILD_TOOL_WORKING_DIR="$deno_root/.buildtool"
STORED_DOCKER_FILE_CHECKSUM_FILE="$BUILD_TOOL_WORKING_DIR/dockerfile_check_sum"

if [ ! -d "$BUILD_TOOL_WORKING_DIR" ]; then
mkdir -p "$BUILD_TOOL_WORKING_DIR"
fi

DOCKERFILE_CHECKSUM=$(sha256sum "$DOCKERFILE" | awk '{ print $1 }')

run_with_docker() {
if [[ $# != 0 ]]; then
args=("$@")
else
args=(/bin/bash -i)
fi

docker_args=()
if [ "$PWD" != "$deno_root" ]; then
docker_args+=(-v "$deno_root:$deno_root")
fi

image="$IMAGE_NAME:$IMAGE_TAG"
docker_args+=(
--network host \
--privileged \
-v "$PWD:$PWD" \
-v /etc/localtime:/etc/localtime:ro \
--env CARGO_HOME \
-v "${CARGO_HOME}:${CARGO_HOME}" \
-w "$PWD" \
-e HOME="$HOME" \
"$image" \
"${args[@]}"
)

docker run --rm "${docker_args[@]}"
}

if [ -f "$STORED_DOCKER_FILE_CHECKSUM_FILE" ]; then
STORED_DOCKERFILE_CHECKSUM=$(cat "$STORED_DOCKER_FILE_CHECKSUM_FILE")

# Compare the current checksums with the stored checksums
if [ "$DOCKERFILE_CHECKSUM" == "$STORED_DOCKERFILE_CHECKSUM" ]; then
echo "Dockerfile not changed, no need to rebuild"
run_with_docker "$@"
else
echo "Dockerfile changed Proceeding with building docker image..."
docker buildx build -t "$IMAGE_NAME:$IMAGE_TAG" "$buildtools_folder" &&
echo "$DOCKERFILE_CHECKSUM" > "$STORED_DOCKER_FILE_CHECKSUM_FILE"
fi
else
echo "No previous checksum found. Building the image..."
docker buildx build -t "$IMAGE_NAME:$IMAGE_TAG" "$buildtools_folder" &&
echo "$DOCKERFILE_CHECKSUM" > "$STORED_DOCKER_FILE_CHECKSUM_FILE"
fi



0 comments on commit d69a1ce

Please sign in to comment.