From cb6f3b7e5cf7f4ac87be824309f622df2a9ea3b3 Mon Sep 17 00:00:00 2001
From: Dominik Hebeler <dominik@suma-ev.de>
Date: Thu, 12 May 2022 12:27:42 +0200
Subject: [PATCH] cleanup revision images

---
 .gitlab/ci/build_docker_images.yml            |  8 +++
 .../deployment_scripts/cleanup_revisions.sh   | 64 +++++++++++++++++++
 2 files changed, 72 insertions(+)
 create mode 100755 .gitlab/deployment_scripts/cleanup_revisions.sh

diff --git a/.gitlab/ci/build_docker_images.yml b/.gitlab/ci/build_docker_images.yml
index d286546d1..9936a79f6 100644
--- a/.gitlab/ci/build_docker_images.yml
+++ b/.gitlab/ci/build_docker_images.yml
@@ -20,6 +20,14 @@ cleanup_composer_image:
   script:
     - 'curl -X DELETE --fail -H "JOB-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/registry/repositories/418/tags/$DOCKER_COMPOSER_IMAGE_TAG"'
 
+cleanup_revision_images:
+  stage: build_docker_images
+  image: $DEPLOY_KUBERNETES_IMAGE
+  variables:
+    KEEP_N: 9   # Trim to the latest 9 revisions as the 10th will be deleted in the next stage
+  script:
+    - .gitlab/deployment_scripts/cleanup_revisions.sh
+
 nginx:
   stage: build_docker_images
   image: $BUILD_DOCKER_IMAGE
diff --git a/.gitlab/deployment_scripts/cleanup_revisions.sh b/.gitlab/deployment_scripts/cleanup_revisions.sh
new file mode 100755
index 000000000..d756d6ca4
--- /dev/null
+++ b/.gitlab/deployment_scripts/cleanup_revisions.sh
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+# Call script with KEEP_N variable set to specify the amount of releases to keep
+
+FPM_REPOSITORY_ID=418
+NGINX_REPOSITORY_ID=416
+
+helm -n $KUBE_NAMESPACE history ${CI_COMMIT_REF_SLUG} > /dev/null 2>&1
+if [ $? -ne 0 ]
+then
+  echo "Release does not exist yet. Nothing to cleanup!"
+  exit 0
+fi
+
+set -e
+
+revision_count=$(helm -n $KUBE_NAMESPACE history $CI_COMMIT_REF_SLUG -o json | jq -r '. | length')
+
+# Get the latest used image tags to make sure they are not deleted
+latest_revision_values=$(helm -n $KUBE_NAMESPACE get values $CI_COMMIT_REF_SLUG -o json)
+latest_fpm_tag=$(echo $latest_revision_values | jq -r '.image.fpm.tag')
+latest_nginx_tag=$(echo $latest_revision_values | jq -r '.image.fpm.tag')
+
+# Get List of revisions to expire (delete the image tags)
+end_index=$(($KEEP_N > $revision_count ? 0 : $revision_count-$KEEP_N))
+expired_revisions=$(helm -n $KUBE_NAMESPACE history $CI_COMMIT_REF_SLUG -o json | jq -r ".[0:$end_index][][\"revision\"]")
+
+# Loop through those revisions
+declare -A expired_fpm_tags
+declare -A expired_nginx_tags
+for revision in $expired_revisions
+do
+    # Get Values for this revision
+    revision_values=$(helm -n $KUBE_NAMESPACE get values $CI_COMMIT_REF_SLUG --revision=$revision -ojson)
+    # Get Image Tags for this revision
+    revision_fpm_tag=$(echo $revision_values | jq -r '.image.fpm.tag')
+    revision_nginx_tag=$(echo $revision_values | jq -r '.image.nginx.tag')
+
+    # Add Tags to the arrays if they are not the latest
+    if [ "$revision_fpm_tag" != "$latest_fpm_tag" ]
+    then
+        expired_fpm_tags[$revision_fpm_tag]=0
+    fi
+
+    if [ "$revision_nginx_tag" != "$latest_nginx_tag" ]
+    then
+        expired_nginx_tags[$revision_nginx_tag]=0
+    fi
+done
+
+# Delete all gathered fpm tags
+for fpm_tag in ${!expired_fpm_tags[@]}
+do
+    echo "Deleting fpm tag $fpm_tag"
+    curl --fail -X DELETE -H "JOB-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/registry/repositories/$FPM_REPOSITORY_ID/tags/$fpm_tag"
+    echo ""
+done
+# Delete all gathered nginx tags
+for nginx_tag in ${!expired_nginx_tags[@]}
+do
+    echo "Deleting nginx tag $nginx_tag"
+    curl --fail -X DELETE -H "JOB-TOKEN: $CI_JOB_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/registry/repositories/$FPM_REPOSITORY_ID/tags/$nginx_tag"
+    echo ""
+done
\ No newline at end of file
-- 
GitLab