/
laritsiuriumov
/
aef-manager-python-services
Обзор
Документация
Войти
/
laritsiuriumov
/
aef-manager-python-services
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
Jenkinsfile
207 строк
10 KB
Цюрюмов Лари Валерьевич [B]
Jenkins file fix
13 май 2026, 17:33
13 май 2026, 17:33
418883b
Код
Авторство
О чём код?
def SCENARIO_CATALOG = [ 'ALL | Все blackbox-сценарии gr-processor': '', 'GR-PROCESSOR-HEALTH-001 | Эндпоинт health возвращает статус сервиса': 'GR-PROCESSOR-HEALTH-001', 'GR-PROCESSOR-METRICS-001 | Egress от gr-proxy формирует агрегированную метрику запроса': 'GR-PROCESSOR-METRICS-001', 'GR-PROCESSOR-METRICS-002 | Неуспешный guardrail trace формирует proxy-метрику и alert-метрику': 'GR-PROCESSOR-METRICS-002', 'GR-PROCESSOR-METRICS-003 | Ошибка 5xx от gr-proxy формирует total-метрику и failed-метрику': 'GR-PROCESSOR-METRICS-003', 'GR-PROCESSOR-METRICS-004 | Прямой egress в gigachat формирует gigachat_total': 'GR-PROCESSOR-METRICS-004', 'GR-PROCESSOR-METRICS-005 | Check-only запрос gr-proxy учитывается как total-метрика': 'GR-PROCESSOR-METRICS-005', 'GR-PROCESSOR-METRICS-006 | Два агента в одном окне получают отдельные total-метрики': 'GR-PROCESSOR-METRICS-006', 'GR-PROCESSOR-METRICS-007 | Failed trace и egress второго агента формируют независимые метрики': 'GR-PROCESSOR-METRICS-007', 'GR-PROCESSOR-METRICS-008 | Ошибка gr-proxy и прямой gigachat формируют разные типы метрик': 'GR-PROCESSOR-METRICS-008' ] def SCENARIO_CHOICES = '''ALL | Все blackbox-сценарии gr-processor GR-PROCESSOR-HEALTH-001 | Эндпоинт health возвращает статус сервиса GR-PROCESSOR-METRICS-001 | Egress от gr-proxy формирует агрегированную метрику запроса GR-PROCESSOR-METRICS-002 | Неуспешный guardrail trace формирует proxy-метрику и alert-метрику GR-PROCESSOR-METRICS-003 | Ошибка 5xx от gr-proxy формирует total-метрику и failed-метрику GR-PROCESSOR-METRICS-004 | Прямой egress в gigachat формирует gigachat_total GR-PROCESSOR-METRICS-005 | Check-only запрос gr-proxy учитывается как total-метрика GR-PROCESSOR-METRICS-006 | Два агента в одном окне получают отдельные total-метрики GR-PROCESSOR-METRICS-007 | Failed trace и egress второго агента формируют независимые метрики GR-PROCESSOR-METRICS-008 | Ошибка gr-proxy и прямой gigachat формируют разные типы метрик''' pipeline { agent { label 'sbel9&&clearAgent' } options { timestamps() disableConcurrentBuilds() buildDiscarder(logRotator(numToKeepStr: '20')) } parameters { choice( name: 'SCENARIO', choices: SCENARIO_CHOICES, description: 'Выбери ALL для полного запуска или конкретный blackbox-сценарий gr-processor.' ) string( name: 'SCENARIO_ID_OVERRIDE', defaultValue: '', description: 'Необязательный override. Если заполнен, имеет приоритет над SCENARIO. Пример: GR-PROCESSOR-METRICS-001' ) string( name: 'EXTRA_BLACKBOX_ARGS', defaultValue: '', description: 'Дополнительные аргументы blackbox/pytest' ) } stages { stage('Resolve run target') { steps { script { String defaultScenario = SCENARIO_CATALOG.keySet().first() String selectedScenario = params.SCENARIO?.trim() ?: defaultScenario String scenarioId = selectedScenario.tokenize('|')[0].trim() String catalogScenarioId = SCENARIO_CATALOG[selectedScenario] ?: '' String overrideScenarioId = params.SCENARIO_ID_OVERRIDE?.trim() String effectiveScenarioId = overrideScenarioId ?: catalogScenarioId env.SELECTED_SCENARIO = selectedScenario env.SELECTED_SCENARIO_ID = effectiveScenarioId env.SELECTED_BLACKBOX_FILTER = effectiveScenarioId ? "-k ${effectiveScenarioId}" : '' currentBuild.displayName = "#${env.BUILD_NUMBER} ${effectiveScenarioId ?: scenarioId}" currentBuild.description = overrideScenarioId ? "Manual override -> ${overrideScenarioId}" : (effectiveScenarioId ? "${selectedScenario} -> ${effectiveScenarioId}" : "${selectedScenario} -> full suite") echo "Selected scenario: ${selectedScenario}" echo effectiveScenarioId ? "Effective scenario id: ${effectiveScenarioId}" : 'Effective scenario id: ALL' } } } stage('Checkout application') { steps { checkout scm } } stage('Resolve Python tool') { steps { script { String pythonHome = '' try { pythonHome = tool name: 'python3.14.3-test', type: 'com.cloudbees.jenkins.plugins.customtools.CustomTool' } catch (Exception ignored) { echo 'Jenkins custom tool python3.14.3 was not resolved; falling back to PATH lookup.' } env.PYTHON_HOME = pythonHome ?: '' echo "pythonHome=${env.PYTHON_HOME}" } sh ''' set -e if [ -n "$PYTHON_HOME" ] && [ -x "$PYTHON_HOME/bin/python3" ]; then PYTHON_BIN="$PYTHON_HOME/bin/python3" elif [ -n "$PYTHON_HOME" ] && [ -x "$PYTHON_HOME/bin/python" ]; then PYTHON_BIN="$PYTHON_HOME/bin/python" elif [ -n "$PYTHON_HOME" ] && [ -x "$PYTHON_HOME/python3" ]; then PYTHON_BIN="$PYTHON_HOME/python3" elif [ -n "$PYTHON_HOME" ] && [ -x "$PYTHON_HOME/python" ]; then PYTHON_BIN="$PYTHON_HOME/python" elif command -v python3.14 >/dev/null 2>&1; then PYTHON_BIN="$(command -v python3.14)" else echo "Python 3.14 executable was not found. Configure Jenkins custom tool python3.14.3 or expose python3.14 in PATH." exit 1 fi "$PYTHON_BIN" - <<'PY' import sys if sys.version_info < (3, 13): raise SystemExit(f"Python >=3.13 is required by services/gr-processor, got {sys.version.split()[0]}") print("executable:", sys.executable) print("version:", sys.version) PY echo "$PYTHON_BIN" > .python-bin ''' } } stage('Install dependencies') { steps { withCredentials([ string(credentialsId: 'aef_controller_ift_tuz_cab-sa-dvo10117_OSC', variable: 'TOKEN_OSC'), usernamePassword( credentialsId: 'cab-sa-dvo10117_fqdn_user_pass', usernameVariable: 'NEXUS_USERNAME', passwordVariable: 'NEXUS_PASSWORD' ) ]) { sh ''' set -e PYTHON_BIN="$(cat .python-bin)" BLACKBOX_DIR="$WORKSPACE/blackbox" BLACKBOX_VENV="$WORKSPACE/.blackbox-bootstrap-venv" SERVICE_DIR="$WORKSPACE/services/gr-processor" SERVICE_VENV="$SERVICE_DIR/.venv" SERVICE_BLACKBOX_VENV="$SERVICE_DIR/.blackbox_venv" if [ ! -f "$BLACKBOX_DIR/pyproject.toml" ]; then echo "Vendored blackbox was not found at $BLACKBOX_DIR" exit 1 fi rm -rf "$BLACKBOX_VENV" "$SERVICE_VENV" "$SERVICE_BLACKBOX_VENV" "$PYTHON_BIN" -m venv "$BLACKBOX_VENV" cd "$BLACKBOX_DIR" "$BLACKBOX_VENV/bin/python" -m pip install -r requirements.txt cd "$WORKSPACE" "$PYTHON_BIN" -m venv "$SERVICE_VENV" "$SERVICE_VENV/bin/python" -m pip install -r "$SERVICE_DIR/requirements.txt" ''' } } } stage('Run Blackbox tests') { steps { withCredentials([ string(credentialsId: 'aef_controller_ift_tuz_cab-sa-dvo10117_OSC', variable: 'TOKEN_OSC'), usernamePassword( credentialsId: 'cab-sa-dvo10117_fqdn_user_pass', usernameVariable: 'NEXUS_USERNAME', passwordVariable: 'NEXUS_PASSWORD' ) ]) { sh ''' set -e mkdir -p "$WORKSPACE/blackbox-results" "$WORKSPACE/.blackbox-bootstrap-venv/bin/blackbox" \ -tf "$WORKSPACE/services/gr-processor/targets.yaml" \ --n-threads 1 \ -v \ --junitxml "$WORKSPACE/blackbox-results/junit.xml" \ ${SELECTED_BLACKBOX_FILTER} \ ${EXTRA_BLACKBOX_ARGS} ''' } } } } post { always { junit testResults: 'blackbox-results/*.xml', allowEmptyResults: true archiveArtifacts artifacts: 'blackbox-results/**, blackbox/logs/**', allowEmptyArchive: true } } }