diff --git a/.github/workflows/update-ghcr.yml b/.github/workflows/update-ghcr.yml index 134d950a..36ce8170 100644 --- a/.github/workflows/update-ghcr.yml +++ b/.github/workflows/update-ghcr.yml @@ -32,7 +32,7 @@ jobs: - name: Build the Docker image env: - CONFIG: base + BUILD_CONFIG: ghcr run: util/build - name: Log out from GitHub Container Registry diff --git a/docker/Dockerfile b/docker/Dockerfile index 895aebdb..ee9fc211 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -5,7 +5,7 @@ ARG BUILD_TAG ARG ROSDISTRO -FROM ghcr.io/kth-sml/svea:${BUILD_TAG:-latest} +FROM ${BUILD_TAG:-ghcr.io/kth-sml/svea:latest} ARG ROSDISTRO ARG DEBIAN_FRONTEND=noninteractive diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 4fdfecef..d06582e5 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -10,7 +10,7 @@ ARG WORKSPACE ## SVEA BASE IMAGE ## ##################### -FROM ros:${BUILD_TAG:-latest} +FROM ${BUILD_TAG:-ros:latest} ARG ROSDISTRO ARG WORKSPACE diff --git a/util/build b/util/build index c20b0185..29b22b5d 100755 --- a/util/build +++ b/util/build @@ -13,20 +13,28 @@ . "$(dirname "$0")/config.sh" -# Set default arguments, create and set list content -append DEFAULT_ARGS "$(ifelse IMAGE_PUSH --push --load)" -append DEFAULT_ARGS --tag "$IMAGE_TAG" --file "$BUILD_FILE" "$BUILD_CONTEXT" +CMD="docker buildx build" +ARGS="" -if [ -z "$*" ]; then - set -- $DEFAULT_ARGS -fi - -istrue DEBUG && fn="echo" || fn="exec" - -"$fn" docker buildx build \ - --network host \ +append ARGS \ + --network "host" \ --platform "$BUILD_PLATFORM" \ --build-arg "BUILD_TAG=$BUILD_TAG" \ --build-arg "ROSDISTRO=$ROSDISTRO" \ - --build-arg "WORKSPACE=$WORKSPACE" \ - "$@" + --build-arg "WORKSPACE=$WORKSPACE" + + +# Special case for TX2s that have old version of docker +if [ "$(jetson_release)" = "R32" ]; then + CMD="docker build" +else + append ARGS "$(ifelse IMAGE_PUSH --push --load)" +fi + +# These args are replaced if util/build is called with arguments +if [ -z "$*" ] +then append ARGS --tag "$IMAGE_TAG" --file "$BUILD_FILE" "$BUILD_CONTEXT" +else append ARGS "$@" +fi + +call $CMD $ARGS diff --git a/util/config.sh b/util/config.sh index 9a88ed58..c9f5c231 100644 --- a/util/config.sh +++ b/util/config.sh @@ -11,64 +11,91 @@ main() { - CONFIG="${CONFIG:-"deafult"}" - DEFAULT_ROSDISTRO="noetic" - DEFAULT_WORKSPACE="/svea_ws" - DEFAULT_BUILD_PLATFORM="linux/amd64" - DEFAULT_BUILD_FILE="docker/Dockerfile" - DEFAULT_BUILD_TAG="latest" - DEFAULT_IMAGE_PUSH="0" - - if [ "$CONFIG" = "base" ]; then - DEFAULT_BUILD_PLATFORM="linux/amd64,linux/arm64/v8" - DEFAULT_BUILD_FILE="docker/Dockerfile.base" - DEFAULT_BUILD_TAG="$DEFAULT_ROSDISTRO" - IMAGE_PUSH="1" - IMAGE_TAG="ghcr.io/kth-sml/svea" - elif [ "$CONFIG" = "base-amd64" ]; then - DEFAULT_BUILD_PLATFORM="linux/amd64" - DEFAULT_BUILD_FILE="docker/Dockerfile.base" - DEFAULT_BUILD_TAG="$DEFAULT_ROSDISTRO" - IMAGE_TAG="ghcr.io/kth-sml/svea" - elif [ "$CONFIG" = "base-arm64" ]; then - DEFAULT_BUILD_PLATFORM="linux/arm64/v8" - DEFAULT_BUILD_FILE="docker/Dockerfile.base" - DEFAULT_BUILD_TAG="$DEFAULT_ROSDISTRO" - IMAGE_TAG="ghcr.io/kth-sml/svea" + withdefault DEBUG "0" + + withdefault ROSDISTRO "noetic" + withdefault WORKSPACE "/svea_ws" + withdefault REPOSITORY_PATH "$(climb entrypoint)" + withdefault REPOSITORY_NAME "$(basename "$REPOSITORY_PATH")" + + withdefault BUILD_CONFIG "default" + if [ "$BUILD_CONFIG" = "default" ]; then + # building for host platform + withdefault BUILD_PLATFORM "$(uname -m)" + withdefault BUILD_CONTEXT "$REPOSITORY_PATH" + withdefault BUILD_FILE "docker/Dockerfile" + withdefault BUILD_TAG "ghcr.io/kth-sml/svea:latest" + withdefault IMAGE_TAG "$REPOSITORY_NAME" + withdefault IMAGE_PUSH "0" + elif [ "$BUILD_CONFIG" = "base" ]; then + # building for host platform + withdefault BUILD_PLATFORM "$(uname -m)" + withdefault BUILD_CONTEXT "$REPOSITORY_PATH" + withdefault BUILD_FILE "docker/Dockerfile.base" + withdefault BUILD_TAG "ros:$ROSDISTRO" + withdefault IMAGE_TAG "ghcr.io/kth-sml/svea:latest" + withdefault IMAGE_PUSH "0" + elif [ "$BUILD_CONFIG" = "base-amd64" ]; then + # building for x86_64 + withdefault BUILD_PLATFORM "linux/amd64" + withdefault BUILD_CONTEXT "$REPOSITORY_PATH" + withdefault BUILD_FILE "docker/Dockerfile.base" + withdefault BUILD_TAG "ros:$ROSDISTRO" + withdefault IMAGE_TAG "ghcr.io/kth-sml/svea:latest" + withdefault IMAGE_PUSH "0" + elif [ "$BUILD_CONFIG" = "base-arm64" ]; then + # building for arm64/aarch64/jetson + withdefault BUILD_PLATFORM "linux/arm64" + withdefault BUILD_CONTEXT "$REPOSITORY_PATH" + withdefault BUILD_FILE "docker/Dockerfile.base" + withdefault BUILD_TAG "ros:$ROSDISTRO" + withdefault IMAGE_TAG "ghcr.io/kth-sml/svea:latest" + withdefault IMAGE_PUSH "0" + elif [ "$BUILD_CONFIG" = "ghcr" ]; then + # building for both amd64 and arm64 + withdefault BUILD_PLATFORM "linux/arm64,linux/amd64" + withdefault BUILD_CONTEXT "$REPOSITORY_PATH" + withdefault BUILD_FILE "docker/Dockerfile.base" + withdefault BUILD_TAG "ros:$ROSDISTRO" + withdefault IMAGE_TAG "ghcr.io/kth-sml/svea:latest" + withdefault IMAGE_PUSH "1" fi - ROSDISTRO="${ROSDISTRO:-"$DEFAULT_ROSDISTRO"}" - WORKSPACE="${WORKSPACE:-"$DEFAULT_WORKSPACE"}" - - REPOSITORY_PATH="$(climb entrypoint)" - REPOSITORY_NAME="$(basename "$REPOSITORY_PATH")" - - BUILD_PLATFORM="${BUILD_PLATFORM:-"$DEFAULT_BUILD_PLATFORM"}" - BUILD_CONTEXT="${BUILD_CONTEXT:-"$REPOSITORY_PATH"}" - BUILD_FILE="$BUILD_CONTEXT/${BUILD_FILE:-"$DEFAULT_BUILD_FILE"}" - BUILD_TAG="${BUILD_TAG:-"$DEFAULT_BUILD_TAG"}" - - IMAGE_PUSH="${IMAGE_PUSH:-"$DEFAULT_IMAGE_PUSH"}" - IMAGE_TAG="${IMAGE_TAG:-"$REPOSITORY_NAME"}" - - CONTAINER_NAME="$REPOSITORY_NAME" - SHARED_VOLUME="$BUILD_CONTEXT/src:$WORKSPACE/src" - - if [ -n "$DEBUG" ]; then + withdefault CONTAINER_NAME "$REPOSITORY_NAME" + withdefault SHARED_VOLUME "$BUILD_CONTEXT/src:$WORKSPACE/src" + + if istrue DEBUG; then echo "" - echo "ROSDISTRO=$ROSDISTRO" - echo "WORKSPACE=$WORKSPACE" - echo "REPOSITORY_PATH=$REPOSITORY_PATH" - echo "REPOSITORY_NAME=$REPOSITORY_NAME" - echo "BUILD_PLATFORM=$BUILD_PLATFORM" - echo "BUILD_CONTEXT=$BUILD_CONTEXT" - echo "BUILD_FILE=$BUILD_FILE" - echo "BUILD_TAG=$BUILD_TAG" - echo "IMAGE_PUSH=$IMAGE_PUSH" - echo "IMAGE_TAG=$IMAGE_TAG" - echo "CONTAINER_NAME=$CONTAINER_NAME" - echo "SHARED_VOLUME=$SHARED_VOLUME" + echovar BUILD_CONFIG echo + echovar ROSDISTRO + echovar WORKSPACE + echovar REPOSITORY_PATH + echovar REPOSITORY_NAME + echovar BUILD_PLATFORM + echovar BUILD_CONTEXT + echovar BUILD_FILE + echovar BUILD_TAG + echovar IMAGE_TAG + echovar IMAGE_PUSH + echovar CONTAINER_NAME + echovar SHARED_VOLUME + echo + fi +} + +call() { + if istrue DEBUG; then + echo "$@" + else + exec "$@" + fi +} + +jetson_release() { + file="/etc/nv_tegra_release" + if [ -f "$file" ]; then + echo "$(index 2 $(cat "$file"))" fi } @@ -124,6 +151,18 @@ climb() { return $? } +# Echo shell variable +# > echovar NAME +echovar() { + eval "echo \"$1=\$$1\"" +} + +# Set shell variable with default +# > withdefault NAME DEFAULT +withdefault() { + eval "$1=\"\${$1:-\"$2\"}\"" +} + # Echo TRUTHY if `istrue NAME` else FALSY # > ifelse NAME TRUTHY FALSY ifelse() { @@ -133,6 +172,22 @@ ifelse() { fi } +# If VALUE equals COND then echo RET, otherwise shift +# and continue with following arguments +# > switch VALUE [[COND RET]...] +switch() { + VALUE="$1" + shift + if [ "$VALUE" = "$1" ]; then + echo "$2" + elif [ "$#" -ge 2 ]; then + shift 2 + switch "$VALUE" "$@" + else + echo "$@" # echo nothing or remaining arg + fi +} + # Append ARGS to shell variable with name NAME # > append LIST_NAME [ARGS...] append() { diff --git a/util/run b/util/run index fb4cdb79..ff661f46 100755 --- a/util/run +++ b/util/run @@ -8,19 +8,22 @@ . "$(dirname "$0")/config.sh" -# Setting default arguments -if [ -z "$*" ]; then - set -- --name "$CONTAINER_NAME" "$IMAGE_TAG" -fi - -istrue DEBUG && fn="echo" || fn="exec" +CMD="docker run" +ARGS="" -"$fn" docker run \ +append ARGS \ -it \ -e "TERM=xterm-256color" \ -v "/dev:/dev" \ -v "$SHARED_VOLUME" \ --rm \ --network host \ - --privileged \ - "$@" + --privileged + +# These args are replaced if util/build is called with arguments +if [ -z "$*" ] +then append ARGS --name "$CONTAINER_NAME" "$IMAGE_TAG" +else append ARGS "$@" +fi + +call $CMD $ARGS