llvm-project/libcxx/utils/ci/docker/android-builder.dockerfile
Louis Dionne bf07226c6d
[libc++] Reorganize and fix the libc++ CI dockerfiles (#167530)
Instead of having one large Dockerfile building multiple images with
relatively confusing inheritance, explicitly have three standalone
Dockerfiles each building one image. Then, tie the three images together
using the docker-compose file which explicitly versions the base image
used by the Android and the Github Actions images.
2025-11-14 04:03:21 -05:00

115 lines
4.5 KiB
Docker

# ===----------------------------------------------------------------------===##
#
# 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