From 4de4bea6e702fc6ebf7e58e7fd57e31fd0791b3a Mon Sep 17 00:00:00 2001 From: Santiago Mola Date: Tue, 1 Jul 2025 09:49:00 +0200 Subject: [PATCH 1/4] More graceful error handling in .gitlab/find-gh-base-ref.sh --- .gitlab-ci.yml | 6 +++++- .gitlab/find-gh-base-ref.sh | 15 +++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cffdcddf2ed..cfd791338ba 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -123,7 +123,11 @@ default: - | if [[ ! $CI_COMMIT_BRANCH =~ ^(master|release/.*)$ ]]; then export GIT_BASE_REF=$(.gitlab/find-gh-base-ref.sh) - export GRADLE_PARAMS="$GRADLE_PARAMS -PgitBaseRef=origin/$GIT_BASE_REF" + if [[ -n "$GIT_BASE_REF" ]]; then + export GRADLE_PARAMS="$GRADLE_PARAMS -PgitBaseRef=origin/$GIT_BASE_REF" + else + echo "Failed to find base ref for PR" >&2 + fi fi .gradle_build: &gradle_build diff --git a/.gitlab/find-gh-base-ref.sh b/.gitlab/find-gh-base-ref.sh index 2e20a4ea31c..641672c2ac6 100755 --- a/.gitlab/find-gh-base-ref.sh +++ b/.gitlab/find-gh-base-ref.sh @@ -17,14 +17,19 @@ if [[ -z "${CI_COMMIT_REF_NAME}" ]]; then exit 1 fi +# In GitLab, CI_PROJECT_NAME is set, otherwise, set it for testing. +export CI_PROJECT_NAME="${CI_PROJECT_NAME:-dd-trace-java}" + if [[ -z "${GITHUB_TOKEN:-}" ]]; then echo "GITHUB_TOKEN is not set, fetching from AWS SSM" >&2 if ! command -v aws >/dev/null 2>&1; then echo "aws is not installed, please install it" >&2 exit 1 fi + set +e GITHUB_TOKEN=$(aws ssm get-parameter --name "ci.$CI_PROJECT_NAME.gh_release_token" --with-decryption --query "Parameter.Value" --output text) - if [[ -z "${GITHUB_TOKEN}" ]]; then + set -e + if [[ -z "${GITHUB_TOKEN:-}" ]]; then echo "Failed to fetch GITHUB_TOKEN from AWS SSM" >&2 exit 1 fi @@ -57,9 +62,11 @@ while true; do if [[ ${exit_code} -eq 0 ]]; then PR_NUMBER=$(echo "$PR_DATA" | sed '1,/^[[:space:]]*$/d' | jq -r '.[].number') PR_BASE_REF=$(echo "$PR_DATA" | sed '1,/^[[:space:]]*$/d' | jq -r '.[].base.ref') - echo "PR is https://github.com/datadog/dd-trace-java/pull/${PR_NUMBER} and base ref is ${PR_BASE_REF}">&2 - echo "${PR_BASE_REF}" - exit 0 + if [[ -n "${PR_BASE_REF:-}" ]]; then + echo "PR is https://github.com/datadog/dd-trace-java/pull/${PR_NUMBER} and base ref is ${PR_BASE_REF}">&2 + echo "${PR_BASE_REF}" + exit 0 + fi fi if echo "$PR_DATA" | grep -q "^x-ratelimit-reset:"; then reset_timestamp=$(echo -n "$PR_DATA" | grep "^x-ratelimit-reset:" | sed -e 's/^x-ratelimit-reset: //' -e 's/\r//') From eb6a8a0661e42417e8384ef8668db66a1850f3c3 Mon Sep 17 00:00:00 2001 From: Santiago Mola Date: Tue, 1 Jul 2025 10:05:14 +0200 Subject: [PATCH 2/4] Cache result --- .gitlab/find-gh-base-ref.sh | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/.gitlab/find-gh-base-ref.sh b/.gitlab/find-gh-base-ref.sh index 641672c2ac6..29732fd9b71 100755 --- a/.gitlab/find-gh-base-ref.sh +++ b/.gitlab/find-gh-base-ref.sh @@ -2,9 +2,39 @@ # Determines the base branch for the current PR (if we are running in a PR). set -euo pipefail +CURRENT_HEAD_SHA="$(git rev-parse HEAD)" +if [[ -z "${CURRENT_HEAD_SHA:-}" ]]; then + echo "Failed to determine current HEAD SHA" >&2 + exit 1 +fi + +CACHE_PATH=workspace/find-gh-base-ref.cache +save_cache() { + local base_ref="$1" + local head_sha="$2" + mkdir -p workspace + echo "CACHED_BASE_REF=${base_ref}" > "$CACHE_PATH" + echo "CACHED_HEAD_SHA=${head_sha}" >> "$CACHE_PATH" +} + +# Get cached result (if HEAD commit matches) +if [[ -f $CACHE_PATH ]]; then + set -a + source "$CACHE_PATH" + set +a + if [[ "$CURRENT_HEAD_SHA" == "${CACHED_HEAD_SHA:-}" && -n "${CACHED_BASE_REF:-}" ]]; then + echo "Cache hit" >&2 + echo "$CACHED_BASE_REF" + exit 0 + else + echo "Cache miss" >&2 + fi +fi + # Happy path: if we're just one commit away from master, base ref is master. if [[ $(git log --pretty=oneline origin/master..HEAD | wc -l) -eq 1 ]]; then echo "We are just one commit away from master, base ref is master" >&2 + save_cache "master" "$CURRENT_HEAD_SHA" echo "master" exit 0 fi @@ -64,6 +94,7 @@ while true; do PR_BASE_REF=$(echo "$PR_DATA" | sed '1,/^[[:space:]]*$/d' | jq -r '.[].base.ref') if [[ -n "${PR_BASE_REF:-}" ]]; then echo "PR is https://github.com/datadog/dd-trace-java/pull/${PR_NUMBER} and base ref is ${PR_BASE_REF}">&2 + save_cache "${PR_BASE_REF}" "$CURRENT_HEAD_SHA" echo "${PR_BASE_REF}" exit 0 fi @@ -77,7 +108,5 @@ while true; do continue fi echo -e "GitHub request failed for an unknown reason:\n$(echo "$PR_DATA" | sed '/^$/q')" >&2 - echo "Assuming base ref is master" >&2 - echo "master" - exit 0 + exit 1 done From db8160c458b3ab17a910fde677f75d36c6b68113 Mon Sep 17 00:00:00 2001 From: "Santiago M. Mola" Date: Tue, 1 Jul 2025 11:25:43 +0200 Subject: [PATCH 3/4] Update .gitlab/find-gh-base-ref.sh Co-authored-by: Brice Dutheil --- .gitlab/find-gh-base-ref.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab/find-gh-base-ref.sh b/.gitlab/find-gh-base-ref.sh index 29732fd9b71..eac209e858f 100755 --- a/.gitlab/find-gh-base-ref.sh +++ b/.gitlab/find-gh-base-ref.sh @@ -23,11 +23,11 @@ if [[ -f $CACHE_PATH ]]; then source "$CACHE_PATH" set +a if [[ "$CURRENT_HEAD_SHA" == "${CACHED_HEAD_SHA:-}" && -n "${CACHED_BASE_REF:-}" ]]; then - echo "Cache hit" >&2 + echo "Cache hit on $CACHE_PATH" >&2 echo "$CACHED_BASE_REF" exit 0 else - echo "Cache miss" >&2 + echo "Cache miss on $CACHE_PATH" >&2 fi fi From 9e1a9a1fd9f15bc54af1ac008560c20cee89af04 Mon Sep 17 00:00:00 2001 From: "Santiago M. Mola" Date: Tue, 1 Jul 2025 11:25:49 +0200 Subject: [PATCH 4/4] Update .gitlab/find-gh-base-ref.sh Co-authored-by: Brice Dutheil --- .gitlab/find-gh-base-ref.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab/find-gh-base-ref.sh b/.gitlab/find-gh-base-ref.sh index eac209e858f..e007ab796a2 100755 --- a/.gitlab/find-gh-base-ref.sh +++ b/.gitlab/find-gh-base-ref.sh @@ -8,6 +8,7 @@ if [[ -z "${CURRENT_HEAD_SHA:-}" ]]; then exit 1 fi +# 'workspace' is declared in the ci pipeline cache CACHE_PATH=workspace/find-gh-base-ref.cache save_cache() { local base_ref="$1"