Загрузка данных
.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: []