| # ===----------------------------------------------------------------------===## | |
| # | |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| # | |
| # ===----------------------------------------------------------------------===## | |
| # | |
| # This file defines the image we use to run Android testing on Buildkite. | |
| # From the root of the monorepo, this image can be built with: | |
| # | |
| # $ docker build --file libcxx/utils/ci/docker/android-builder.dockerfile \ | |
| # --build-arg BASE_IMAGE_VERSION=<sha> \ | |
| # --build-arg ANDROID_CLANG_VERSION=<version> \ | |
| # --build-arg ANDROID_CLANG_PREBUILTS_COMMIT=<sha> \ | |
| # --build-arg ANDROID_SYSROOT_COMMIT=<sha> . | |
| # | |
| # This image also gets built on every push to `main` that modifies these Docker | |
| # files, and can be found at ghcr.io/llvm/libcxx-android-builder. | |
| # | |
| # To run the image and start a Buildkite Agent, run it as: | |
| # | |
| # $ docker run --env-file <secrets> -it ghcr.io/llvm/libcxx-android-builder:latest | |
| # | |
| # The environment variables in `<secrets>` should be the ones necessary | |
| # to run a BuildKite agent: | |
| # | |
| # BUILDKITE_AGENT_TOKEN=<token> | |
| ARG BASE_IMAGE_VERSION | |
| FROM ghcr.io/llvm/libcxx-linux-builder-base:${BASE_IMAGE_VERSION} | |
| ARG ANDROID_CLANG_VERSION | |
| ARG ANDROID_CLANG_PREBUILTS_COMMIT | |
| ARG ANDROID_SYSROOT_COMMIT | |
| # Install the Android platform tools (e.g. adb) into /opt/android/sdk. | |
| RUN <<EOF | |
| set -e | |
| mkdir -p /opt/android/sdk | |
| cd /opt/android/sdk | |
| curl -LO https://dl.google.com/android/repository/platform-tools-latest-linux.zip | |
| unzip platform-tools-latest-linux.zip | |
| rm platform-tools-latest-linux.zip | |
| EOF | |
| # Install the current Android compiler. Specify the prebuilts commit to retrieve | |
| # this compiler version even after it's removed from HEAD. | |
| ENV ANDROID_CLANG_VERSION=$ANDROID_CLANG_VERSION | |
| ENV ANDROID_CLANG_PREBUILTS_COMMIT=$ANDROID_CLANG_PREBUILTS_COMMIT | |
| RUN <<EOF | |
| set -e | |
| git clone --filter=blob:none --sparse \ | |
| https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86 \ | |
| /opt/android/clang | |
| git -C /opt/android/clang checkout ${ANDROID_CLANG_PREBUILTS_COMMIT} | |
| git -C /opt/android/clang sparse-checkout add clang-${ANDROID_CLANG_VERSION} | |
| rm -fr /opt/android/clang/.git | |
| ln -sf /opt/android/clang/clang-${ANDROID_CLANG_VERSION} /opt/android/clang/clang-current | |
| # The "git sparse-checkout" and "ln" commands succeed even if nothing was | |
| # checked out, so use this "ls" command to fix that. | |
| ls /opt/android/clang/clang-current/bin/clang | |
| EOF | |
| # Install an Android sysroot. New Android sysroots are available at | |
| # https://android.googlesource.com/platform/prebuilts/ndk/+/refs/heads/mirror-goog-main-ndk/platform/sysroot. | |
| ENV ANDROID_SYSROOT_COMMIT=$ANDROID_SYSROOT_COMMIT | |
| RUN <<EOF | |
| set -e | |
| mkdir -p /opt/android/ndk | |
| cd /opt/android/ndk | |
| git clone --filter=blob:none https://android.googlesource.com/platform/prebuilts/ndk tmp | |
| git -C tmp checkout ${ANDROID_SYSROOT_COMMIT} | |
| mv tmp/platform/sysroot . | |
| rm -rf tmp | |
| EOF | |
| # Create the libcxx-builder user | |
| RUN sudo useradd --create-home libcxx-builder | |
| WORKDIR /home/libcxx-builder | |
| # Install the Buildkite agent and dependencies. This must be done as non-root | |
| # for the Buildkite agent to be installed in a path where we can find it. | |
| # | |
| # Note that we don't set up the configuration file here, since the configuration | |
| # is passed via the environment. | |
| RUN <<EOF | |
| set -e | |
| cd /home/libcxx-builder | |
| curl -sL https://raw.githubusercontent.com/buildkite/agent/main/install.sh -o /tmp/install-agent.sh | |
| bash /tmp/install-agent.sh | |
| rm /tmp/install-agent.sh | |
| EOF | |
| ENV PATH="${PATH}:/home/libcxx-builder/.buildkite-agent/bin" | |
| # Install Docker | |
| RUN <<EOF | |
| set -e | |
| curl -fsSL https://get.docker.com -o /tmp/get-docker.sh | |
| sh /tmp/get-docker.sh | |
| rm /tmp/get-docker.sh | |
| # Install Docker. Mark the binary setuid so it can be run without prefixing it | |
| # with sudo. Adding the container user to the docker group doesn't work because | |
| # /var/run/docker.sock is owned by the host's docker GID, not the container's | |
| # docker GID. | |
| chmod u+s /usr/bin/docker | |
| EOF | |
| # Setup the Buildkite agent command line to do Android setup stuff first. | |
| USER libcxx-builder | |
| COPY libcxx/utils/ci/vendor/android/container-setup.sh /opt/android/container-setup.sh | |
| ENV PATH="/opt/android/sdk/platform-tools:${PATH}" | |
| CMD /opt/android/container-setup.sh && buildkite-agent start |