From 0653dae86cbe8889cdcb457de339b54f3c476b39 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Tue, 14 Jan 2025 10:09:09 +1100 Subject: [PATCH] Unify AMD and ARM Docker images + Initial groundwork for AMD64 builds on ARM/Rosetta. Not currently viable due to bugs in either Linux or Rosetta which results in a Sveltekit build hanging indefinitely. --- .../docker/{Dockerfile.amd64 => Dockerfile} | 0 .buildkite/linux/docker/Dockerfile.arm64 | 71 ------------------- .buildkite/linux/docker/build.sh | 11 +++ .buildkite/linux/docker/common.inc | 9 +++ .buildkite/linux/docker/run.sh | 28 ++++---- .buildkite/linux/release-entrypoint | 1 + 6 files changed, 33 insertions(+), 87 deletions(-) rename .buildkite/linux/docker/{Dockerfile.amd64 => Dockerfile} (100%) delete mode 100644 .buildkite/linux/docker/Dockerfile.arm64 create mode 100755 .buildkite/linux/docker/build.sh create mode 100644 .buildkite/linux/docker/common.inc diff --git a/.buildkite/linux/docker/Dockerfile.amd64 b/.buildkite/linux/docker/Dockerfile similarity index 100% rename from .buildkite/linux/docker/Dockerfile.amd64 rename to .buildkite/linux/docker/Dockerfile diff --git a/.buildkite/linux/docker/Dockerfile.arm64 b/.buildkite/linux/docker/Dockerfile.arm64 deleted file mode 100644 index 0c2c7a7e0..000000000 --- a/.buildkite/linux/docker/Dockerfile.arm64 +++ /dev/null @@ -1,71 +0,0 @@ -FROM ubuntu:22.04 - -ARG DEBIAN_FRONTEND="noninteractive" -ENV PYTHONPATH=/usr/lib/python3/dist-packages - -RUN useradd -d /state -m -u 998 user - -RUN apt-get update && apt install --yes gnupg ca-certificates && \ - apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 32A37959C2FA5C3C99EFBC32A79206696452D198 \ - && echo "deb https://apt.buildkite.com/buildkite-agent stable main" > /etc/apt/sources.list.d/buildkite-agent.list \ - && apt-get update \ - && apt-get install --yes --no-install-recommends \ - autoconf \ - bash \ - buildkite-agent \ - ca-certificates \ - curl \ - findutils \ - g++ \ - gcc \ - git \ - grep \ - libdbus-1-3 \ - libegl1 \ - libfontconfig1 \ - libgl1 \ - libgstreamer-gl1.0-0 \ - libgstreamer-plugins-base1.0 \ - libgstreamer1.0-0 \ - libnss3 \ - libpulse-mainloop-glib0 \ - libpulse-mainloop-glib0 \ - libssl-dev \ - libxcomposite1 \ - libxcursor1 \ - libxdamage1 \ - libxi6 \ - libxkbcommon-x11-0 \ - libxkbcommon0 \ - libxkbfile1 \ - libxrandr2 \ - libxrender1 \ - libxtst6 \ - make \ - pkg-config \ - portaudio19-dev \ - python3-dev \ - rsync \ - # -- begin only required for arm64/debian11 - ninja-build \ - clang-format \ - python-is-python3 \ - python3-pyqt5.qtwebengine \ - # -- end only required for arm64/debian11 - && rm -rf /var/lib/apt/lists/* - -RUN mkdir -p /etc/buildkite-agent/hooks && chown -R user /etc/buildkite-agent - -COPY buildkite.cfg /etc/buildkite-agent/buildkite-agent.cfg -COPY environment /etc/buildkite-agent/hooks/environment - -RUN mkdir /state/rust && chown user /state/rust - -USER user - -ENV CARGO_HOME=/state/rust/cargo -ENV RUSTUP_HOME=/state/rust/rustup -RUN curl https://sh.rustup.rs -sSf | sh -s -- -y --no-modify-path --default-toolchain none - -WORKDIR /code/buildkite -ENTRYPOINT ["/usr/bin/buildkite-agent", "start"] diff --git a/.buildkite/linux/docker/build.sh b/.buildkite/linux/docker/build.sh new file mode 100755 index 000000000..a835aefb8 --- /dev/null +++ b/.buildkite/linux/docker/build.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# builds an 'anki-[amd|arm]' image for the current platform +# +# for a cross-compile on recent Docker: +# docker buildx create --use +# docker run --privileged --rm tonistiigi/binfmt --install amd64 +# docker buildx build --platform linux/amd64 --tag anki-amd64 . --load + +. common.inc + +DOCKER_BUILDKIT=1 docker build --tag anki-${platform} . diff --git a/.buildkite/linux/docker/common.inc b/.buildkite/linux/docker/common.inc new file mode 100644 index 000000000..1e0a01056 --- /dev/null +++ b/.buildkite/linux/docker/common.inc @@ -0,0 +1,9 @@ +#!/bin/bash + +set -e + +if [[ "$(uname -m)" == "x86_64" ]]; then + platform="amd" +else + platform="arm" +fi diff --git a/.buildkite/linux/docker/run.sh b/.buildkite/linux/docker/run.sh index 402a5757e..21846d658 100755 --- a/.buildkite/linux/docker/run.sh +++ b/.buildkite/linux/docker/run.sh @@ -1,33 +1,29 @@ #!/bin/bash -# - use 'BUILD=1 ./run.sh' to build image & run. +# - use './run.sh' to run in the foreground # - use './run.sh serve' to daemonize. set -e +. common.inc + if [ "$1" = "serve" ]; then extra_args="-d --restart always" else extra_args="-it" fi -if [ $(uname -m) = "aarch64" ]; then - arch=arm64 -else - arch=amd64 -fi +name=anki-${platform} -if [ -n "$BUILD" ]; then - DOCKER_BUILDKIT=1 docker build -f Dockerfile.${arch} --tag linci . -fi - -if docker container inspect linci > /dev/null 2>&1; then - docker stop linci || true - docker container rm linci +# Stop and remove the existing container if it exists. +# This doesn't delete the associated volume. +if docker container inspect $name > /dev/null 2>&1; then + docker stop $name || true + docker container rm $name fi docker run $extra_args \ - --name linci \ - -v ci-state:/state \ + --name $name \ + -v ${name}-state:/state \ -e BUILDKITE_AGENT_TOKEN \ -e BUILDKITE_AGENT_TAGS \ - linci + $name diff --git a/.buildkite/linux/release-entrypoint b/.buildkite/linux/release-entrypoint index 1039a9f27..613ca4672 100755 --- a/.buildkite/linux/release-entrypoint +++ b/.buildkite/linux/release-entrypoint @@ -11,6 +11,7 @@ echo "--- Install n2" ./tools/install-n2 if [ $(uname -m) = "aarch64" ]; then + export PYTHONPATH=/usr/lib/python3/dist-packages ./ninja wheels:anki else ./ninja bundle