Commit 1766175c authored by Miguel Angel Reina Ortega's avatar Miguel Angel Reina Ortega
Browse files

Cross checking support for conflicting merge requests

parent c16e9201
Loading
Loading
Loading
Loading
+66 −35
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ echo "CI_PROJECT_NAME:" $7
echo "GITLAB_USER_NAME:" $8
#$GITLAB_USER_EMAIL -> 9
echo "GITLAB_USER_EMAIL:" $9
#CONFLICTING_MERGE_REQUEST -> 11
echo "CONFLICTING_MERGE_REQUEST:" $CONFLICTING_MERGE_REQUEST

#echo "------ Removing previous outputs --------"
rm **/*.txt
@@ -45,12 +47,31 @@ echo "Checkout merge request source branch ${6} ..."
git checkout -b "${6}" "origin/${6}" #Git checkout actual merge requests SOURCE BRANCHE
git status

if [ ! -z $CONFLICTING_MERGE_REQUEST ] ; then
    echo "\n------ Getting a conflicting merge request --------"
    mr_source_branch=${$CONFLICTING_MERGE_REQUEST}
    echo "Checkout conflicting merge request source branch ${mr_source_branch} ..."
    git checkout -b "${mr_source_branch}" "origin/${mr_source_branch}" #Git checkout other merge requests SOURCE BRANCHES
    echo "Run dry merge from conflicting merge request source branch ${mr_source_branch} into actual merge request source branch ${6} ..."
    git merge --no-commit --no-ff "${6}" #SOURCE BRANCH of the merge request
    result=$?
    if [ ! $result == 0 ] ; then
      echo "Merge request title: ${mr_source_branch}" >> conflicting_merge_requests.txt
    else
      echo "No conflict with Merge request title: ${mr_source_branch}"
    fi
    git merge --abort

else
  echo "\n------ Getting all potential conflicting merge requests --------"
  # Get a list of open merge requests: Filter by the same Milestone and Target Branch as the actual merge request

  #curl --header "PRIVATE-TOKEN: ${10}" "${1}/projects/${2}/merge_requests?state=opened&milestone=${3}&target_branch=${4}" |jq -c '.[] | {iid: .iid, source_branch: .source_branch, title: .title}'
  #curl --header "PRIVATE-TOKEN: ${10}" "${1}/projects/${2}/merge_requests?state=opened&milestone=${3}&target_branch=${4}" | jq -c '.[]' | while read mr; do
  #merge_requests=$(curl --header "PRIVATE-TOKEN: ${10}" "${1}/projects/${2}/merge_requests?state=opened&milestone=${3}&target_branch=${4}")

  # Initialize an empty array to store conflicting merge requests
  conflicting_merge_request_ids=()
  merge_requests=$(curl "${1}/projects/${2}/merge_requests?state=opened&milestone=${3}&target_branch=${4}")
  echo "${merge_requests}" | jq -c '.[]' | while read mr; do
    mr_id=$(echo "$mr" | jq '.iid')
@@ -71,7 +92,7 @@ echo "${merge_requests}" | jq -c '.[]' | while read mr; do
      echo "ERROR: When retrieving merge request source branch"
      continue
    fi
  if [ ${mr_id} != ${5} ]; then
    if [ ${mr_id} != ${5} ] && [ ${mr_id} -lt ${5} ]; then
      echo "Checkout potential merge request source branch ${mr_source_branch} ..."
      git checkout -b "${mr_source_branch}" "origin/${mr_source_branch}" #Git checkout other merge requests SOURCE BRANCHES
      echo "Run dry merge from potential merge request source branch ${mr_source_branch} into actual merge request source branch ${6} ..."
@@ -79,6 +100,15 @@ echo "${merge_requests}" | jq -c '.[]' | while read mr; do
      result=$?
      if [ ! $result == 0 ] ; then
        echo "Merge request title: ${mr_title}, Merge Request ID: ${mr_id}" >> conflicting_merge_requests.txt
        conflicting_merge_request_ids+=("${mr_id}")
        # Trigger pipeline for conflicting merge requests
        echo "Triggering pipeline for merge request ${mr_id}"
        curl -X POST \
          --fail \
          -F token=${10} \
          -F ref=${mr_source_branch} \
          -F "variables[CONFLICTING_MERGE_REQUEST]=${mr_source_branch}" \
          ${1}/projects/${2}/trigger/pipeline
      else
        echo "No conflict with Merge request title: ${mr_title}, Merge Request ID: ${mr_id}"
      fi
@@ -86,6 +116,7 @@ echo "${merge_requests}" | jq -c '.[]' | while read mr; do
    fi

  done
fi

if [ -f "conflicting_merge_requests.txt" ]; then
  echo "List of conflicting merge requests:"
+7 −2
Original line number Diff line number Diff line
@@ -7,11 +7,11 @@
workflow:
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event" # Creation of Merge Request (generation of CR)
    - if: $CI_PIPELINE_SOURCE == "trigger" # Upgrade of the index.html page
    - if: $CI_COMMIT_TAG # Creation of tag (publish spec)
    - if: $CI_PIPELINE_SOURCE == "web" # Removal of a specific entry
    - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
      when: never # Pipeline to be run manually as defined in the contribution procedure as it is not known when the CR is ready
    - if: $CI_PIPELINE_SOURCE == "trigger" # Upgrade of the index.html page

variables:

@@ -26,6 +26,9 @@ Checking conflicts:
  rules:
    - if: $CI_MERGE_REQUEST_TITLE !~ /v.*_baseline$/ && $CI_PIPELINE_SOURCE == "merge_request_event"
      when: always
    - if: $CI_MERGE_REQUEST_TITLE !~ /v.*_baseline$/ && $CI_PIPELINE_SOURCE == "trigger"
      when: always
  allow_failure: true
  image: python:3.9.18-slim-bullseye
  tags:
    - docker
@@ -38,7 +41,7 @@ Checking conflicts:
    - git clone "https://$CI_SERVER_HOST/$CI_PROJECT_PATH.git" ${CI_PROJECT_NAME}
  script:
    - echo 'Checking conflicts'
    - ./checking_conflicts.sh ${CI_API_V4_URL} ${CI_MERGE_REQUEST_PROJECT_ID} ${CI_MERGE_REQUEST_MILESTONE} ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} ${CI_MERGE_REQUEST_IID} ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} ${CI_PROJECT_NAME} "$GITLAB_USER_NAME" $GITLAB_USER_EMAIL
    - ./checking_conflicts.sh ${CI_API_V4_URL} ${CI_MERGE_REQUEST_PROJECT_ID} ${CI_MERGE_REQUEST_MILESTONE} ${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} ${CI_MERGE_REQUEST_IID} ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} ${CI_PROJECT_NAME} "$GITLAB_USER_NAME" $GITLAB_USER_EMAIL $CHECKING_CONFLICTS_TOKEN $CONFLICTING_MERGE_REQUEST
  artifacts:
    when: on_failure
    paths:
@@ -50,6 +53,8 @@ Word CR:
  rules:
    - if: $CI_MERGE_REQUEST_TITLE !~ /v.*_baseline$/ && $CI_PIPELINE_SOURCE == "merge_request_event"
      when: on_success
    - if: $CI_MERGE_REQUEST_TITLE !~ /v.*_baseline$/ && $CI_PIPELINE_SOURCE == "trigger"
      when: on_success
  dependencies: []
  when: on_success
  before_script: