From 69e285c8dba35e3722ea9b81c34713707c1b5cdf Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Gr=C3=A9goire?= <gregoire.kubler@proton.me>
Date: Tue, 26 Nov 2024 17:31:03 +0100
Subject: [PATCH] feat: reworked the way tag artefacts are retrieved in
 ubuntu:select_jobs

now parses tag values to look for latest corresponding tag instead of retrieving tag chronologically
---
 .gitlab/ci/download/select_jobs.gitlab-ci.yml | 53 ++++++++++++-------
 1 file changed, 33 insertions(+), 20 deletions(-)

diff --git a/.gitlab/ci/download/select_jobs.gitlab-ci.yml b/.gitlab/ci/download/select_jobs.gitlab-ci.yml
index 0768d79..2421a87 100644
--- a/.gitlab/ci/download/select_jobs.gitlab-ci.yml
+++ b/.gitlab/ci/download/select_jobs.gitlab-ci.yml
@@ -88,27 +88,40 @@
         ######################################
         # CASE WHERE A COMMIT TAG IS CREATED
         elif [[ ! -z "$CI_COMMIT_TAG" ]]; then
-        	PROJECT_CURR_TAG_DATE=$(jq '.commit.created_at' <<<$(curl -s "$API_URL/projects/$CI_PROJECT_ID/repository/tags/$CI_COMMIT_TAG"))
-        	echo "Retrieving tags of $DEP_NAME via url $DEP_API_URL/repository/tags?per_page=100."
-        	DEP_TAGS=$(jq --slurp '
-              .[]
-              | sort_by(.commit.created_at)
-              | reverse
-              ' <<<$(curl -s "$DEP_API_URL/repository/tags?per_page=100"))
-        	TAGS_BEFORE_DATE=$(jq --slurp --arg before_date "$PROJECT_CURR_TAG_DATE" '
-              .[]
-              | map(select(.commit.created_at != null and (.commit.created_at <= $before_date)))
-          ' <<<"$DEP_TAGS")
+            # retrieving data from current project
+            TAG_MAJOR=$(echo "$CI_COMMIT_TAG" | awk -F'[v.]' '{print $2}')
+            TAG_MINOR=$(echo "$CI_COMMIT_TAG" | awk -F'[v.]' '{print $3}')
+            TAG_FIX=$(echo "$CI_COMMIT_TAG" | awk -F'[v.]' '{print $4}')
+    	    echo "Retrieving tags of $DEP_NAME via url $DEP_API_URL/repository/tags?per_page=100."
+            DEP_TAGS=$(jq --slurp '
+                .[]
+                | sort_by(.commit.created_at)
+                | reverse
+                ' <<<$(curl -s "$DEP_API_URL/repository/tags?per_page=100"))
 
-        	if [[ $(jq length <<<"$TAGS_BEFORE_DATE") != 0 ]]; then
-        		BRANCH_TO_PULL=$(jq -r '.[0].name' <<<"$TAGS_BEFORE_DATE")
-        		echo "Found release : $BRANCH_TO_PULL. Using it as \$BRANCH_TO_PULL."
-        	else
-        		echo "Found no release predating $CI_PROJECT_NAME $CI_COMMIT_TAG's date : $CI_COMMIT_TAG."
-        		echo "Retrieving latest repo tag."
-        		BRANCH_TO_PULL=$(jq -r '.[0].name' <<<"$DEP_TAGS")
-        		echo "\$BRANCH_TO_PULL = $BRANCH_TO_PULL"
-        	fi
+            if [[ $(jq length <<< $DEP_TAGS) == 0 ]]; then
+              echo "No tag found for $DEP_NAME at url $DEP_API_URL/repository/tags?per_page=100"
+              echo "Leaving early."
+              exit 1
+            fi
+
+            echo "Looking for latest fix release corresponding to minor  release : v$TAG_MAJOR.$TAG_MINOR.*"
+            SELECTED_DEPS_TAGS=$(jq --arg major "$TAG_MAJOR" \
+                                    --arg minor "$TAG_MINOR" \
+                                    'map(select(.name | startswith("v\($major).\($minor).")))' <<< "$DEP_TAGS")
+            if [[ $(jq length <<< $SELECTED_DEPS_TAGS) == 0 ]]; then
+              echo "No release v$TAG_MAJOR.$TAG_MINOR.* found. Looking for latest minor release v$TAG_MAJOR.*.* in $DEP_NAME."
+              SELECTED_DEPS_TAGS=$(jq --arg major "$TAG_MAJOR" \
+                                    'map(select(.name | startswith("v\($major).")))' <<< "$DEP_TAGS")
+            fi 
+            if [[ $(jq length <<< $SELECTED_DEPS_TAGS) > 0 ]]; then
+            	BRANCH_TO_PULL=$(jq -r '.[0].name' <<<"$SELECTED_DEPS_TAGS")
+              echo "Found a release with corresponding $BRANCH_TO_PULL"
+            else
+              echo "No release v$TAG_MAJOR.*.* found. Simply retrieving latest release v*.*.* in $DEP_NAME."
+            	BRANCH_TO_PULL=$(jq -r '.[0].name' <<<"$DEP_TAGS")
+            fi
+            echo "Found release : $BRANCH_TO_PULL. Using it as \$BRANCH_TO_PULL."
 
         ###########################################
         # CASE CASUAL COMMIT or Draft MR PIPELINE
-- 
GitLab