blob: dbecfd9fd3325dd2e73060795c409853402e2252 [file] [log] [blame]
Louis Dionne52dc4912024-09-04 20:47:201# ===----------------------------------------------------------------------===##
Louis Dionne9f21d342020-09-23 13:20:032#
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#
Louis Dionne52dc4912024-09-04 20:47:207# ===----------------------------------------------------------------------===##
Louis Dionne9f21d342020-09-23 13:20:038#
Ericf4e3fb52023-11-16 17:52:469# This file defines the buildkite and github actions builder images.
Mark de Wever3cf169c2024-03-25 17:53:5510# You can build both images using:
Ericf4e3fb52023-11-16 17:52:4611#
12# docker compose build
Ericf4e3fb52023-11-16 17:52:4613#
Mark de Wever3cf169c2024-03-25 17:53:5514# Or you can select a single image to build
Ericf4e3fb52023-11-16 17:52:4615#
16# docker compose build buildkite-builder
Ericf4e3fb52023-11-16 17:52:4617#
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#
Mark de Wever3cf169c2024-03-25 17:53:5524# 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.
Ericf4e3fb52023-11-16 17:52:4626#
27# ===----------------------------------------------------------------------===##
28# Running the buildkite image
29# ===----------------------------------------------------------------------===##
Louis Dionne9f21d342020-09-23 13:20:0330#
31# To start a Buildkite Agent, run it as:
Louis Dionne4f7f7282022-01-03 20:08:0532# $ docker run --env-file <secrets> -it $(docker build -q libcxx/utils/ci)
Louis Dionne9f21d342020-09-23 13:20:0333#
Louis Dionne9b371f52021-06-21 20:21:3934# The environment variables in `<secrets>` should be the ones necessary
Louis Dionne2eab5852023-03-25 17:55:0435# to run a BuildKite agent:
36#
37# BUILDKITE_AGENT_TOKEN=<token>
Louis Dionne9f21d342020-09-23 13:20:0338#
Louis Dionnec5659dd2021-03-02 17:59:2939# 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.
Louis Dionne9f21d342020-09-23 13:20:0341
Ericf4e3fb52023-11-16 17:52:4642
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
Louis Dionne9f21d342020-09-23 13:20:0347
Louis Dionne738d9812020-11-05 20:13:2748# Make sure apt-get doesn't try to prompt for stuff like our time zone, etc.
49ENV DEBIAN_FRONTEND=noninteractive
50
Ericf4e3fb52023-11-16 17:52:4651# 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
Mark de Weveraf216592024-03-12 16:28:1567# 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
Ericf4e3fb52023-11-16 17:52:4673RUN sudo apt-get update \
74 && sudo apt-get install -y \
Ericf4e3fb52023-11-16 17:52:4675 bash \
Mark de Weverc174d8f2024-04-10 05:55:4576 ccache \
Ericf4e3fb52023-11-16 17:52:4677 curl \
Mark de Weverc174d8f2024-04-10 05:55:4578 gdb \
79 git \
80 gpg \
Ericf4e3fb52023-11-16 17:52:4681 language-pack-en \
82 language-pack-fr \
83 language-pack-ja \
84 language-pack-ru \
85 language-pack-zh-hans \
Mark de Weverc174d8f2024-04-10 05:55:4586 libedit-dev \
87 libncurses5-dev \
88 libpython3-dev \
89 libxml2-dev \
Ericf4e3fb52023-11-16 17:52:4690 lsb-release \
Mark de Weverc174d8f2024-04-10 05:55:4591 make \
92 python3 \
93 python3-dev \
Louis Dionne881dc132024-06-19 15:19:5594 python3-packaging \
Nikolas Klauserf1903432024-06-30 10:14:3795 python3-setuptools \
Mark de Weverc174d8f2024-04-10 05:55:4596 python3-psutil \
Ericf4e3fb52023-11-16 17:52:4697 software-properties-common \
Nikolas Klauserf1903432024-06-30 10:14:3798 swig \
Mark de Weverc174d8f2024-04-10 05:55:4599 unzip \
100 uuid-dev \
101 wget \
Nikolas Klauser9ce895c2024-07-03 14:29:58102 xz-utils \
Ericf4e3fb52023-11-16 17:52:46103 && sudo rm -rf /var/lib/apt/lists/*
104
Louis Dionne2159ed82020-09-29 16:48:44105# Install various tools used by the build or the test suite
Louis Dionne15f179e2023-10-24 12:06:21106#RUN apt-get update && apt-get install -y ninja-build python3 python3-distutils python3-psutil git gdb ccache
Mark de Wevera9ddb772023-03-15 07:07:05107# TODO add ninja-build once 1.11 is available in Ubuntu, also remove the manual installation.
Ericf4e3fb52023-11-16 17:52:46108RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36109 set -e
Ericf4e3fb52023-11-16 17:52:46110 wget -qO /tmp/ninja.gz https://github.com/ninja-build/ninja/releases/latest/download/ninja-linux.zip
111 gunzip /tmp/ninja.gz
112 chmod a+x /tmp/ninja
113 sudo mv /tmp/ninja /usr/local/bin/ninja
114EOF
Louis Dionne2159ed82020-09-29 16:48:44115
Louis Dionne7ecd4d22022-09-12 14:51:07116
Ericf4e3fb52023-11-16 17:52:46117# These two locales are not enabled by default so generate them
118RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36119 set -e
Ericf4e3fb52023-11-16 17:52:46120 printf "fr_CA ISO-8859-1\ncs_CZ ISO-8859-2" | sudo tee -a /etc/locale.gen
121 sudo mkdir /usr/local/share/i1en/
122 printf "fr_CA ISO-8859-1\ncs_CZ ISO-8859-2" | sudo tee -a /usr/local/share/i1en/SUPPORTED
123 sudo locale-gen
124EOF
David Spickettda593762021-10-06 15:05:47125
Louis Dionne8ea2b952021-07-08 16:19:53126# Install Clang <latest>, <latest-1> and ToT, which are the ones we support.
Mark de Wevera7bd1ab2022-05-30 16:34:15127# We also install <latest-2> because we need to support the "latest-1" of the
128# current LLVM release branch, which is effectively the <latest-2> of the
129# tip-of-trunk LLVM. For example, after branching LLVM 14 but before branching
130# LLVM 15, we still need to have Clang 12 in this Docker image because the LLVM
131# 14 release branch CI uses it. The tip-of-trunk CI will never use Clang 12,
132# though.
Ericf4e3fb52023-11-16 17:52:46133RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36134 set -e
Ericf4e3fb52023-11-16 17:52:46135 sudo apt-get update
136 wget https://apt.llvm.org/llvm.sh -O /tmp/llvm.sh
137 chmod +x /tmp/llvm.sh
138 sudo /tmp/llvm.sh $(($LLVM_HEAD_VERSION - 3)) all # for CI transitions
139 sudo /tmp/llvm.sh $(($LLVM_HEAD_VERSION - 2)) all # previous release
140 sudo /tmp/llvm.sh $(($LLVM_HEAD_VERSION - 1)) all # latest release
141 sudo /tmp/llvm.sh $LLVM_HEAD_VERSION all # current ToT
142 sudo apt-get install -y libomp5-$LLVM_HEAD_VERSION
143 sudo rm -rf /var/lib/apt/lists/*
144EOF
Nikolas Klauserf48f9612022-11-25 17:25:05145
Mark de Wevera7bd1ab2022-05-30 16:34:15146# Install the most recent GCC, like clang install the previous version as a transition.
Ericf4e3fb52023-11-16 17:52:46147RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36148 set -e
Nikolas Klauser9ce895c2024-07-03 14:29:58149 sudo git clone https://github.com/compiler-explorer/infra.git /tmp/ce-infra
150 (cd /tmp/ce-infra && sudo make ce)
151 sudo /tmp/ce-infra/bin/ce_install install compilers/c++/x86/gcc $GCC_LATEST_VERSION.1.0
152 sudo /tmp/ce-infra/bin/ce_install install compilers/c++/x86/gcc $((GCC_LATEST_VERSION - 1)).1.0
153 sudo ln -s /opt/compiler-explorer/gcc-$GCC_LATEST_VERSION.1.0/bin/gcc /usr/bin/gcc-$GCC_LATEST_VERSION
154 sudo ln -s /opt/compiler-explorer/gcc-$GCC_LATEST_VERSION.1.0/bin/g++ /usr/bin/g++-$GCC_LATEST_VERSION
155 sudo ln -s /opt/compiler-explorer/gcc-$((GCC_LATEST_VERSION - 1)).1.0/bin/gcc /usr/bin/gcc-$((GCC_LATEST_VERSION - 1))
156 sudo ln -s /opt/compiler-explorer/gcc-$((GCC_LATEST_VERSION - 1)).1.0/bin/g++ /usr/bin/g++-$((GCC_LATEST_VERSION - 1))
157 sudo rm -rf /tmp/ce-infra
Ericf4e3fb52023-11-16 17:52:46158EOF
Louis Dionne8ea2b952021-07-08 16:19:53159
Ericf4e3fb52023-11-16 17:52:46160RUN <<EOF
161 # Install a recent CMake
Ryan Prichardd0c8e262024-07-23 20:28:36162 set -e
Ericf4e3fb52023-11-16 17:52:46163 wget https://github.com/Kitware/CMake/releases/download/v3.21.1/cmake-3.21.1-linux-x86_64.sh -O /tmp/install-cmake.sh
164 sudo bash /tmp/install-cmake.sh --prefix=/usr --exclude-subdir --skip-license
165 rm /tmp/install-cmake.sh
Ericf4e3fb52023-11-16 17:52:46166EOF
Mark de Wevera9ddb772023-03-15 07:07:05167
Ericf4e3fb52023-11-16 17:52:46168# ===----------------------------------------------------------------------===##
Ryan Prichardd0c8e262024-07-23 20:28:36169# Android Builder Base Image
Ericf4e3fb52023-11-16 17:52:46170# ===----------------------------------------------------------------------===##
Mark de Wever3d131f92023-11-08 16:51:27171
Ericf4e3fb52023-11-16 17:52:46172FROM ubuntu:jammy AS android-builder-base
173
174ARG ANDROID_CLANG_VERSION
175ARG ANDROID_CLANG_PREBUILTS_COMMIT
176ARG ANDROID_SYSROOT_BID
177
Ryan Prichardd0c8e262024-07-23 20:28:36178RUN apt-get update && apt-get install -y curl bzip2 git unzip
Ericf4e3fb52023-11-16 17:52:46179
180# Install the Android platform tools (e.g. adb) into /opt/android/sdk.
181RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36182 set -e
Ericf4e3fb52023-11-16 17:52:46183 mkdir -p /opt/android/sdk
184 cd /opt/android/sdk
185 curl -LO https://dl.google.com/android/repository/platform-tools-latest-linux.zip
186 unzip platform-tools-latest-linux.zip
187 rm platform-tools-latest-linux.zip
188EOF
189
190# Install the current Android compiler. Specify the prebuilts commit to retrieve
191# this compiler version even after it's removed from HEAD.
192
193ENV ANDROID_CLANG_VERSION=$ANDROID_CLANG_VERSION
194ENV ANDROID_CLANG_PREBUILTS_COMMIT=$ANDROID_CLANG_PREBUILTS_COMMIT
195RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36196 set -e
Ericf4e3fb52023-11-16 17:52:46197 git clone --filter=blob:none --sparse \
198 https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86 \
199 /opt/android/clang
200 git -C /opt/android/clang checkout ${ANDROID_CLANG_PREBUILTS_COMMIT}
201 git -C /opt/android/clang sparse-checkout add clang-${ANDROID_CLANG_VERSION}
202 rm -fr /opt/android/clang/.git
203 ln -sf /opt/android/clang/clang-${ANDROID_CLANG_VERSION} /opt/android/clang/clang-current
204 # The "git sparse-checkout" and "ln" commands succeed even if nothing was
205 # checked out, so use this "ls" command to fix that.
206 ls /opt/android/clang/clang-current/bin/clang
207EOF
208
209# Install an Android sysroot. New AOSP sysroots are available at
210# https://ci.android.com/builds/branches/aosp-main/grid, the "ndk" target. The
211# NDK also makes its sysroot prebuilt available at
212# https://android.googlesource.com/platform/prebuilts/ndk/+/refs/heads/dev/platform/sysroot.
213
214ENV ANDROID_SYSROOT_BID=$ANDROID_SYSROOT_BID
215RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36216 set -e
Ericf4e3fb52023-11-16 17:52:46217 cd /opt/android
218 curl -L -o ndk_platform.tar.bz2 \
219 https://androidbuildinternal.googleapis.com/android/internal/build/v3/builds/${ANDROID_SYSROOT_BID}/ndk/attempts/latest/artifacts/ndk_platform.tar.bz2/url
220 tar xf ndk_platform.tar.bz2
221 rm ndk_platform.tar.bz2
222EOF
223
Ericf4e3fb52023-11-16 17:52:46224# ===----------------------------------------------------------------------===##
225# Buildkite Builder Image
226# ===----------------------------------------------------------------------===##
227#
228# IMAGE: ghcr.io/libcxx/buildkite-builder.
229#
230FROM builder-base AS buildkite-builder
231
232# Create the libcxx-builder user, regardless of if we use it or not
233RUN sudo useradd --create-home libcxx-builder
234
Louis Dionne2159ed82020-09-29 16:48:44235USER libcxx-builder
236WORKDIR /home/libcxx-builder
Louis Dionne9f21d342020-09-23 13:20:03237
Louis Dionne2159ed82020-09-29 16:48:44238# Install the Buildkite agent and dependencies. This must be done as non-root
239# for the Buildkite agent to be installed in a path where we can find it.
Ericf4e3fb52023-11-16 17:52:46240RUN <<EOF
Ryan Prichardd0c8e262024-07-23 20:28:36241 set -e
Ericf4e3fb52023-11-16 17:52:46242 cd /home/libcxx-builder
243 curl -sL https://raw.githubusercontent.com/buildkite/agent/main/install.sh -o /tmp/install-agent.sh
244 bash /tmp/install-agent.sh
245 rm /tmp/install-agent.sh
246 echo "tags=\"queue=libcxx-builders,arch=$(uname -m),os=linux\"" \
247 >> /home/libcxx-builder/.buildkite-agent/buildkite-agent.cfg
248EOF
Louis Dionne9f21d342020-09-23 13:20:03249
Ericf4e3fb52023-11-16 17:52:46250USER libcxx-builder
251WORKDIR /home/libcxx-builder
252
253ENV PATH="${PATH}:/home/libcxx-builder/.buildkite-agent/bin"
254
Eric601e8fd2023-11-10 13:24:39255CMD ["buildkite-agent", "start"]
Ericf4e3fb52023-11-16 17:52:46256
257# ===----------------------------------------------------------------------===##
258# Android Buildkite Builder Image
259# ===----------------------------------------------------------------------===##
260#
261# IMAGE: ghcr.io/libcxx/android-buildkite-builder.
262#
263FROM buildkite-builder AS android-buildkite-builder
264
265COPY --from=android-builder-base /opt/android /opt/android
266COPY ./vendor/android/container-setup.sh /opt/android/container-setup.sh
267
268ENV PATH="/opt/android/sdk/platform-tools:${PATH}"
269
Ryan Prichardd0c8e262024-07-23 20:28:36270USER root
271
272# Install Docker
273RUN <<EOF
274 set -e
275 curl -fsSL https://get.docker.com -o /tmp/get-docker.sh
276 sh /tmp/get-docker.sh
277 rm /tmp/get-docker.sh
278
279 # Install Docker. Mark the binary setuid so it can be run without prefixing it
280 # with sudo. Adding the container user to the docker group doesn't work because
281 # /var/run/docker.sock is owned by the host's docker GID, not the container's
282 # docker GID.
283 chmod u+s /usr/bin/docker
284EOF
285
Ericf4e3fb52023-11-16 17:52:46286USER libcxx-builder
287WORKDIR /home/libcxx-builder
288
289# Reset the configuration, we pass the configuration via the environment.
290RUN cp /home/libcxx-builder/.buildkite-agent/buildkite-agent.dist.cfg \
291 /home/libcxx-builder/.buildkite-agent/buildkite-agent.cfg
292
293# Modify the Buildkite agent cmdline to do Android setup stuff first.
294CMD /opt/android/container-setup.sh && buildkite-agent start
295
296# ===----------------------------------------------------------------------===##
297# Github Actions Builder Image
298# ===----------------------------------------------------------------------===##
299#
300# IMAGE: ghcr.io/libcxx/actions-builder.
301#
302FROM builder-base AS actions-builder
303
304WORKDIR /home/runner
305USER runner