mirror of https://github.com/mongodb/mongo
SERVER-96986 Added MongoT support to Bazel Compile Evergreen Task (#32210)
GitOrigin-RevId: 2bc6a12fb659a135dda15351b2277f70d4e80818
This commit is contained in:
parent
f15140093d
commit
254cb93755
1
.bazelrc
1
.bazelrc
|
|
@ -97,6 +97,7 @@ common --flag_alias=use_sasl_client=//bazel/config:use_sasl_client
|
||||||
common --flag_alias=enterprise_feature_all=//bazel/config:enterprise_feature_all
|
common --flag_alias=enterprise_feature_all=//bazel/config:enterprise_feature_all
|
||||||
common --flag_alias=link_timeout=//bazel/config:link_timeout
|
common --flag_alias=link_timeout=//bazel/config:link_timeout
|
||||||
common --flag_alias=compress_debug_compile=//bazel/config:compress_debug_compile
|
common --flag_alias=compress_debug_compile=//bazel/config:compress_debug_compile
|
||||||
|
common --flag_alias=include_mongot=//bazel/config:include_mongot
|
||||||
|
|
||||||
common --flag_alias=dwarf_version=//bazel/config:dwarf_version
|
common --flag_alias=dwarf_version=//bazel/config:dwarf_version
|
||||||
common --flag_alias=http_client=//bazel/config:http_client
|
common --flag_alias=http_client=//bazel/config:http_client
|
||||||
|
|
|
||||||
15
BUILD.bazel
15
BUILD.bazel
|
|
@ -4,6 +4,7 @@ load("//bazel/toolchains:mongo_toolchain.bzl", "setup_mongo_toolchain_aliases")
|
||||||
load("//bazel/config:render_template.bzl", "render_template")
|
load("//bazel/config:render_template.bzl", "render_template")
|
||||||
load("@npm//:eslint/package_json.bzl", eslint_bin = "bin")
|
load("@npm//:eslint/package_json.bzl", eslint_bin = "bin")
|
||||||
load("@aspect_rules_js//js:defs.bzl", "js_library")
|
load("@aspect_rules_js//js:defs.bzl", "js_library")
|
||||||
|
load("@aspect_bazel_lib//lib:copy_to_directory.bzl", "copy_to_directory")
|
||||||
|
|
||||||
package(
|
package(
|
||||||
default_visibility = ["//visibility:public"],
|
default_visibility = ["//visibility:public"],
|
||||||
|
|
@ -142,6 +143,17 @@ mongo_install(
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
copy_to_directory(
|
||||||
|
name = "mongot_folder",
|
||||||
|
srcs = ["@mongot_localdev//:mongot_binaries"],
|
||||||
|
out = "mongot-localdev",
|
||||||
|
include_external_repositories = ["mongot_localdev"],
|
||||||
|
tags = [
|
||||||
|
"local",
|
||||||
|
"no-cache",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
mongo_install(
|
mongo_install(
|
||||||
name = "dist-test",
|
name = "dist-test",
|
||||||
srcs = [
|
srcs = [
|
||||||
|
|
@ -159,6 +171,9 @@ mongo_install(
|
||||||
] + select({
|
] + select({
|
||||||
"@platforms//os:windows": ["@windows_sasl//:bins"],
|
"@platforms//os:windows": ["@windows_sasl//:bins"],
|
||||||
"//conditions:default": [],
|
"//conditions:default": [],
|
||||||
|
}) + select({
|
||||||
|
"//bazel/config:include_mongot_enabled": ["//:mongot_folder"],
|
||||||
|
"//conditions:default": [],
|
||||||
}),
|
}),
|
||||||
deps = [
|
deps = [
|
||||||
"//src/mongo/db/modules/enterprise:dist-test",
|
"//src/mongo/db/modules/enterprise:dist-test",
|
||||||
|
|
|
||||||
|
|
@ -46,9 +46,9 @@ http_archive(
|
||||||
# aspect_rules_lint depends on aspect_bazel_lib.
|
# aspect_rules_lint depends on aspect_bazel_lib.
|
||||||
http_archive(
|
http_archive(
|
||||||
name = "aspect_bazel_lib",
|
name = "aspect_bazel_lib",
|
||||||
sha256 = "6d758a8f646ecee7a3e294fbe4386daafbe0e5966723009c290d493f227c390b",
|
sha256 = "57a777c5d4d0b79ad675995ee20fc1d6d2514a1ef3000d98f5c70cf0c09458a3",
|
||||||
strip_prefix = "bazel-lib-2.7.7",
|
strip_prefix = "bazel-lib-2.13.0",
|
||||||
url = "https://github.com/aspect-build/bazel-lib/releases/download/v2.7.7/bazel-lib-v2.7.7.tar.gz",
|
url = "https://github.com/bazel-contrib/bazel-lib/releases/download/v2.13.0/bazel-lib-v2.13.0.tar.gz",
|
||||||
)
|
)
|
||||||
|
|
||||||
load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies")
|
load("@aspect_bazel_lib//lib:repositories.bzl", "aspect_bazel_lib_dependencies")
|
||||||
|
|
@ -353,3 +353,16 @@ setup_pigz(
|
||||||
load("//bazel/format:shfmt.bzl", "shfmt")
|
load("//bazel/format:shfmt.bzl", "shfmt")
|
||||||
|
|
||||||
shfmt()
|
shfmt()
|
||||||
|
|
||||||
|
# This repository is normally created by db-contrib-tool or manually extracting the binaries at the proper location
|
||||||
|
new_local_repository(
|
||||||
|
name = "mongot_localdev",
|
||||||
|
build_file_content = """
|
||||||
|
package(default_visibility = ["//visibility:public"])
|
||||||
|
filegroup(
|
||||||
|
name = "mongot_binaries",
|
||||||
|
srcs = glob(["**"], exclude = ["BUILD.bazel", "WORKSPACE"]),
|
||||||
|
)
|
||||||
|
""",
|
||||||
|
path = "mongot-localdev",
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ load(
|
||||||
"fsan",
|
"fsan",
|
||||||
"gcov",
|
"gcov",
|
||||||
"http_client",
|
"http_client",
|
||||||
|
"include_mongot",
|
||||||
"js_engine",
|
"js_engine",
|
||||||
"libunwind",
|
"libunwind",
|
||||||
"linker",
|
"linker",
|
||||||
|
|
@ -946,6 +947,22 @@ config_setting(
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# --------------------------------------
|
||||||
|
# Include MongoT options
|
||||||
|
# --------------------------------------
|
||||||
|
|
||||||
|
include_mongot(
|
||||||
|
name = "include_mongot",
|
||||||
|
build_setting_default = False,
|
||||||
|
)
|
||||||
|
|
||||||
|
config_setting(
|
||||||
|
name = "include_mongot_enabled",
|
||||||
|
flag_values = {
|
||||||
|
"//bazel/config:include_mongot": "True",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
# allocator options
|
# allocator options
|
||||||
# --------------------------------------
|
# --------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,17 @@ spider_monkey_dbg = rule(
|
||||||
build_setting = config.bool(flag = True),
|
build_setting = config.bool(flag = True),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# =========
|
||||||
|
# include_mongot
|
||||||
|
# =========
|
||||||
|
|
||||||
|
include_mongot_provider = provider(doc = "Enable including mongot in the final binary archive from a local mongot-localdev folder.", fields = ["enabled"])
|
||||||
|
|
||||||
|
include_mongot = rule(
|
||||||
|
implementation = lambda ctx: include_mongot_provider(enabled = ctx.build_setting_value),
|
||||||
|
build_setting = config.bool(flag = True),
|
||||||
|
)
|
||||||
|
|
||||||
# =========
|
# =========
|
||||||
# allocator
|
# allocator
|
||||||
# =========
|
# =========
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,23 @@ def check_debug(ctx, basename):
|
||||||
ctx.fail("Unknown OS")
|
ctx.fail("Unknown OS")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def sort_file(ctx, file, install_dir, file_map):
|
def declare_output(ctx, output, is_directory):
|
||||||
|
"""Declare an output as either a file or directory
|
||||||
|
|
||||||
|
Args:
|
||||||
|
ctx: rule ctx
|
||||||
|
output: output file to declare
|
||||||
|
is_directory: determines if the file is a directory
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
File object representing output
|
||||||
|
"""
|
||||||
|
if is_directory:
|
||||||
|
return ctx.actions.declare_directory(output)
|
||||||
|
else:
|
||||||
|
return ctx.actions.declare_file(output)
|
||||||
|
|
||||||
|
def sort_file(ctx, file, install_dir, file_map, is_directory):
|
||||||
"""Determine location a file should be installed to
|
"""Determine location a file should be installed to
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
@ -79,6 +95,7 @@ def sort_file(ctx, file, install_dir, file_map):
|
||||||
file: file to sort
|
file: file to sort
|
||||||
install_dir: the directory to install to
|
install_dir: the directory to install to
|
||||||
file_map: dict containing specific file designations
|
file_map: dict containing specific file designations
|
||||||
|
is_directory: determines if the file is a directory
|
||||||
|
|
||||||
"""
|
"""
|
||||||
_, macos_constraint, _ = get_constraints(ctx)
|
_, macos_constraint, _ = get_constraints(ctx)
|
||||||
|
|
@ -89,22 +106,16 @@ def sort_file(ctx, file, install_dir, file_map):
|
||||||
if check_binary(ctx, basename):
|
if check_binary(ctx, basename):
|
||||||
if not check_debug(ctx, basename):
|
if not check_debug(ctx, basename):
|
||||||
if ctx.attr.debug != "debug":
|
if ctx.attr.debug != "debug":
|
||||||
file_map["binaries"][file] = ctx.actions.declare_file(bin_install)
|
file_map["binaries"][file] = declare_output(ctx, bin_install, is_directory)
|
||||||
elif ctx.attr.debug != "stripped":
|
elif ctx.attr.debug != "stripped":
|
||||||
if ctx.target_platform_has_constraint(macos_constraint):
|
file_map["binaries_debug"][file] = declare_output(ctx, bin_install, is_directory)
|
||||||
file_map["binaries_debug"][file] = ctx.actions.declare_directory(bin_install)
|
|
||||||
else:
|
|
||||||
file_map["binaries_debug"][file] = ctx.actions.declare_file(bin_install)
|
|
||||||
|
|
||||||
elif not check_debug(ctx, basename):
|
elif not check_debug(ctx, basename):
|
||||||
if ctx.attr.debug != "debug":
|
if ctx.attr.debug != "debug":
|
||||||
file_map["dynamic_libs"][file] = ctx.actions.declare_file(lib_install)
|
file_map["dynamic_libs"][file] = declare_output(ctx, lib_install, is_directory)
|
||||||
|
|
||||||
elif ctx.attr.debug != "stripped":
|
elif ctx.attr.debug != "stripped":
|
||||||
if ctx.target_platform_has_constraint(macos_constraint):
|
file_map["dynamic_libs_debug"][file] = declare_output(ctx, lib_install, is_directory)
|
||||||
file_map["dynamic_libs_debug"][file] = ctx.actions.declare_directory(lib_install)
|
|
||||||
else:
|
|
||||||
file_map["dynamic_libs_debug"][file] = ctx.actions.declare_file(lib_install)
|
|
||||||
|
|
||||||
def mongo_install_rule_impl(ctx):
|
def mongo_install_rule_impl(ctx):
|
||||||
"""Perform install actions
|
"""Perform install actions
|
||||||
|
|
@ -130,16 +141,18 @@ def mongo_install_rule_impl(ctx):
|
||||||
# sort direct sources
|
# sort direct sources
|
||||||
for input_bin in ctx.attr.srcs:
|
for input_bin in ctx.attr.srcs:
|
||||||
for bin in input_bin.files.to_list():
|
for bin in input_bin.files.to_list():
|
||||||
sort_file(ctx, bin.path, install_dir, file_map)
|
sort_file(ctx, bin.path, install_dir, file_map, bin.is_directory)
|
||||||
|
|
||||||
# sort dependency install files
|
# sort dependency install files
|
||||||
for dep in ctx.attr.deps:
|
for dep in ctx.attr.deps:
|
||||||
|
# Create a map of filename to if its a directory, ie. { coolfolder: True, coolfile: False } as the json loses that info
|
||||||
|
file_directory_map = {file_dep.basename: file_dep.is_directory for file_dep in dep[DefaultInfo].files.to_list()}
|
||||||
src_map = json.decode(dep[MongoInstallInfo].src_map.to_list()[0])
|
src_map = json.decode(dep[MongoInstallInfo].src_map.to_list()[0])
|
||||||
files = []
|
files = []
|
||||||
for key in src_map:
|
for key in src_map:
|
||||||
files.extend(src_map[key])
|
files.extend(src_map[key])
|
||||||
for file in files:
|
for file in files:
|
||||||
sort_file(ctx, file, install_dir, file_map)
|
sort_file(ctx, file, install_dir, file_map, file_directory_map[file.split("/")[-1]])
|
||||||
|
|
||||||
# aggregate based on type of installs
|
# aggregate based on type of installs
|
||||||
if ctx.attr.debug == "stripped":
|
if ctx.attr.debug == "stripped":
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,8 @@ def install(src, install_type):
|
||||||
dest_dir = os.path.dirname(os.path.join(root, name)).replace(
|
dest_dir = os.path.dirname(os.path.join(root, name)).replace(
|
||||||
src, dst
|
src, dst
|
||||||
)
|
)
|
||||||
os.makedirs(dest_dir)
|
if not os.path.exists(dest_dir):
|
||||||
|
os.makedirs(dest_dir)
|
||||||
os.link(os.path.join(root, name), os.path.join(dest_dir, name))
|
os.link(os.path.join(root, name), os.path.join(dest_dir, name))
|
||||||
else:
|
else:
|
||||||
os.link(src, dst)
|
os.link(src, dst)
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,79 @@ cd src
|
||||||
set -o errexit
|
set -o errexit
|
||||||
set -o verbose
|
set -o verbose
|
||||||
|
|
||||||
|
activate_venv
|
||||||
|
|
||||||
|
# if build_patch_id is passed, try to download binaries from specified
|
||||||
|
# evergreen patch.
|
||||||
|
build_patch_id="${build_patch_id:-${reuse_compile_from}}"
|
||||||
|
if [ -n "${build_patch_id}" ]; then
|
||||||
|
echo "build_patch_id detected, trying to skip task"
|
||||||
|
if [ "${task_name}" = "compile_dist_test" ] || [ "${task_name}" = "compile_dist_test_half" ]; then
|
||||||
|
echo "Skipping ${task_name} compile without downloading any files"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# On windows we change the extension to zip
|
||||||
|
if [ -z "${ext}" ]; then
|
||||||
|
ext="tgz"
|
||||||
|
fi
|
||||||
|
|
||||||
|
extra_db_contrib_args=""
|
||||||
|
|
||||||
|
# get the platform of the dist archive. This is needed if
|
||||||
|
# db-contrib-tool cannot autodetect the platform of the ec2 instance.
|
||||||
|
regex='MONGO_DISTMOD=([a-z0-9]*)'
|
||||||
|
if [[ ${compile_flags} =~ ${regex} ]]; then
|
||||||
|
extra_db_contrib_args="${extra_db_contrib_args} --platform=${BASH_REMATCH[1]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
download_dir="./tmp_db_contrib_tool_download_dir"
|
||||||
|
rm -rf ${download_dir}
|
||||||
|
|
||||||
|
if [ "${task_name}" = "compile_dist_test" ]; then
|
||||||
|
file_name="mongodb-binaries.${ext}"
|
||||||
|
invocation="db-contrib-tool setup-repro-env ${build_patch_id} \
|
||||||
|
--variant=${compile_variant} --extractDownloads=False \
|
||||||
|
--binariesName=${file_name} --installDir=${download_dir} ${extra_db_contrib_args}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${task_name}" = "archive_dist_test_debug" ]; then
|
||||||
|
file_name="mongo-debugsymbols.${ext}"
|
||||||
|
invocation="db-contrib-tool setup-repro-env ${build_patch_id} \
|
||||||
|
--variant=${compile_variant} --extractDownloads=False \
|
||||||
|
--debugsymbolsName=${file_name} --installDir=${download_dir} \
|
||||||
|
--skipBinaries --downloadSymbols ${extra_db_contrib_args}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "${invocation}" ]; then
|
||||||
|
setup_db_contrib_tool
|
||||||
|
|
||||||
|
echo "db-contrib-tool invocation: ${invocation}"
|
||||||
|
eval ${invocation}
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Could not retrieve files with db-contrib-tool"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
file_location=$(find "${download_dir}" -name "${file_name}")
|
||||||
|
echo "Downloaded: ${file_location}"
|
||||||
|
mv "${file_location}" "${file_name}"
|
||||||
|
echo "Moved ${file_name} to the correct location"
|
||||||
|
echo "Skipping ${task_name} compile"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Could not skip ${task_name} compile, compiling as normal"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --build-mongot is a compile flag used by the evergreen build variants that run end-to-end search
|
||||||
|
# suites, as it downloads the necessary mongot binary.
|
||||||
|
if [ "${build_mongot}" = "true" ]; then
|
||||||
|
setup_db_contrib_tool
|
||||||
|
use_db_contrib_tool_mongot
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
# Use `eval` to force evaluation of the environment variables in the echo statement:
|
# Use `eval` to force evaluation of the environment variables in the echo statement:
|
||||||
eval echo "Execution environment: Targets: ${targets}"
|
eval echo "Execution environment: Targets: ${targets}"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,3 +17,56 @@ function setup_db_contrib_tool {
|
||||||
|
|
||||||
timeout_and_retry 180 python -m pipx install -vv --force "db-contrib-tool==0.8.5" --pip-args="--no-cache-dir"
|
timeout_and_retry 180 python -m pipx install -vv --force "db-contrib-tool==0.8.5" --pip-args="--no-cache-dir"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function use_db_contrib_tool_mongot {
|
||||||
|
# Checking that this is not a downstream patch on mongod created by mongot's patch trigger.
|
||||||
|
# In the case that it's not, download latest (eg HEAD of 10gen/mongot) or the
|
||||||
|
# release (eg currently running in production on Atlas) mongot binary.
|
||||||
|
arch=$(uname -i)
|
||||||
|
if [[ ! $(declare -p linux_x86_64_mongot_localdev_binary linux_aarch64_mongot_localdev_binary macos_x86_64_mongot_localdev_binary 2> /dev/null) ]]; then
|
||||||
|
|
||||||
|
if [ "${download_mongot_release}" = "true" ]; then
|
||||||
|
mongot_version="release"
|
||||||
|
else
|
||||||
|
mongot_version="latest"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||||
|
mongot_platform="linux"
|
||||||
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
mongot_platform="macos"
|
||||||
|
else
|
||||||
|
echo "mongot is only supported on linux and mac and does not support ${OSTYPE}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mongot_arch="x86_64"
|
||||||
|
# macos arm64 is not supported by mongot, but macos x86_64 runs on it successfully
|
||||||
|
if [[ $arch == "aarch64"* ]] && [[ "$OSTYPE" != "darwin"* ]]; then
|
||||||
|
mongot_arch="aarch64"
|
||||||
|
fi
|
||||||
|
echo "running: db-contrib-tool setup-mongot-repro-env ${mongot_version} --platform=${mongot_platform} --architecture=${mongot_arch} --installDir=."
|
||||||
|
# This should create the folder mongot-localdev, usually run at the root of mongo directory
|
||||||
|
db-contrib-tool setup-mongot-repro-env ${mongot_version} --platform=${mongot_platform} --architecture=${mongot_arch} --installDir=.
|
||||||
|
else
|
||||||
|
# This is a downstream patch, which means there is a patched mongot binary we need to install.
|
||||||
|
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
|
||||||
|
if [[ $arch == "x86_64"* ]]; then
|
||||||
|
mongot_url=${linux_x86_64_mongot_localdev_binary}
|
||||||
|
elif [[ $arch == "aarch64"* ]]; then
|
||||||
|
mongot_url=${linux_aarch64_mongot_localdev_binary}
|
||||||
|
else
|
||||||
|
echo "mongot-localdev does not support ${arch}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
elif [[ "$OSTYPE" == "darwin"* ]]; then
|
||||||
|
mongot_url=${macos_x86_64_mongot_localdev_binary}
|
||||||
|
else
|
||||||
|
echo "mongot-localdev does not support ${OSTYPE}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "running curl ${mongot_url} | tar xvz"
|
||||||
|
# This should create the folder mongot-localdev, usually run at the root of mongo directory
|
||||||
|
curl ${mongot_url} | tar xvz
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue