Загрузка данных


.code_quality_sonarqube:
  image: $IMAGE_NAME__SONARSCANNER:$IMAGE_TAG__SONARSCANNER
  variables:
    SONAR_NOTIFICATION: "exit-code"
    SONAR_EXCLUSIONS: ""
    SONAR_CPD_EXCLUSIONS: ""
    SONAR_EXTRA: ""
    SKIP_SONAR_COMPLETELY: "false"
    SONAR_SHORT_WAY: "default"
    GIT_DEPTH: "0"
    GIT_STRATEGY: "clone"
    GIT_CLONE_EXTRA_FLAGS: --filter=blob:limit=1m

  script:
    - | 
      ## ORGANIZATION - признак организации на вышестоящей Gitlab группе проектов
      ## DEPART - признак подразделения на вышестоящей Gitlab группе проектов
      if [ -n "$ORGANIZATION" ]; then
        if [ -z "$DEPART" ] || [ "$DEPART" = "$ORGANIZATION" ]; then
          export PROJECT_KEY_PREFIX="${ORGANIZATION}-${ISYS_NAME}"
        else
          export PROJECT_KEY_PREFIX="${DEPART}"
        fi
      else
        export PROJECT_KEY_PREFIX="${DEPART:-$CI_PROJECT_NAME}"
      fi
    - export SONAR_PROJECT_KEY=${PROJECT_KEY_PREFIX//"/"/"-"}-${CI_PROJECT_ID}
    - export SONAR_PROJECT_NAME="$(echo -n ${CI_PROJECT_TITLE} \(${CI_PROJECT_NAME}-${CI_PROJECT_ID}\) | perl -Wpe 's/ +/_/g')"
    - export SONAR_SCANNER_OPTS="-XX:MaxRAMPercentage=80.0 -XX:MinRAMPercentage=80.0 -XX:+UseTransparentHugePages ${SONAR_SCANNER_OPTS}"
    - |
      # Подмена значения SONARQUBE_URL нужным шардом, на основании информации из API SONARQUBE_PROXY_URL
      if [ -n "$SONARQUBE_PROXY_URL" ]; then
        echo "Найден sonar-proxy $SONARQUBE_PROXY_URL, будет выполнено определение сервера SonarQube для системы $ISYS_NAME"
        SONARQUBE_SHARD_INFO=$(curl -f --retry 10 --retry-delay 1 "$SONARQUBE_PROXY_URL/v1/api/resolve/system/shard?systemName=$ISYS_NAME")
        if [ $? -ne 0 ]; then
          echo "Не удалось определить сервер SonarQube, повторите попытку или обратитесь к администраторам." >&2
          exit 1
        fi
        echo "Для системы $ISYS_NAME получена информация о сервере SonarQube $SONARQUBE_SHARD_INFO"
        SONARQUBE_SHARD_URL=$(echo "$SONARQUBE_SHARD_INFO" | jq -r '.host')
        echo "Система $ISYS_NAME будет направлена в $SONARQUBE_SHARD_URL"
        SONARQUBE_URL=$SONARQUBE_SHARD_URL
        SONAR_TOKEN=$(echo $SONARQUBE_SHARDS_TOKENS | base64 -d | jq -r --arg url "$SONARQUBE_URL" '.[] | select(.url == $url).token')
        if [ -z "$SONAR_TOKEN" ]; then
          echo "Не заданы учетные данные для доступа к серверу $SONARQUBE_URL, обратитесь к администраторам." >&2
          exit 1
        fi
      fi
    - |
      # Если событие МР то проверяется diff для мержаемой ветки в ветку назначения
      if [ "$CI_PIPELINE_SOURCE" = "merge_request_event" ]; then
        # Сначала overall анализ source-ветки, плагин sonar Comment Policy использует для анализа разницу между overall code, который на MR не считается
        sonar-scanner \
        -Dsonar.host.url=${SONARQUBE_URL} \
        -Dsonar.projectKey="${SONAR_PROJECT_KEY}" \
        -Dsonar.projectName="${SONAR_PROJECT_NAME}" \
        -Dsonar.branch.name=${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} \
        -Dsonar.sources=${SONAR_SOURCES:-.} \
        -Dsonar.login=${SONAR_TOKEN} \
        $(eval printf '%s\ ' "${SONAR_EXTRA}")
        
        SONAR_PR_PARAMS="-Dsonar.pullrequest.branch=${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME} \
          -Dsonar.pullrequest.key=${CI_MERGE_REQUEST_IID} \
          -Dsonar.pullrequest.base=${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} \
          -Dsonar.appfarm.is_pr=true \
          -Dsonar.appfarm.target=${CI_MERGE_REQUEST_TARGET_BRANCH_NAME} \
          -Dsonar.appfarm.source=${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}"
      # Для веток master и main параметры пустые что бы не проверяли сами себя
      elif [ "$CI_COMMIT_BRANCH" = "master" ] || [ "$CI_COMMIT_BRANCH" = "main" ]; then
        SONAR_PR_PARAMS=""
        NEW_CODE_REFERENCE_BRANCH=""
      # При коммите в ветку или запуске pipeline на ветку через "run pipeline" diff будет проверяться от master
      elif [ "$CI_PIPELINE_SOURCE" == "web" ] || [ "$CI_PIPELINE_SOURCE" == "push" ]; then
        NEW_CODE_REFERENCE_BRANCH="-Dsonar.newCode.referenceBranch=master"
      # В остальных случаях подставляем имя ветки
      else
        SONAR_PR_PARAMS="-Dsonar.branch.name=${CI_COMMIT_REF_NAME}"
      fi
    - sonar-scanner
      -Dsonar.host.url=${SONARQUBE_URL}
      -Dsonar.projectKey="${SONAR_PROJECT_KEY}"
      -Dsonar.projectName="${SONAR_PROJECT_NAME}"
      -Dsonar.projectBaseDir=.
      -Dsonar.qualitygate.wait=true
      -Dsonar.links.scm=${CI_PROJECT_URL}
      -Dsonar.links.ci=${CI_PROJECT_URL}
      -Dsonar.links.homepage=${CI_PROJECT_URL}/pipelines
      -Dsonar.sources=${SONAR_SOURCES:-.}
      -Dsonar.login=${SONAR_TOKEN}
      -Dsonar.gitlab.api_version=v4
      -Dsonar.gitlab.commit_sha=$CI_COMMIT_SHA
      -Dsonar.gitlab.ref_name=$CI_COMMIT_REF_NAME
      -Dsonar.gitlab.project_id=$CI_PROJECT_ID
      -Dsonar.gitlab.url=${CI_SERVER_URL}
      -Dsonar.gitlab.user_token=${CODEREVIEWER_TOKEN}
      $SONAR_PR_PARAMS
      $NEW_CODE_REFERENCE_BRANCH
      -Dsonar.scm.provider=git
      -Dsonar.gitlab.failure_notification_mode=${SONAR_NOTIFICATION:-exit-code}
      -Dsonar.exclusions=${SONAR_EXCLUSIONS}
      -Dsonar.cpd.exclusions=${SONAR_CPD_EXCLUSIONS}
      -Dsonar.ws.timeout=${SONAR_ANALYSIS_TIMEOUT:-800}
      -Dsonar.qualitygate.timeout=${SONAR_QUALITYGATE_TIMEOUT:-800}
      -Dsonar.verbose=${SONAR_VERBOSE:-false}
      $(eval printf '%s\ ' "${SONAR_EXTRA}")
  dependencies: []