#!/bin/bash set -eu # cd to location of script cd "$(dirname "$(realpath "$0")")" # Builds the docker images. # Usage: ./build {COMPONENTS}, or just ./build to build all. # The resulting images are named wubloader-COMPONENT. # Pass PUSH=true to also push the resulting images, or PUSH=latest to push them as :latest tag # The different images we can build COMPONENTS=( backfiller buscribe buscribe_api chat_archiver cutter downloader graphs nginx playlist_manager postgres restreamer segment_coverage sheetsync thrimshim ) # Define push if not already defined PUSH=${PUSH:-} # Base is the repository namespace information, not including the wubloader-component part. BASE="ghcr.io/dbvideostriketeam" # cache name is the name of the repository we store shared layer cache in CACHE_NAME="$BASE/wubloader-cache" # The docker image tag, derived from the git commit + whether working tree is clean TAG=$(./get-build-tag) if [ "$#" -gt 0 ]; then COMPONENTS=("$@") fi # If CACHE is set, image layers will be pushed to the registry during the build, # and re-use any layers from this cache instead of rebuilding them. # You can set CACHE=readonly to only use the cache and not write to it (eg. due to permissions) # Setting CACHE requires buildah be installed and configured, as this is used for the build instead of docker. case "${CACHE:-}" in "") CACHE_ARGS=() BUILD_CMD="docker" ;; readonly) CACHE_ARGS+=("--cache-from" "$CACHE_NAME") BUILD_CMD="buildah" ;; *) CACHE_ARGS+=("--layers" "--cache-to" "$CACHE_NAME" "--cache-from" "$CACHE_NAME") BUILD_CMD="buildah" ;; esac # check for MULTIPLATFORM flag. error out if we're not using buildah for now. docker buildx should be able to do it too, but needs testing if [ -n "$MULTIPLATFORM" ]; then if [ "$BUILD_CMD" == "docker" ]; then echo "Multiplatform builds are not yet supported with docker! Use buildah instead." exit 1 fi fi for component in "${COMPONENTS[@]}"; do echo "Building image for $component" latest="$BASE/wubloader-$component:latest" specific="$BASE/wubloader-$component:$TAG" if [ -n "$MULTIPLATFORM" ]; then echo "Creating multi-arch manifest" "$BUILD_CMD" manifest create "wubloader-$component" # no way to build multi-arch in parallel, so just build amd64 first and then arm64. # caching should work with both, so that'll make things less painful at least. "$BUILD_CMD" build \ -f "$component/Dockerfile" \ -t "$latest" \ -t "$specific" \ --manifest "wubloader-$component" \ --arch amd64 \ "${CACHE_ARGS[@]}" \ . # buscribe doesn't (yet?) build under arm64 due to pulling in libc-bin, skip arm64 for it if [ "$component" != "buscribe ]; then "$BUILD_CMD" build \ -f "$component/Dockerfile" \ -t "$latest" \ -t "$specific" \ --manifest "wubloader-$component" \ --arch arm64 \ "${CACHE_ARGS[@]}" \ . fi echo "Built image wubloader-$component:$TAG" # manifest pushes are buildah-specific. docker buildx multiplatform builds have different syntax... if [ -n "$PUSH" ]; then echo "Pushing tag $specific" "$BUILD_CMD" manifest push --all "$specific" fi if [ "$PUSH" == "latest" ]; then echo "Pushing tag $latest" "$BUILD_CMD" manifest push --all "$latest" fi else "$BUILD_CMD" build \ -f "$component/Dockerfile" \ -t "$latest" \ -t "$specific" \ --manifest "wubloader-$component" \ "${CACHE_ARGS[@]}" \ . echo "Built image wubloader-$component:$TAG" if [ -n "$PUSH" ]; then echo "Pushing tag $specific" "$BUILD_CMD" push "$specific" fi if [ "$PUSH" == "latest" ]; then echo "Pushing tag $latest" "$BUILD_CMD" push "$latest" fi fi done