1#===----------------------------------------------------------------------===## 2# 3# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4# See https://llvm.org/LICENSE.txt for license information. 5# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6# 7#===----------------------------------------------------------------------===## 8# 9# This file defines the buildkite and github actions builder images. 10# You can build both images using: 11# 12# docker compose build 13# 14# Or you can select a single image to build 15# 16# docker compose build buildkite-builder 17# 18# The final images can be found at 19# 20# ghcr.io/libcxx/buildkite-builder 21# ghcr.io/libcxx/actions-builder 22# ghcr.io/libcxx/android-buildkite-builder 23# 24# Members of the github.com/libcxx/ organizations can push new images to the CI. 25# This is done by GitHub actions in the https://github.com/libcxx/builders repo. 26# 27# ===----------------------------------------------------------------------===## 28# Running the buildkite image 29# ===----------------------------------------------------------------------===## 30# 31# To start a Buildkite Agent, run it as: 32# $ docker run --env-file <secrets> -it $(docker build -q libcxx/utils/ci) 33# 34# The environment variables in `<secrets>` should be the ones necessary 35# to run a BuildKite agent: 36# 37# BUILDKITE_AGENT_TOKEN=<token> 38# 39# If you're only looking to run the Docker image locally for debugging a 40# build bot, see the `run-buildbot-container` script located in this directory. 41 42 43# HACK: We set the base image in the docker-compose file depending on the final target (buildkite vs github actions). 44# This means we have a much slower container build, but we can use the same Dockerfile for both targets. 45ARG BASE_IMAGE 46FROM $BASE_IMAGE AS builder-base 47 48# Make sure apt-get doesn't try to prompt for stuff like our time zone, etc. 49ENV DEBIAN_FRONTEND=noninteractive 50 51# populated in the docker-compose file 52ARG GCC_LATEST_VERSION 53ENV GCC_LATEST_VERSION=${GCC_LATEST_VERSION} 54 55# populated in the docker-compose file 56ARG LLVM_HEAD_VERSION 57ENV LLVM_HEAD_VERSION=${LLVM_HEAD_VERSION} 58 59# HACK: The github actions runner image already has sudo and requires its use. The buildkite base image does not. 60# Reconcile this. 61RUN <<EOF 62 apt-get update || true 63 apt-get install -y sudo || true 64 echo "ALL ALL = (ALL) NOPASSWD: ALL" | tee /etc/sudoers || true 65EOF 66 67# Installing tzdata before other packages avoids the time zone prompts. 68# These prompts seem to ignore DEBIAN_FRONTEND=noninteractive. 69RUN sudo apt-get update \ 70 && sudo apt-get install -y \ 71 tzdata 72 73RUN sudo apt-get update \ 74 && sudo apt-get install -y \ 75 python3 \ 76 python3-distutils \ 77 python3-psutil \ 78 git \ 79 gdb \ 80 ccache \ 81 gpg \ 82 wget \ 83 bash \ 84 curl \ 85 python3 \ 86 python3-dev \ 87 libpython3-dev \ 88 uuid-dev \ 89 libncurses5-dev \ 90 swig3.0 \ 91 libxml2-dev \ 92 libedit-dev \ 93 language-pack-en \ 94 language-pack-fr \ 95 language-pack-ja \ 96 language-pack-ru \ 97 language-pack-zh-hans \ 98 lsb-release \ 99 wget \ 100 unzip \ 101 software-properties-common \ 102 && sudo rm -rf /var/lib/apt/lists/* 103 104 105# Install various tools used by the build or the test suite 106#RUN apt-get update && apt-get install -y ninja-build python3 python3-distutils python3-psutil git gdb ccache 107# TODO add ninja-build once 1.11 is available in Ubuntu, also remove the manual installation. 108RUN <<EOF 109 wget -qO /tmp/ninja.gz https://github.com/ninja-build/ninja/releases/latest/download/ninja-linux.zip 110 gunzip /tmp/ninja.gz 111 chmod a+x /tmp/ninja 112 sudo mv /tmp/ninja /usr/local/bin/ninja 113EOF 114 115 116# These two locales are not enabled by default so generate them 117RUN <<EOF 118 printf "fr_CA ISO-8859-1\ncs_CZ ISO-8859-2" | sudo tee -a /etc/locale.gen 119 sudo mkdir /usr/local/share/i1en/ 120 printf "fr_CA ISO-8859-1\ncs_CZ ISO-8859-2" | sudo tee -a /usr/local/share/i1en/SUPPORTED 121 sudo locale-gen 122EOF 123 124# Install Clang <latest>, <latest-1> and ToT, which are the ones we support. 125# We also install <latest-2> because we need to support the "latest-1" of the 126# current LLVM release branch, which is effectively the <latest-2> of the 127# tip-of-trunk LLVM. For example, after branching LLVM 14 but before branching 128# LLVM 15, we still need to have Clang 12 in this Docker image because the LLVM 129# 14 release branch CI uses it. The tip-of-trunk CI will never use Clang 12, 130# though. 131RUN <<EOF 132 sudo apt-get update 133 wget https://apt.llvm.org/llvm.sh -O /tmp/llvm.sh 134 chmod +x /tmp/llvm.sh 135 sudo /tmp/llvm.sh $(($LLVM_HEAD_VERSION - 3)) all # for CI transitions 136 sudo /tmp/llvm.sh $(($LLVM_HEAD_VERSION - 2)) all # previous release 137 sudo /tmp/llvm.sh $(($LLVM_HEAD_VERSION - 1)) all # latest release 138 sudo /tmp/llvm.sh $LLVM_HEAD_VERSION all # current ToT 139 sudo apt-get install -y libomp5-$LLVM_HEAD_VERSION 140 sudo rm -rf /var/lib/apt/lists/* 141EOF 142 143# Install the most recent GCC, like clang install the previous version as a transition. 144RUN <<EOF 145 sudo add-apt-repository ppa:ubuntu-toolchain-r/test 146 sudo apt-get update 147 sudo apt-get install -y \ 148 gcc-$((GCC_LATEST_VERSION - 1)) \ 149 g++-$((GCC_LATEST_VERSION - 1)) \ 150 gcc-$GCC_LATEST_VERSION \ 151 g++-$GCC_LATEST_VERSION 152 sudo rm -rf /var/lib/apt/lists/* 153EOF 154 155RUN <<EOF 156 # Install a recent CMake 157 wget https://github.com/Kitware/CMake/releases/download/v3.21.1/cmake-3.21.1-linux-x86_64.sh -O /tmp/install-cmake.sh 158 sudo bash /tmp/install-cmake.sh --prefix=/usr --exclude-subdir --skip-license 159 rm /tmp/install-cmake.sh 160EOF 161 162# ===----------------------------------------------------------------------===## 163# Android Buildkite Image 164# ===----------------------------------------------------------------------===## 165 166FROM ubuntu:jammy AS android-builder-base 167 168ARG ANDROID_CLANG_VERSION 169ARG ANDROID_CLANG_PREBUILTS_COMMIT 170ARG ANDROID_SYSROOT_BID 171 172RUN apt-get update && apt-get install -y curl unzip git 173 174# Install the Android platform tools (e.g. adb) into /opt/android/sdk. 175RUN <<EOF 176 mkdir -p /opt/android/sdk 177 cd /opt/android/sdk 178 curl -LO https://dl.google.com/android/repository/platform-tools-latest-linux.zip 179 unzip platform-tools-latest-linux.zip 180 rm platform-tools-latest-linux.zip 181EOF 182 183# Install the current Android compiler. Specify the prebuilts commit to retrieve 184# this compiler version even after it's removed from HEAD. 185 186ENV ANDROID_CLANG_VERSION=$ANDROID_CLANG_VERSION 187ENV ANDROID_CLANG_PREBUILTS_COMMIT=$ANDROID_CLANG_PREBUILTS_COMMIT 188RUN <<EOF 189 git clone --filter=blob:none --sparse \ 190 https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86 \ 191 /opt/android/clang 192 git -C /opt/android/clang checkout ${ANDROID_CLANG_PREBUILTS_COMMIT} 193 git -C /opt/android/clang sparse-checkout add clang-${ANDROID_CLANG_VERSION} 194 rm -fr /opt/android/clang/.git 195 ln -sf /opt/android/clang/clang-${ANDROID_CLANG_VERSION} /opt/android/clang/clang-current 196 # The "git sparse-checkout" and "ln" commands succeed even if nothing was 197 # checked out, so use this "ls" command to fix that. 198 ls /opt/android/clang/clang-current/bin/clang 199EOF 200 201# Install an Android sysroot. New AOSP sysroots are available at 202# https://ci.android.com/builds/branches/aosp-main/grid, the "ndk" target. The 203# NDK also makes its sysroot prebuilt available at 204# https://android.googlesource.com/platform/prebuilts/ndk/+/refs/heads/dev/platform/sysroot. 205 206ENV ANDROID_SYSROOT_BID=$ANDROID_SYSROOT_BID 207RUN <<EOF 208 cd /opt/android 209 curl -L -o ndk_platform.tar.bz2 \ 210 https://androidbuildinternal.googleapis.com/android/internal/build/v3/builds/${ANDROID_SYSROOT_BID}/ndk/attempts/latest/artifacts/ndk_platform.tar.bz2/url 211 tar xf ndk_platform.tar.bz2 212 rm ndk_platform.tar.bz2 213EOF 214 215# Install Docker 216RUN <<EOF 217 curl -fsSL https://get.docker.com -o /tmp/get-docker.sh 218 sh /tmp/get-docker.sh 219 rm /tmp/get-docker.sh 220 221 # Install Docker. Mark the binary setuid so it can be run without prefixing it 222 # with sudo. Adding the container user to the docker group doesn't work because 223 # /var/run/docker.sock is owned by the host's docker GID, not the container's 224 # docker GID. 225 chmod u+s /usr/bin/docker 226EOF 227 228# ===----------------------------------------------------------------------===## 229# Buildkite Builder Image 230# ===----------------------------------------------------------------------===## 231# 232# IMAGE: ghcr.io/libcxx/buildkite-builder. 233# 234FROM builder-base AS buildkite-builder 235 236# Create the libcxx-builder user, regardless of if we use it or not 237RUN sudo useradd --create-home libcxx-builder 238 239USER libcxx-builder 240WORKDIR /home/libcxx-builder 241 242# Install the Buildkite agent and dependencies. This must be done as non-root 243# for the Buildkite agent to be installed in a path where we can find it. 244RUN <<EOF 245 cd /home/libcxx-builder 246 curl -sL https://raw.githubusercontent.com/buildkite/agent/main/install.sh -o /tmp/install-agent.sh 247 bash /tmp/install-agent.sh 248 rm /tmp/install-agent.sh 249 echo "tags=\"queue=libcxx-builders,arch=$(uname -m),os=linux\"" \ 250 >> /home/libcxx-builder/.buildkite-agent/buildkite-agent.cfg 251EOF 252 253USER libcxx-builder 254WORKDIR /home/libcxx-builder 255 256ENV PATH="${PATH}:/home/libcxx-builder/.buildkite-agent/bin" 257 258CMD ["buildkite-agent", "start"] 259 260# ===----------------------------------------------------------------------===## 261# Android Buildkite Builder Image 262# ===----------------------------------------------------------------------===## 263# 264# IMAGE: ghcr.io/libcxx/android-buildkite-builder. 265# 266FROM buildkite-builder AS android-buildkite-builder 267 268COPY --from=android-builder-base /opt/android /opt/android 269COPY ./vendor/android/container-setup.sh /opt/android/container-setup.sh 270 271ENV PATH="/opt/android/sdk/platform-tools:${PATH}" 272 273USER libcxx-builder 274WORKDIR /home/libcxx-builder 275 276# Reset the configuration, we pass the configuration via the environment. 277RUN cp /home/libcxx-builder/.buildkite-agent/buildkite-agent.dist.cfg \ 278 /home/libcxx-builder/.buildkite-agent/buildkite-agent.cfg 279 280# Modify the Buildkite agent cmdline to do Android setup stuff first. 281CMD /opt/android/container-setup.sh && buildkite-agent start 282 283# ===----------------------------------------------------------------------===## 284# Github Actions Builder Image 285# ===----------------------------------------------------------------------===## 286# 287# IMAGE: ghcr.io/libcxx/actions-builder. 288# 289FROM builder-base AS actions-builder 290 291# Install 'act' for running github actions locally. This provides an alternative to the run-buildbot script 292# while still providing reproducability. 293RUN curl -s https://raw.githubusercontent.com/nektos/act/master/install.sh | sudo bash 294 295WORKDIR /home/runner 296USER runner 297 298 299 300