From 4bb42f74cd10a926bd881b408272c0624bdc758f Mon Sep 17 00:00:00 2001
From: Baruta Daniel Mihail <baruta.mihai@yahoo.com>
Date: Wed, 3 Aug 2022 20:01:25 +0200
Subject: [PATCH] local.sh docker image build, push and test capability

---
 local.sh | 212 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 198 insertions(+), 14 deletions(-)

diff --git a/local.sh b/local.sh
index 87bd426..9b21685 100755
--- a/local.sh
+++ b/local.sh
@@ -2,12 +2,28 @@
 
 cd "$(dirname "$0")" || exit 1
 
+#=============================================================================
+#================================= CONSTANTS =================================
+#=============================================================================
+
+RED='\033[0;31m'
+NC='\033[0m'
+
+DEFAULT_IMAGE_NAME="$(basename "$(pwd)")"
+DEFAULT_TAG='latest'
+DEFAULT_REGISTRY='registry.gitlab.cs.pub.ro'
+
 #=============================================================================
 #=================================== UTILS ===================================
 #=============================================================================
 
 LOG_INFO() {
-    echo "[INFO] $1"
+    echo -e "[$(date +%F_%T)] [INFO] $1"
+}
+
+LOG_FATAL() {
+    echo -e "[$(date +%F_%T)] [${RED}FATAL${NC}] $1"
+    exit 1
 }
 
 #=============================================================================
