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.
115 lines
4.5 KiB
Docker
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
|