From 078e38b434a7aa58dcf97d17b6c423d5f35a97f8 Mon Sep 17 00:00:00 2001 From: Sheogorath <sheogorath@shivering-isles.com> Date: Tue, 18 Jan 2022 02:20:12 +0100 Subject: [PATCH] WIP: First simplifications for shell tools --- resources/shell-tools/bin/manifest.sh | 83 +++++++++++++++++ resources/shell-tools/bin/pull.sh | 38 ++------ resources/shell-tools/bin/push.sh | 30 ++++--- resources/shell-tools/bin/tagging.sh | 125 -------------------------- resources/shell-tools/install.sh | 6 +- 5 files changed, 111 insertions(+), 171 deletions(-) create mode 100755 resources/shell-tools/bin/manifest.sh delete mode 100755 resources/shell-tools/bin/tagging.sh diff --git a/resources/shell-tools/bin/manifest.sh b/resources/shell-tools/bin/manifest.sh new file mode 100755 index 0000000..d9e2320 --- /dev/null +++ b/resources/shell-tools/bin/manifest.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +set -o pipefail +set -u +set -e + +VERSION=0.2.0 + +printVersion() { + echo "$VERSION" +} + +printUsage() { + printVersion + echo " + Shivering-Isles manifest tool + + Usage of $0: + $0 <IMAGE REFERENCE> <PREFIX> <VERSION> <SUFFIX> + + Example: + $0 myimage:test myApp 2.0.24 alpine + " + exit 1 +} + +PREFIX="" +SUFFIX="" +LATEST=0 +LOCAL=0 +MULTIARCH_SUPPORTED="amd64|arm64|aarch64" + +if [ "$1" = "--help" ]; then + printUsage +fi + +for i in "$@" +do +case $i in + -p=*|--prefix=*) + PREFIX="${i#*=}" + shift + ;; + -s=*|--suffix=*) + SUFFIX="${i#*=}" + shift # past argument=value + ;; + -v|--version) + printVersion + exit 0 + shift # past argument with no value + ;; + -h|--help) + printUsage + shift + ;; + *) + # further/unknown options + ;; +esac +done + +CURRENT_IMAGE_REFERENCE=${1:-invalid} +TARGET_IMAGE_NAME=${2:-invalid} +TARGET_IMAGE_VERSION=${3:-invalid} + +if [ "$CURRENT_IMAGE_REFERENCE" = "invalid" ] || [ "$TARGET_IMAGE_NAME" = "invalid" ] || [ "$TARGET_IMAGE_VERSION" = "invalid" ]; then + echo "Error: Invalid image name or version" >&2 + printUsage +fi + +mapfile -t MULTIARCH_IMAGES < <(podman images | awk '{print $1 ":" $2}' | grep -Pe "$CURRENT_IMAGE_REFERENCE-($MULTIARCH_SUPPORTED)$") +MULTIARCH_IMAGES_COUNT=${#MULTIARCH_IMAGES[@]} + +TARGET_IMAGE_REFERENCE="${TARGET_IMAGE_NAME}:${PREFIX}${TARGET_IMAGE_VERSION}${SUFFIX}" +for IMAGE_REFERENCE in $(podman images --format="{{.Repository}}:{{.Tag}}" "$CURRENT_IMAGE_REFERENCE"); do + MANIFEST_CMD_PARAMETERES="" + if [[ "$IMAGE_REFERENCE" =~ "aarch64"|"arm64" ]]; then + podman manifest add --variant v8 "$TARGET_IMAGE_REFERENCE" containers-storage:"$IMAGE_REFERENCE" + else + podman manifest add "$TARGET_IMAGE_REFERENCE" containers-storage:"$IMAGE_REFERENCE" + fi +done diff --git a/resources/shell-tools/bin/pull.sh b/resources/shell-tools/bin/pull.sh index 934c976..1e06488 100755 --- a/resources/shell-tools/bin/pull.sh +++ b/resources/shell-tools/bin/pull.sh @@ -4,7 +4,7 @@ set -o pipefail set -u set -e -VERSION=0.1.0 +VERSION=0.2.0 printVersion() { echo "$VERSION" @@ -26,12 +26,6 @@ printUsage() { exit 1 } -CONTAINER_CMD=podman - -if ! command -v "$CONTAINER_CMD" >/dev/null 2>&1; then - CONTAINER_CMD=docker -fi - if [ "$1" = "--help" ]; then printUsage fi @@ -39,10 +33,6 @@ fi for i in "$@" do case $i in - --container-cmd=*) - CONTAINER_CMD="${i#*=}" - shift # past argument with no value - ;; -v|--version) printVersion exit 0 @@ -65,25 +55,13 @@ if [ "$CONTAINER_IMAGE_NAME" = "invalid" ]; then printUsage fi -IMAGE_PULL_SUCCESS=0 +NUMBER_IMAGES="$(podman images "$CONTAINER_IMAGE_NAME" | wc -l)" -# shellcheck disable=SC2015 -podman pull "$CONTAINER_IMAGE_NAME" && \ - IMAGE_PULL_SUCCESS=1 || \ - true - -# shellcheck disable=SC2015 -podman pull "$CONTAINER_IMAGE_NAME-amd64" && \ - IMAGE_PULL_SUCCESS=1 || \ - true - -# shellcheck disable=SC2015 -podman pull "$CONTAINER_IMAGE_NAME-arm64" || \ - podman pull "$CONTAINER_IMAGE_NAME-aarch64" && \ - IMAGE_PULL_SUCCESS=1 || \ - true +for i in "$CONTAINER_IMAGE_NAME"{,-amd64,-arm64,-aarch64}; do + podman pull "$i" || true +done -if [ "$IMAGE_PULL_SUCCESS" == "0" ]; then - echo "Error: No images pulled" >&2 - exit 1 +if ! [ "$NUMBER_IMAGES" -lt "$(podman images "$CONTAINER_IMAGE_NAME" | wc -l)" ]; then + echo "Number of pulled images unchanged. Failed to pull images." >&2 + exit 1 fi diff --git a/resources/shell-tools/bin/push.sh b/resources/shell-tools/bin/push.sh index a9c5683..5dab24c 100755 --- a/resources/shell-tools/bin/push.sh +++ b/resources/shell-tools/bin/push.sh @@ -4,7 +4,7 @@ set -o pipefail set -u set -e -VERSION=0.1.0 +VERSION=0.2.0 printVersion() { echo "$VERSION" @@ -18,19 +18,15 @@ printUsage() { This tool will push all tagged versions of a container image upstream Usage of $0: - $0 <IMAGE REFERENCE> + $0 <MANIFEST REFERENCE> Example: - $0 registry.example.com/example/app + $0 registry.example.com/example/app:1.2.3 " exit 1 } -CONTAINER_CMD=podman - -if ! command -v "$CONTAINER_CMD" >/dev/null 2>&1; then - CONTAINER_CMD=docker -fi +LATEST=0 if [ "$1" = "--help" ]; then printUsage @@ -39,9 +35,9 @@ fi for i in "$@" do case $i in - --container-cmd=*) - CONTAINER_CMD="${i#*=}" - shift # past argument with no value + -l|--latest) + LATEST=1 + shift ;; -v|--version) printVersion @@ -59,11 +55,19 @@ esac done CONTAINER_IMAGE_NAME=${1:-invalid} +CONTAINER_IMAGE_VERSION=${2:-invalid} + if [ "$CONTAINER_IMAGE_NAME" = "invalid" ]; then echo "Error: Invalid image name" >&2 printUsage fi -# shellcheck disable=SC2086 -$CONTAINER_CMD images --format "{{.Repository}}:{{.Tag}}" "$CONTAINER_IMAGE_NAME" | grep "$CONTAINER_IMAGE_NAME" | xargs -L 1 "$(dirname "$0")/../libexec/pushImageOrManifest.sh" +for i in $(seq 1 "${#CONTAINER_IMAGE_VERSION}"); do + REMOTE_VERSION=$(echo "$CONTAINER_IMAGE_VERSION" | cut -d. -f1-$i) + podman manifest push "$CONTAINER_IMAGE_NAME" "docker://${CONTAINER_IMAGE_NAME}:${REMOTE_VERSION}" +done + +if [ "$LATEST" = 0 ]; then + podman manifest push "$CONTAINER_IMAGE_NAME" "docker://${CONTAINER_IMAGE_NAME}:latest" +fi diff --git a/resources/shell-tools/bin/tagging.sh b/resources/shell-tools/bin/tagging.sh deleted file mode 100755 index dc66ad2..0000000 --- a/resources/shell-tools/bin/tagging.sh +++ /dev/null @@ -1,125 +0,0 @@ -#!/bin/bash - -set -o pipefail -set -u -set -e - -VERSION=0.1.0 - -printVersion() { - echo "$VERSION" -} - -printUsage() { - printVersion - echo " - Shivering-Isles tagging tool - - Usage of $0: - $0 <IMAGE REFERENCE> <PREFIX> <VERSION> <SUFFIX> - - Example: - $0 myimage:test myApp 2.0.24 alpine - " - exit 1 -} - -createTagOrManifest() { - TARGET_IMAGE_REFERENCE=$1 - if [ "$MULTIARCH_IMAGES_COUNT" -gt "0" ]; then - $CONTAINER_CMD manifest create "$TARGET_IMAGE_REFERENCE" - for IMAGE_REFERENCE in "${MULTIARCH_IMAGES[@]}" - do - MANIFEST_OPTIONS=() - if [[ "$IMAGE_REFERENCE" =~ "aarch64"|"arm64" ]]; then - MANIFEST_OPTIONS+=(--variant v8) - fi - if [ "$LOCAL" = "1" ]; then - $CONTAINER_CMD manifest add "${MANIFEST_OPTIONS[@]}" "$TARGET_IMAGE_REFERENCE" containers-storage:"$IMAGE_REFERENCE" - else - $CONTAINER_CMD manifest add "${MANIFEST_OPTIONS[@]}" "$TARGET_IMAGE_REFERENCE" "$IMAGE_REFERENCE" - fi - done - else - $CONTAINER_CMD tag "$CURRENT_IMAGE_REFERENCE" "$TARGET_IMAGE_REFERENCE" - fi -} - -CONTAINER_CMD="podman" -PREFIX="" -SUFFIX="" -LATEST=0 -LOCAL=0 -MULTIARCH_SUPPORTED="amd64|arm64|aarch64" - -if ! command -v "$CONTAINER_CMD" >/dev/null 2>&1; then - CONTAINER_CMD=docker -fi - -if [ "$1" = "--help" ]; then - printUsage -fi - -for i in "$@" -do -case $i in - -p=*|--prefix=*) - PREFIX="${i#*=}" - shift - ;; - -s=*|--suffix=*) - SUFFIX="${i#*=}" - shift # past argument=value - ;; - -l|--latest) - LATEST=1 - shift # past argument=value - ;; - --local) - LOCAL=1 - shift # past argument=value - ;; - --container-cmd=*) - CONTAINER_CMD="${i#*=}" - shift # past argument with no value - ;; - -v|--version) - printVersion - exit 0 - shift # past argument with no value - ;; - -h|--help) - printUsage - shift - ;; - *) - # further/unknown options - ;; -esac -done - -CURRENT_IMAGE_REFERENCE=${1:-invalid} -TARGET_IMAGE_NAME=${2:-invalid} -TARGET_IMAGE_VERSION=${3:-invalid} - -if [ "$CURRENT_IMAGE_REFERENCE" = "invalid" ] || [ "$TARGET_IMAGE_NAME" = "invalid" ] || [ "$TARGET_IMAGE_VERSION" = "invalid" ]; then - echo "Error: Invalid image name or version" >&2 - printUsage -fi - -mapfile -t MULTIARCH_IMAGES < <($CONTAINER_CMD images | awk '{print $1 ":" $2}' | grep -Pe "$CURRENT_IMAGE_REFERENCE-($MULTIARCH_SUPPORTED)$") -MULTIARCH_IMAGES_COUNT=${#MULTIARCH_IMAGES[@]} - -counter=1 -new_version="$(echo "$TARGET_IMAGE_VERSION" | cut -d. -f$counter)" -last_version="" -while [ "$last_version" != "$new_version" ]; do - createTagOrManifest "${TARGET_IMAGE_NAME}:${PREFIX}${new_version}${SUFFIX}" - last_version="$new_version" - ((counter++)) - new_version="$(echo "$TARGET_IMAGE_VERSION" | cut -d. -f-"$counter")" -done - -if [ "$LATEST" = "1" ]; then - createTagOrManifest "${TARGET_IMAGE_NAME}:latest" -fi diff --git a/resources/shell-tools/install.sh b/resources/shell-tools/install.sh index e59da23..9c7f858 100755 --- a/resources/shell-tools/install.sh +++ b/resources/shell-tools/install.sh @@ -2,17 +2,17 @@ BASENAME="$(dirname "$0")" -cp "$BASENAME"/./bin/tagging.sh /usr/local/bin/si-tagging +cp "$BASENAME"/./bin/tagging.sh /usr/local/bin/si-manifest cp "$BASENAME"/./bin/push.sh /usr/local/bin/si-push cp "$BASENAME"/./bin/pull.sh /usr/local/bin/si-pull cp "$BASENAME"/./bin/fix-dockerfile.sh /usr/local/bin/si-fix cp "$BASENAME"/./libexec/pushImageOrManifest.sh /usr/local/libexec/pushImageOrManifest.sh -chown root:root /usr/local/bin/si-tagging +chown root:root /usr/local/bin/si-manifest chown root:root /usr/local/bin/si-push chown root:root /usr/local/bin/si-pull chown root:root /usr/local/bin/si-fix chown root:root /usr/local/libexec/pushImageOrManifest.sh -chmod 0755 /usr/local/bin/si-tagging +chmod 0755 /usr/local/bin/si-manifest chmod 0755 /usr/local/bin/si-push chmod 0755 /usr/local/bin/si-pull chmod 0755 /usr/local/bin/si-fix -- GitLab