From 08f7978f74f674fd183ddac5c8bb1cad45eb8245 Mon Sep 17 00:00:00 2001 From: David Hiendl Date: Mon, 24 Oct 2022 18:15:54 +0200 Subject: [PATCH] drone/ContainerImageKaniko: support building multiple registries --- drone/ContainerImageKaniko.yml | 76 +++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/drone/ContainerImageKaniko.yml b/drone/ContainerImageKaniko.yml index 41a96fe..7e70d0a 100644 --- a/drone/ContainerImageKaniko.yml +++ b/drone/ContainerImageKaniko.yml @@ -14,12 +14,36 @@ TAG_SEMVER_MAJOR: "true" TAG_SEMVER_MINOR: "true" TAG_SEMVER_PATCH: "true" - ADDITIONAL_REGISTRY_DESTINATIONS: "" + ADDITIONAL_REGISTRY_DESTINATIONS: "" # a list of --destination registry/orga/repo:tag strings, space separated" + KANIKO_SINGLE_SNAPSHOT: "true" + ADDITIONAL_REGISTRIES: "" ADD_CI_REGISTRY_AUTH: "true" + ADD_CI_REGISTRY_TARGET: "true" commands: - &ContainerImageKanikoCommands | + + _OLD_IFS="$IFS" + REGISTRY_TARGETS="" + + # add default registry as target + if [[ "$ADD_CI_REGISTRY_TARGET" == "true" ]]; then + REGISTRY_TARGETS="$CI_REGISTRY_IMAGE:" + fi + + # prepare additional registry targets + IFS="," + for REGISTRY in $ADDITIONAL_REGISTRIES; do + # add ":" to registry paths missing it + if [[ "$REGISTRY" != *":"* ]]; then + REGISTRY="$REGISTRY:" + fi + + REGISTRY_TARGETS="$REGISTRY_TARGETS,$REGISTRY" + done + IFS="$OLD_IFS" + # drone does not support expanding vars in environment values, set defaults via bash if [[ -z "$CONTEXT_DIR" ]]; then CONTEXT_DIR="$DRONE_WORKSPACE_BASE"; fi if [[ -z "$DOCKERFILE" ]]; then DOCKERFILE="$DRONE_WORKSPACE_BASE/Dockerfile"; fi @@ -30,26 +54,27 @@ echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n token:$CI_REGISTRY_PASSWORD | base64)\"}}}" > /kaniko/.docker/config.json fi - IMAGE_DESTS="" + IMAGE_TAGS="" # default tag based on commit if [[ "$TAG_COMMIT_ENABLE" == "true" ]]; then - IMAGE_DESTS="$IMAGE_DESTS --destination $CI_REGISTRY_IMAGE:$TAG_PREFIX$TAG_COMMIT_PREFIX$CI_COMMIT_SHA$TAG_SUFFIX" + echo "adding commit tag" + IMAGE_TAGS="$IMAGE_TAGS,$TAG_PREFIX$TAG_COMMIT_PREFIX$CI_COMMIT_SHA$TAG_SUFFIX" fi # add semver major tag if enabled and available, exclude "0" tag # add semver major.minor tag if enabled and available, exclude "0.0" tag # add semver major.minor.patch tag if enabled and available, exclude "0.0.0" tag if [[ "$TAG_SEMVER_MAJOR" == "true" ]] && [[ ! -z $SEMVER_MAJOR ]] && [[ "$SEMVER_MAJOR" != "0" ]]; then - IMAGE_DESTS="$IMAGE_DESTS --destination $CI_REGISTRY_IMAGE:$TAG_PREFIX$SEMVER_MAJOR" + IMAGE_TAGS="$IMAGE_TAGS,$TAG_PREFIX$SEMVER_MAJOR" TAG_REF_NORMALIZED_ENABLE=0 fi if [[ "$TAG_SEMVER_MINOR" == "true" ]] && [[ ! -z $SEMVER_MINOR ]] && [[ "$SEMVER_MAJOR_MINOR" != "0.0" ]]; then - IMAGE_DESTS="$IMAGE_DESTS --destination $CI_REGISTRY_IMAGE:$TAG_PREFIX$SEMVER_MAJOR_MINOR" + IMAGE_TAGS="$IMAGE_TAGS,$TAG_PREFIX$SEMVER_MAJOR_MINOR" TAG_REF_NORMALIZED_ENABLE=0 fi if [[ "$TAG_SEMVER_PATCH" == "true" ]] && [[ ! -z $SEMVER_PATCH ]] && [[ "$SEMVER_MAJOR_MINOR_PATCH" != "0.0.0" ]]; then - IMAGE_DESTS="$IMAGE_DESTS --destination $CI_REGISTRY_IMAGE:$TAG_PREFIX$SEMVER_MAJOR_MINOR_PATCH" + IMAGE_TAGS="$IMAGE_TAGS,$TAG_PREFIX$SEMVER_MAJOR_MINOR_PATCH" TAG_REF_NORMALIZED_ENABLE=0 fi @@ -59,26 +84,49 @@ # - attempt to build branch if not a PR (if not PR for extra security, variable description on drone unclear) echo "TAG_REF_NORMALIZED_ENABLE=$TAG_REF_NORMALIZED_ENABLE" if [[ "$TAG_REF_NORMALIZED_ENABLE" == "true" ]] && [[ ! -z $DRONE_TAG ]]; then + echo "adding tag for tag" REF_TAG_NORMALIZED=$(echo $DRONE_TAG | sed s:/:-:g) - IMAGE_DESTS="$IMAGE_DESTS --destination $CI_REGISTRY_IMAGE:$TAG_PREFIX$REF_TAG_NORMALIZED$TAG_SUFFIX" + IMAGE_TAGS="$IMAGE_TAGS,$TAG_PREFIX$REF_TAG_NORMALIZED$TAG_SUFFIX" elif [[ "$TAG_REF_NORMALIZED_ENABLE" == "true" ]] && [[ -z "$DRONE_PULL_REQUEST" ]] && [[ ! -z $DRONE_BRANCH ]]; then + echo "adding tag for branch" REF_TAG_NORMALIZED=$(echo $DRONE_BRANCH | sed s:/:-:g) - IMAGE_DESTS="$IMAGE_DESTS --destination $CI_REGISTRY_IMAGE:$TAG_PREFIX$REF_TAG_NORMALIZED$TAG_SUFFIX" + IMAGE_TAGS="$IMAGE_TAGS,$TAG_PREFIX$REF_TAG_NORMALIZED$TAG_SUFFIX" fi + # prepare destinations by combining registries + tags + echo "# preparing destinations:" + IMAGE_DESTS="" + IFS="," + for REGISTRY in $REGISTRY_TARGETS; do + if [[ -z "$REGISTRY" ]]; then continue; fi + + for IMAGE_TAG in $IMAGE_TAGS; do + if [[ -z "$IMAGE_TAG" ]]; then continue; fi + echo "- $REGISTRY$IMAGE_TAG" + IMAGE_DESTS="$IMAGE_DESTS --destination $REGISTRY$IMAGE_TAG" + done + done + IMAGE_DESTS=$(echo $IMAGE_DESTS | xargs) + IFS="$OLD_IFS" + # prepare kaniko args if [[ -z "$KANIKO_ARGS" ]]; then KANIKO_ARGS="" fi KANIKO_ARGS="--context $CONTEXT_DIR --dockerfile $DOCKERFILE $KANIKO_ARGS" - if [[ "KANIKO_SINGLE_SNAPSHOT" ]]; then + if [[ "$KANIKO_SINGLE_SNAPSHOT" == "true" ]]; then KANIKO_ARGS="$KANIKO_ARGS --single-snapshot" fi + if [[ -z "$IMAGE_DESTS" ]]; then + KANIKO_ARGS="$KANIKO_ARGS $IMAGE_DESTS" + fi + if [[ -z "$ADDITIONAL_REGISTRY_DESTINATIONS" ]]; then + KANIKO_ARGS="$KANIKO_ARGS $ADDITIONAL_REGISTRY_DESTINATIONS" + fi # build image - echo "kaniko args: $KANIKO_ARGS" - echo "pushing to destinations: $IMAGE_DESTS" - echo "pushing to additional destinations: $ADDITIONAL_REGISTRY_DESTINATIONS" - /kaniko/executor $KANIKO_ARGS $IMAGE_DESTS $ADDITIONAL_REGISTRY_DESTINATIONS - + echo "# kaniko arguments: " + ALL_ARGS="$KANIKO_ARGS $IMAGE_DESTS $ADDITIONAL_REGISTRY_DESTINATIONS" + echo "$ALL_ARGS" + echo $ALL_ARGS | xargs /kaniko/executor