@@ -17,27 +33,185 @@ LOG_INFO() {
 print_help() {
     echo "Usage:"
     echo ""
-    echo "local.sh [-h|--help] [--remove_image] [argumets_for_checker]"
+    echo "local.sh checker|docker|-h|--help"
     echo ""
-    echo "      --remove_image - remove the checker's docker image after the run"
+    echo "      docker - runs docker commands to build, test or push an image made of this repo"
+    echo "      checker - runs the checker"
     echo "      -h|--help - prints this message"
+    echo ""
+    echo "local.sh docker build [--image_name <image_name>] [--tag <tag>] [--registry <registry>]"
+    echo ""
+    echo "      --image_name <image_name> - the name of the image (default: current directory name)"
+    echo "      --tag <tag> - the tag of the image (default: 'latest')"
+    echo "      --registry <registry> - the registry in which the image will be pushed (default: 'registry.gitlab.cs.pub.ro')"
+    echo ""
+    echo "local.sh docker push --user <user> --token <token> [--image_name <image_name>] [--tag <tag>] [--registry <registry>]"
+    echo ""
+    echo "      --image_name <image_name> - the name of the image (default: current directory name)"
+    echo "      --tag <tag> - the tag of the image (default: 'latest')"
+    echo "      --registry <registry> - the registry in which the image will be pushed (default: 'registry.gitlab.cs.pub.ro')"
+    echo "      --user <registry> - username for the repository registry"
+    echo "      --token <registry> - the registry in which the image will be pushed (default: 'registry.gitlab.cs.pub.ro')"
+    echo ""
+    echo "local.sh docker test [--full_image_name <full_image_name>] [argumets_for_checker]"
+    echo ""
+    echo "      --full_image_name <full_image_name> - the full name of the image (default: registry.gitlab.cs.pub.ro/<current_directory_name>:latest)"
+    echo "      argumets_for_checker - list of space separated arguments to be passed to the checker"
+    echo ""
+    echo "local.sh docker interactive [--full_image_name <full_image_name>] [--use_executable <executbale>]"
+    echo ""
+    echo "      --full_image_name <full_image_name> - the full name of the image (default: registry.gitlab.cs.pub.ro/<current_directory_name>:latest)"
+    echo "      --use_executable <executable> - command to run inside the container (default: /bin/bash)"
+    echo ""
+    echo "local.sh checker [--remove_image] [argumets_for_checker]"
+    echo ""
+    echo "      --remove_image - remove the checker's docker image after the run"
     echo "      argumets_for_checker - list of space separated arguments to be passed to the checker"
     echo ""
 }
 
-main() {
+docker_build() {
+    local image_name="$DEFAULT_IMAGE_NAME"
+    local tag="$DEFAULT_TAG"
+    local registry="$DEFAULT_REGISTRY"
+
+    while [[ $# -gt 0 ]]; do
+        case $1 in
+            --image_name)
+                shift
+                image_name="$1"
+            ;;
+            --tag)
+                shift
+                tag="$1"
+            ;;
+            --registry)
+                shift
+                registry="$1"
+            ;;
+        esac
+        shift
+    done
+
+    LOG_INFO "Building Docker image..."
+
+    docker image build -t "${registry}/${image_name}:${tag}" .
+}
+
+docker_push() {
+    local image_name="$DEFAULT_IMAGE_NAME"
+    local tag="$DEFAULT_TAG"
+    local registry="$DEFAULT_REGISTRY"
+    local user=''
+    local token=''
+
+    while [[ $# -gt 0 ]]; do
+        case $1 in
+            --image_name)
+                shift
+                image_name="$1"
+            ;;
+            --tag)
+                shift
+                tag="$1"
+            ;;
+            --registry)
+                shift
+                registry="$1"
+            ;;
+            --user)
+                shift
+                user="$1"
+            ;;
+            --token)
+                shift
+                token="$1"
+            ;;
+        esac
+        shift
+    done
+
+    [ -z "$user" ] && LOG_FATAL "No user provided. Push operation will be aborted..."
+    [ -z "$token" ] && LOG_FATAL "No token provided. Push operation will be aborted..."
+
+    LOG_INFO "Pushing Docker image..."
+
+    docker login "${registry}" -u "${user}" -p "${token}"
+    docker push "${registry}/${image_name}:${tag}"
+}
+
+docker_test() {
+    local full_image_name="${DEFAULT_REGISTRY}/${DEFAULT_IMAGE_NAME}:${DEFAULT_TAG}"
+
+    while [[ $# -gt 0 ]]; do
+        case $1 in
+            --full_image_name)
+                shift
+                full_image_name="$1"
+            ;;
+        esac
+        shift
+    done
+
+    checker_main --use_existing_image "$full_image_name" "$@"
+}
+
+docker_interactive() {
+    local full_image_name="${DEFAULT_REGISTRY}/${DEFAULT_IMAGE_NAME}:${DEFAULT_TAG}"
+    local executable="/bin/bash"
+
+    while [[ $# -gt 0 ]]; do
+        case $1 in
+            --full_image_name)
+                shift
+                full_image_name="$1"
+            ;;
+            --use_executable)
+                shift
+                executable="$1"
+            ;;
+        esac
+        shift
+    done
+
+    tmpdir="$(mktemp -d)"
+    cp -R ./* "$tmpdir"
+
+    docker run --rm -it \
+            --mount type=bind,source="$tmpdir",target=/build \
+            "$full_image_name" "$executable"
+}
+
+docker_main() {
+    if [ "$1" = "build" ] ; then
+        shift
+        docker_build "$@"
+    elif [ "$1" = "push" ] ; then
+        shift
+        docker_push "$@"
+    elif [ "$1" = "test" ] ; then
+        shift
+        docker_test "$@"
+    elif [ "$1" = "interactive" ] ; then
+        shift
+        docker_interactive "$@"
+    fi
+}
+
+checker_main() {
     local script_args=()
     local remove_image=''
+    local image_name=''
 
     while [[ $# -gt 0 ]]; do
         case $1 in
-            -h|--help)
-                print_help
-                exit 0
-            ;;
             --remove_image)
                 remove_image='true'
             ;;
+            --use_existing_image)
+                shift
+                image_name="$1"
+            ;;
             *)
                 script_args+=("$1")
             ;;
@@ -45,18 +219,18 @@ main() {
         shift
     done
 
-    image_name="$(basename "$(pwd)")"
-
-    LOG_INFO "Building image..."
-    docker build -q -t "$image_name" .
+    if [ -z "$image_name" ] ; then
+        image_name="$(basename "$(pwd)")"
 
+        LOG_INFO "Building image..."
+        docker build -q -t "$image_name" .
+    fi
 
     tmpdir="$(mktemp -d)"
     cp -R ./* "$tmpdir"
 
     LOG_INFO "Running checker..."
     docker run --rm \
-            --name "$image_name-container" \
             --mount type=bind,source="$tmpdir",target=/build \
             "$image_name" /bin/bash /build/checker/checker.sh "${script_args[@]}"
 
@@ -67,4 +241,14 @@ main() {
 
 }
 
-main "$@"
+if [ "$1" = "checker" ] ; then
+    shift
+    checker_main "$@"
+elif [ "$1" = "docker" ] ; then
+    shift
+    docker_main "$@"
+elif [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
+    print_help
+else
+    print_help
+fi
-- 
GitLab