From d69a1ce9b1bbbead088832c298d6f47fd77e6784 Mon Sep 17 00:00:00 2001 From: muthu90tech Date: Sun, 12 Jan 2025 16:40:11 -0800 Subject: [PATCH] Use docker to build deno cli on a debian env Instead of managing deps locally on the dev machine, use docker to manage build env for a quick deno cli build from source fixes: https://github.com/denoland/deno/issues/27648 --- .gitignore | 1 + tools/buildtools/Dockerfile | 29 ++++++++++++ tools/buildtools/denobuild | 90 +++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 tools/buildtools/Dockerfile create mode 100755 tools/buildtools/denobuild diff --git a/.gitignore b/.gitignore index 8be7f979d1b691..413098c1d5f66f 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/tools/buildtools/Dockerfile b/tools/buildtools/Dockerfile new file mode 100644 index 00000000000000..ff018b1c12023f --- /dev/null +++ b/tools/buildtools/Dockerfile @@ -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 \ No newline at end of file diff --git a/tools/buildtools/denobuild b/tools/buildtools/denobuild new file mode 100755 index 00000000000000..aba25536b68513 --- /dev/null +++ b/tools/buildtools/denobuild @@ -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 + + +