blob: e3de34bddad92259037a6d3b70527ffaa3e6c7cb [file]
#!/usr/bin/env bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# One command to (re)build the storm-local Docker image from the CURRENT source.
#
# Why this exists: the binary distribution puts the daemon classpath in `lib`
# (from final-package's Maven deps) but the WORKER classpath in `lib-worker`
# (copied via a fileSet from the storm-client-bin module's target dir). Building
# only `final-package -am` refreshes `lib` but leaves `lib-worker` stale, so
# workers keep running old code. This script rebuilds BOTH storm-client-bin and
# final-package (with -am to refresh their Maven deps), so the tarball -- and the
# image built from it -- reflect the current source on every classpath.
#
# As a final step it also runs prepare-extlib.sh (the extlib-daemon jars that
# docker-compose mounts onto Nimbus), so a single command sets up everything.
# Pass --no-extlib (or set PREPARE_EXTLIB=0) to skip that step.
set -euo pipefail
PREPARE_EXTLIB="${PREPARE_EXTLIB:-1}"
for arg in "$@"; do
case "${arg}" in
--no-extlib) PREPARE_EXTLIB=0 ;;
-h|--help)
echo "usage: $0 [--no-extlib]"
echo " --no-extlib skip running prepare-extlib.sh after the image build"
exit 0
;;
*) echo "error: unknown argument: ${arg}" >&2; echo "usage: $0 [--no-extlib]" >&2; exit 2 ;;
esac
done
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${HERE}/../.." && pwd)"
# Single source of truth: the project version in the repo root pom.xml. (The
# pom's own <version> child, not the <parent> version.) Override with STORM_VERSION.
POM_VERSION="$(python3 -c "import xml.etree.ElementTree as ET; ns={'m':'http://maven.apache.org/POM/4.0.0'}; print(ET.parse('${REPO_ROOT}/pom.xml').getroot().find('m:version', ns).text)")"
VERSION="${STORM_VERSION:-${POM_VERSION}}"
IMAGE="${IMAGE:-storm-local:${VERSION}}"
TARBALL="${REPO_ROOT}/storm-dist/binary/final-package/target/apache-storm-${VERSION}.tar.gz"
# Keep docker-compose's .env in sync so the image tag / build arg / jar path match.
printf '# Auto-generated by build-image.sh from the repo root pom.xml.\nSTORM_VERSION=%s\n' "${VERSION}" > "${HERE}/.env"
echo "==> Storm version: ${VERSION} (from pom.xml; wrote ${HERE}/.env)"
cd "${REPO_ROOT}"
echo "==> [1/2] Building distribution (storm-client-bin + final-package, current source)"
mvn -q clean install -DskipTests -Pdist -Dgpg.skip=true \
-pl storm-dist/binary/storm-client-bin,storm-dist/binary/final-package -am
echo "==> [2/2] Building Docker image ${IMAGE} from the fresh tarball"
docker build -f "${HERE}/Dockerfile" \
--build-arg "STORM_VERSION=${VERSION}" \
-t "${IMAGE}" \
"${REPO_ROOT}/storm-dist/binary/final-package/target"
if [[ "${PREPARE_EXTLIB}" != "0" ]]; then
echo
echo "==> Preparing extlib-daemon (prepare-extlib.sh; --no-extlib to skip)"
STORM_VERSION="${VERSION}" "${HERE}/prepare-extlib.sh"
fi
echo
echo "Done. Image ${IMAGE} is up to date with the current source."
echo "Next: cd ${HERE} && docker compose up -d (recreates containers with the new image)"