From 0045550de5a9ac4836e0fce561f9a890271e8425 Mon Sep 17 00:00:00 2001 From: Aleksei Apaseev Date: Fri, 15 Nov 2024 16:49:42 +0800 Subject: [PATCH] ci: optimize `git diff` handling to address "Argument list too long" error --- .gitlab/ci/common.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.gitlab/ci/common.yml b/.gitlab/ci/common.yml index bfd4a700dc..b655e65147 100644 --- a/.gitlab/ci/common.yml +++ b/.gitlab/ci/common.yml @@ -319,26 +319,32 @@ variables: - *git_init - *git_fetch_from_mirror_url_if_exists - | + # Store the diff output in a temporary file + TEMP_FILE=$(mktemp) # merged results pipelines, by default if [[ -n $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA ]]; then git fetch origin $CI_MERGE_REQUEST_DIFF_BASE_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS} git fetch origin $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS} - export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA) + git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_MERGE_REQUEST_SOURCE_BRANCH_SHA > "$TEMP_FILE" + GIT_DIFF_OUTPUT=$(cat "$TEMP_FILE") git fetch origin $CI_COMMIT_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS} # merge request pipelines, when the mr got conflicts elif [[ -n $CI_MERGE_REQUEST_DIFF_BASE_SHA ]]; then git fetch origin $CI_MERGE_REQUEST_DIFF_BASE_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS} git fetch origin $CI_COMMIT_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS} - export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_COMMIT_SHA) + git diff --name-only $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_COMMIT_SHA > "$TEMP_FILE" + GIT_DIFF_OUTPUT=$(cat "$TEMP_FILE") # other pipelines, like the protected branches pipelines elif [[ "$CI_COMMIT_BEFORE_SHA" != "0000000000000000000000000000000000000000" ]]; then git fetch origin $CI_COMMIT_BEFORE_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS} git fetch origin $CI_COMMIT_SHA --depth=1 ${GIT_FETCH_EXTRA_FLAGS} - export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA) + git diff --name-only $CI_COMMIT_BEFORE_SHA $CI_COMMIT_SHA > "$TEMP_FILE" + GIT_DIFF_OUTPUT=$(cat "$TEMP_FILE") else # pipeline source could be web, scheduler, etc. git fetch origin $CI_COMMIT_SHA --depth=2 ${GIT_FETCH_EXTRA_FLAGS} - export GIT_DIFF_OUTPUT=$(git diff --name-only $CI_COMMIT_SHA~1 $CI_COMMIT_SHA) + git diff --name-only $CI_COMMIT_SHA~1 $CI_COMMIT_SHA > "$TEMP_FILE" + GIT_DIFF_OUTPUT=$(cat "$TEMP_FILE") fi - *git_checkout_ci_commit_sha - *common-before_scripts