mongo/evergreen/streams_image_build_and_push.sh
Jada Lilleboe 84e5faf941 SERVER-126777 Add linting to ASPIO directory (#53861)
GitOrigin-RevId: 699992b81f3a4d43472610f255677198015bcef0
2026-05-20 16:25:54 +00:00

189 lines
5.5 KiB
Bash

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
. "$DIR/prelude.sh"
set -o errexit
set -o pipefail
# Variant: streams_image_build_and_push_sanitizer.sh. Keep in sync.
REGISTRY="664315256653.dkr.ecr.us-east-1.amazonaws.com"
REPO="${streams_ecr_repo:-mongo/mongostream-testing}"
IMAGE="$REGISTRY/$REPO"
GITSHA="$github_commit"
ARCH="$packager_arch"
DISTRO="$packager_distro"
PATCH="$is_patch"
if [ "$ARCH" == "aarch64" ]; then
ARCH="arm64"
fi
if [ "$ARCH" == "x86_64" ]; then
ARCH="amd64"
fi
TAG_SUFFIX="$ARCH"
if [ "$DISTRO" == "amazon2023" ]; then
TAG_SUFFIX="$ARCH-al2023"
fi
# Optional variant-specific suffix to avoid ECR tag collisions when multiple
# variants run streams_build_and_push with the same arch/distro/patch.
if [ -n "$streams_variant_tag" ]; then
TAG_SUFFIX="$TAG_SUFFIX$streams_variant_tag"
fi
if [ "$PATCH" ]; then
TAG_SUFFIX="$TAG_SUFFIX-$revision_order_id"
fi
cd src
if [ "$DISTRO" != "amazon2023" ]; then
echo "Skipping Docker build for distro: $DISTRO"
bash "$DIR/bazel_compile.sh"
mkdir -p ./dist-test/bin
cp -L ./bazel-bin/src/mongo/db/mongod ./dist-test/bin/mongod
cp -L ./bazel-bin/src/mongo/shell/mongo ./dist-test/bin/mongo
cp -L ./bazel-bin/src/mongo/s/mongos ./dist-test/bin/mongos
mkdir -p ./dist-test/bin/x509
cp -L ./bazel-bin/x509/*.pem ./dist-test/bin/x509/
tar -czvf streams-binaries.tgz dist-test/
exit 0
fi
SRC_DIR="$(pwd)"
LOGS_DIR="${workdir}/parallel_build_logs"
mkdir -p "$LOGS_DIR"
wait_for_job() {
local pid=$1
local name=$2
local log_file=$3
if ! wait "$pid"; then
echo "=== $name FAILED ==="
cat "$log_file"
exit 1
fi
echo "=== $name completed ==="
}
# Start bazel and venv first — they don't need the system deps.
if [ ! -f "$SRC_DIR/bazel-bin/src/mongo/db/mongod" ]; then
cd "$workdir"
bash "$DIR/bazel_compile.sh" >"$LOGS_DIR/bazel.log" 2>&1 &
BAZEL_PID=$!
cd "$SRC_DIR"
fi
cd "$workdir"
FORCE_CREATE=true bash "$DIR/functions/venv_setup.sh" >"$LOGS_DIR/venv.log" 2>&1 &
VENV_PID=$!
cd "$SRC_DIR"
# Install system deps for maven/js engine (runs in parallel with bazel/venv).
# If you update this Java version, also update <java.version> in aspio/pom.xml and
# java-17-amazon-corretto-devel in evergreen/streams_aspio_lint.sh and
# evergreen/streams_image_build_and_push_sanitizer.sh
if ! command -v javac >/dev/null 2>&1; then
sudo dnf -y install java-17-amazon-corretto-devel wget unzip
fi
# Ensure externaljs dir exists for Docker COPY even if JS engine build hasn't finished.
mkdir -p "$SRC_DIR/externaljs"
bash "$DIR/streams_build_aspio.sh" \
--aspio-dir "$SRC_DIR/src/mongo/db/modules/enterprise/src/streams/aspio" \
--tools-dir "$SRC_DIR/streams_build_tools" \
--output-dir "$SRC_DIR" \
>"$LOGS_DIR/maven.log" 2>&1 &
MAVEN_PID=$!
sudo bash "$DIR/streams_build_js_engine.sh" \
--node-version 24 \
--build-dir "$SRC_DIR/asp-js-engine" \
--target-dir "$SRC_DIR/externaljs" \
>"$LOGS_DIR/jsengine.log" 2>&1 &
JSENGINE_PID=$!
if [ -n "${BAZEL_PID:-}" ]; then
wait_for_job $BAZEL_PID "Bazel compile" "$LOGS_DIR/bazel.log"
fi
wait_for_job $MAVEN_PID "Maven build" "$LOGS_DIR/maven.log"
wait_for_job $JSENGINE_PID "JS engine build" "$LOGS_DIR/jsengine.log"
wait_for_job $VENV_PID "Full venv setup" "$LOGS_DIR/venv.log"
mkdir -p ./dist-test/bin
cp -L ./bazel-bin/src/mongo/db/mongod ./dist-test/bin/mongod
cp -L ./bazel-bin/src/mongo/shell/mongo ./dist-test/bin/mongo
cp -L ./bazel-bin/src/mongo/s/mongos ./dist-test/bin/mongos
mkdir -p ./dist-test/bin/x509
cp -L ./bazel-bin/x509/*.pem ./dist-test/bin/x509/
attempts=0
max_attempts=4
if [ "$1" == "--push" ]; then
while ! aws ecr get-login-password --region us-east-1 | docker login --password-stdin --username AWS $REGISTRY; do
[ "$attempts" -ge "$max_attempts" ] && exit 1
((attempts++))
sleep 10
done
fi
mkdir -p ./bin
cp ./dist-test/bin/mongod ./bin/mongod
cp ./dist-test/bin/mongo ./bin/mongo
# Build docker build args array
BUILD_ARGS=(--build-arg "BUILD_VERSION=$GITSHA-$TAG_SUFFIX")
BUILD_ARGS+=(--build-arg "ASPIO_JAR_PATH=aspio.jar")
BUILD_ARGS+=(--build-arg "EXTERNALJS_PATH=externaljs")
docker build "${BUILD_ARGS[@]}" -t "$IMAGE" -f ./src/mongo/db/modules/enterprise/src/streams/build/Dockerfile.al2023 .
docker tag "$IMAGE" "$IMAGE:$GITSHA-$TAG_SUFFIX"
docker images
# Export image tag for downstream test tasks to pull from ECR
FULL_IMAGE_TAG="$IMAGE:$GITSHA-$TAG_SUFFIX"
echo "$FULL_IMAGE_TAG" >streams-image-tag.txt
echo "Exported image tag: $FULL_IMAGE_TAG"
tar -czvf streams-binaries.tgz dist-test/
echo "Created streams-binaries.tgz containing:"
tar -tzvf streams-binaries.tgz
if [ "$1" == "--push" ]; then
docker push "$FULL_IMAGE_TAG"
# Only the amd64 build creates the multi-arch manifest
if [ "$ARCH" != "amd64" ] || [ -n "${streams_variant_tag:-}" ]; then
exit 0
fi
# Create and push a docker manifest so the image can be pulled without
# specifying the architecture tag explicitly.
MANIFEST_SUFFIX=""
if [ "$DISTRO" == "amazon2023" ]; then
MANIFEST_SUFFIX="-al2023"
fi
if [ "$PATCH" ]; then
MANIFEST_SUFFIX="$MANIFEST_SUFFIX-$revision_order_id"
fi
MANIFEST_TAG="$IMAGE:$GITSHA$MANIFEST_SUFFIX"
docker manifest create "$MANIFEST_TAG" \
"$IMAGE:$GITSHA-amd64$MANIFEST_SUFFIX"
docker manifest annotate "$MANIFEST_TAG" \
"$IMAGE:$GITSHA-amd64$MANIFEST_SUFFIX" --os linux --arch amd64
docker manifest push "$MANIFEST_TAG"
fi