aboutsummaryrefslogtreecommitdiff
path: root/.ci
diff options
context:
space:
mode:
authorLouis Dionne <ldionne.2@gmail.com>2023-06-12 14:45:48 -0700
committerLouis Dionne <ldionne.2@gmail.com>2023-08-29 13:31:19 -0400
commitcf1a3d93581f4c4698accd4418a15399d8814bb8 (patch)
tree1e2f2b0e58b77033a988486520f8fad461a5da1a /.ci
parent3db5db92d746bad8ba1762ca290a176e25d48565 (diff)
downloadllvm-cf1a3d93581f4c4698accd4418a15399d8814bb8.zip
llvm-cf1a3d93581f4c4698accd4418a15399d8814bb8.tar.gz
llvm-cf1a3d93581f4c4698accd4418a15399d8814bb8.tar.bz2
Implement the monolithic CI pipeline in the monorepo
This basically inlines the logic that was previously located in https://github.com/google/llvm-premerge-checks so it is part of the monorepo. This has the benefit of making it extremely easy for individual projects to understand and modify this logic for their own needs, unlike the current model where this logic lives in a separate non-LLVM repository. It also allows testing changes to the CI configuration using a simple Phabricator review, since the code that defines the CI pipeline is taken from the patch under review. This (or something equivalent) is necessary if we want to retain the current monolithic pre-commit CI throughout the GitHub PR transition. Since triggering the monolithic CI is currently attached to the system we use for triggering CI pipelines from Phabricator, we will lose that part of the CI when we move to GitHub PRs if we don't do anything. I've decided to rewrite the code as a shell script because the logic was fairly simple and it seemed a lot easier than figuring out how to pull only the relevant parts of llvm-premerge-checks into the monorepo. Furthermore, I think we should strive to move away from the monolithic CI altogether since sub-projects should understand, own and maintain the tests that are relevant for them to run in the CI (with LLVM providing the infrastructure). Hence, this is somewhat of a temporary solution until monolithic CI is removed entirely. Differential Revision: https://reviews.llvm.org/D158863
Diffstat (limited to '.ci')
-rwxr-xr-x.ci/generate-buildkite-pipeline-premerge215
-rwxr-xr-x.ci/generate-buildkite-pipeline-scheduled41
-rwxr-xr-x.ci/monolithic-linux.sh50
-rwxr-xr-x.ci/monolithic-windows.sh48
4 files changed, 348 insertions, 6 deletions
diff --git a/.ci/generate-buildkite-pipeline-premerge b/.ci/generate-buildkite-pipeline-premerge
index 6bb1eda..0488597 100755
--- a/.ci/generate-buildkite-pipeline-premerge
+++ b/.ci/generate-buildkite-pipeline-premerge
@@ -14,11 +14,6 @@
# See https://buildkite.com/docs/agent/v3/cli-pipeline#pipeline-format.
#
-if ! git diff --name-only HEAD~1 | grep -q -E "^libcxx/|^libcxxabi/|^libunwind/|^runtimes/|^cmake/|^clang/"; then
- # libcxx/, libcxxabi/, libunwind/, runtimes/, cmake/ or clang/ are not affected
- exit 0
-fi
-
reviewID="$(git log --format=%B -n 1 | sed -nE 's/^Review-ID:[[:space:]]*(.+)$/\1/p')"
if [[ "${reviewID}" != "" ]]; then
buildMessage="https://llvm.org/${reviewID}"
@@ -51,3 +46,213 @@ if git diff --name-only HEAD~1 | grep -q -E "^clang/"; then
branch: "${BUILDKITE_BRANCH}"
EOF
fi
+
+#
+# If we're not running a more specific pipeline, generate a legacy monolithic pipeline
+# based on which subdirectories have been modified. We have some heuristics for this
+# to be reasonable.
+#
+# Individual projects should instead define the pre-commit CI tests that suits their
+# needs while letting them run on the infrastructure provided by LLVM.
+#
+function compute-projects-to-test() {
+ projects=${@}
+ for project in ${projects}; do
+ echo "${project}"
+ case ${project} in
+ lld)
+ for p in bolt cross-project-tests; do
+ echo $p
+ done
+ ;;
+ llvm)
+ for p in bolt clang clang-tools-extra flang lld lldb mlir polly; do
+ echo $p
+ done
+ ;;
+ clang)
+ for p in clang-tools-extra compiler-rt flang libc lldb openmp cross-project-tests; do
+ echo $p
+ done
+ ;;
+ clang-tools-extra)
+ echo libc
+ ;;
+ mlir)
+ echo flang
+ ;;
+ *)
+ # Nothing to do
+ ;;
+ esac
+ done
+}
+
+function add-dependencies() {
+ projects=${@}
+ for project in ${projects}; do
+ echo "${project}"
+ case ${project} in
+ bolt)
+ for p in lld llvm; do
+ echo $p
+ done
+ ;;
+ cross-project-tests)
+ for p in lld clang; do
+ echo $p
+ done
+ ;;
+ clang-tools-extra)
+ for p in llvm clang; do
+ echo $p
+ done
+ ;;
+ compiler-rt|libc|openmp)
+ echo clang
+ ;;
+ flang|lldb)
+ for p in llvm clang; do
+ echo $p
+ done
+ ;;
+ lld|mlir|polly)
+ echo llvm
+ ;;
+ *)
+ # Nothing to do
+ ;;
+ esac
+ done
+}
+
+function exclude-linux() {
+ projects=${@}
+ for project in ${projects}; do
+ case ${project} in
+ cross-project-tests) ;; # tests failing
+ lldb) ;; # tests failing
+ openmp) ;; # https://github.com/google/llvm-premerge-checks/issues/410
+ *)
+ echo "${project}"
+ ;;
+ esac
+ done
+}
+
+function exclude-windows() {
+ projects=${@}
+ for project in ${projects}; do
+ case ${project} in
+ cross-project-tests) ;; # tests failing
+ compiler-rt) ;; # tests taking too long
+ openmp) ;; # TODO: having trouble with the Perl installation
+ libc) ;; # no Windows support
+ lldb) ;; # tests failing
+ bolt) ;; # tests are not supported yet
+ *)
+ echo "${project}"
+ ;;
+ esac
+ done
+}
+
+function keep-modified-projects() {
+ projects=${@}
+ git_diff="$(git diff --name-only HEAD~1)"
+ for project in ${projects}; do
+ if echo "${git_diff}" | grep -q -E "^${project}/"; then
+ echo "${project}"
+ fi
+ done
+}
+
+function check-targets() {
+ projects=${@}
+ for project in ${projects}; do
+ case ${project} in
+ clang-tools-extra)
+ echo "check-clang-tools"
+ ;;
+ compiler-rt)
+ echo "check-all"
+ ;;
+ cross-project-tests)
+ echo "check-cross-project"
+ ;;
+ lldb)
+ echo "check-all" # TODO: check-lldb may not include all the LLDB tests?
+ ;;
+ pstl)
+ echo "check-all"
+ ;;
+ libclc)
+ echo "check-all"
+ ;;
+ *)
+ echo "check-${project}"
+ ;;
+ esac
+ done
+}
+
+# Figure out which projects need to be built on each platform
+all_projects="bolt clang-tools-extra compiler-rt cross-project-tests flang libc libclc lld lldb llvm mlir openmp polly pstl"
+modified_projects="$(keep-modified-projects ${all_projects})"
+
+linux_projects_to_test=$(exclude-linux $(compute-projects-to-test ${modified_projects}))
+linux_check_targets=$(check-targets ${linux_projects_to_test} | sort | uniq)
+linux_projects=$(add-dependencies ${linux_projects_to_test} | sort | uniq)
+
+windows_projects_to_test=$(exclude-windows $(compute-projects-to-test ${modified_projects}))
+windows_check_targets=$(check-targets ${windows_projects_to_test} | sort | uniq)
+windows_projects=$(add-dependencies ${windows_projects_to_test} | sort | uniq)
+
+# Generate the appropriate pipeline
+if [[ "${linux_projects}" != "" ]]; then
+ cat <<EOF
+- label: ':linux: x64 Debian'
+ artifact_paths:
+ - '*_result.json'
+ - 'build/monolithic-linux/test-results.xml'
+ agents:
+ queue: 'linux'
+ retry:
+ automatic:
+ - exit_status: -1 # Agent was lost
+ limit: 2
+ - exit_status: 255
+ limit: 2 # Forced agent shutdown
+ timeout_in_minutes: 120
+ env:
+ CC: 'clang'
+ CXX: 'clang++'
+ commands:
+ - './.ci/monolithic-linux.sh "$(echo ${linux_projects} | tr ' ' ';')" "$(echo ${linux_check_targets})"'
+EOF
+fi
+
+if [[ "${windows_projects}" != "" ]]; then
+ cat <<EOF
+- label: ':windows: x64 Windows'
+ artifact_paths:
+ - '*_result.json'
+ - 'build/monolithic-windows/test-results.xml'
+ agents:
+ queue: 'windows'
+ retry:
+ automatic:
+ - exit_status: -1 # Agent was lost
+ limit: 2
+ - exit_status: 255
+ limit: 2 # Forced agent shutdown
+ timeout_in_minutes: 150
+ env:
+ CC: 'cl'
+ CXX: 'cl'
+ LD: 'link'
+ commands:
+ - 'C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat -arch=amd64 -host_arch=amd64'
+ - 'bash .ci/monolithic-windows.sh "$(echo ${windows_projects} | tr ' ' ';')" "$(echo ${windows_check_targets})"'
+EOF
+fi
diff --git a/.ci/generate-buildkite-pipeline-scheduled b/.ci/generate-buildkite-pipeline-scheduled
index 7fa869f..06607ce 100755
--- a/.ci/generate-buildkite-pipeline-scheduled
+++ b/.ci/generate-buildkite-pipeline-scheduled
@@ -27,4 +27,43 @@ steps:
message: "${BUILDKITE_MESSAGE}"
commit: "${BUILDKITE_COMMIT}"
branch: "${BUILDKITE_BRANCH}"
-EOF
+
+ - label: ':linux: x64 Debian'
+ artifact_paths:
+ - '*_result.json'
+ - 'build/monolithic-linux/test-results.xml'
+ agents:
+ queue: 'linux'
+ retry:
+ automatic:
+ - exit_status: -1 # Agent was lost
+ limit: 2
+ - exit_status: 255
+ limit: 2 # Forced agent shutdown
+ timeout_in_minutes: 120
+ env:
+ CC: 'clang'
+ CXX: 'clang++'
+ commands:
+ - './.ci/monolithic-linux.sh "bolt;clang-tools-extra;compiler-rt;flang;libc;libclc;lld;llvm;mlir;polly;pstl" "check-all"'
+
+ - label: ':windows: x64 Windows'
+ artifact_paths:
+ - '*_result.json'
+ - 'build/monolithic-windows/test-results.xml'
+ agents:
+ queue: 'windows'
+ retry:
+ automatic:
+ - exit_status: -1 # Agent was lost
+ limit: 2
+ - exit_status: 255
+ limit: 2 # Forced agent shutdown
+ timeout_in_minutes: 150
+ env:
+ CC: 'cl'
+ CXX: 'cl'
+ LD: 'link'
+ commands:
+ - 'C:\\BuildTools\\Common7\\Tools\\VsDevCmd.bat -arch=amd64 -host_arch=amd64'
+ - 'bash .ci/monolithic-windows.sh "clang-tools-extra;flang;libclc;lld;llvm;mlir;polly;pstl" "check-all"'
diff --git a/.ci/monolithic-linux.sh b/.ci/monolithic-linux.sh
new file mode 100755
index 0000000..9054d70
--- /dev/null
+++ b/.ci/monolithic-linux.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+#===----------------------------------------------------------------------===##
+#
+# 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 script performs a monolithic build of the monorepo and runs the tests of
+# most projects on Linux. This should be replaced by per-project scripts that
+# run only the relevant tests.
+#
+
+set -ex
+set -o pipefail
+
+MONOREPO_ROOT="${MONOREPO_ROOT:="$(git rev-parse --show-toplevel)"}"
+BUILD_DIR="${BUILD_DIR:=${MONOREPO_ROOT}/build/monolithic-linux}"
+
+rm -rf ${BUILD_DIR}
+
+ccache --zero-stats
+ccache --show-config
+function show-stats {
+ ccache --print-stats
+}
+trap show-stats EXIT
+
+projects="${1}"
+targets="${2}"
+
+echo "--- cmake"
+pip install -q -r ${MONOREPO_ROOT}/mlir/python/requirements.txt
+cmake -S ${MONOREPO_ROOT}/llvm -B ${BUILD_DIR} \
+ -D LLVM_ENABLE_PROJECTS="${projects}" \
+ -G Ninja \
+ -D CMAKE_BUILD_TYPE=Release \
+ -D LLVM_ENABLE_ASSERTIONS=ON \
+ -D LLVM_BUILD_EXAMPLES=ON \
+ -D COMPILER_RT_BUILD_LIBFUZZER=OFF \
+ -D LLVM_LIT_ARGS="-v --xunit-xml-output ${BUILD_DIR}/test-results.xml" \
+ -D LLVM_ENABLE_LLD=ON \
+ -D CMAKE_CXX_FLAGS=-gmlt \
+ -D BOLT_CLANG_EXE=/usr/bin/clang \
+ -D LLVM_CCACHE_BUILD=ON
+
+echo "--- ninja"
+ninja -C ${BUILD_DIR} ${targets}
diff --git a/.ci/monolithic-windows.sh b/.ci/monolithic-windows.sh
new file mode 100755
index 0000000..da15f7c
--- /dev/null
+++ b/.ci/monolithic-windows.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+#===----------------------------------------------------------------------===##
+#
+# 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 script performs a monolithic build of the monorepo and runs the tests of
+# most projects on Windows. This should be replaced by per-project scripts that
+# run only the relevant tests.
+#
+
+set -ex
+set -o pipefail
+
+MONOREPO_ROOT="${MONOREPO_ROOT:="$(git rev-parse --show-toplevel)"}"
+BUILD_DIR="${BUILD_DIR:=${MONOREPO_ROOT}/build/monolithic-windows}"
+
+rm -rf ${BUILD_DIR}
+
+sccache --zero-stats
+function show-stats {
+ sccache --show-stats
+}
+trap show-stats EXIT
+
+projects="${1}"
+targets="${2}"
+
+echo "--- cmake"
+pip install -q -r ${MONOREPO_ROOT}/mlir/python/requirements.txt
+cmake -S ${MONOREPO_ROOT}/llvm -B ${BUILD_DIR} \
+ -D LLVM_ENABLE_PROJECTS="${projects}" \
+ -G Ninja \
+ -D CMAKE_BUILD_TYPE=Release \
+ -D LLVM_ENABLE_ASSERTIONS=ON \
+ -D LLVM_BUILD_EXAMPLES=ON \
+ -D COMPILER_RT_BUILD_LIBFUZZER=OFF \
+ -D LLVM_LIT_ARGS="-v --xunit-xml-output ${BUILD_DIR}/test-results.xml" \
+ -D COMPILER_RT_BUILD_ORC=OFF \
+ -D CMAKE_C_COMPILER_LAUNCHER=sccache \
+ -D CMAKE_CXX_COMPILER_LAUNCHER=sccache
+
+echo "--- ninja"
+ninja -C ${BUILD_DIR} ${targets}