ci: stabilize Jenkins jobs and mobile pipeline

This commit is contained in:
2026-04-22 11:27:23 +03:00
parent caf057d712
commit 737bddd631
23 changed files with 762 additions and 66 deletions
+75 -5
View File
@@ -5,29 +5,48 @@ pipeline {
ansiColor('xterm')
}
stages {
stage('Prepare Metadata') {
steps {
script {
wrap([$class: 'BuildUser']) {
env.RUN_TRIGGER_USER = env.BUILD_USER_ID ?: env.BUILD_USER ?: 'system'
env.RUN_TRIGGER_NAME = env.BUILD_USER ?: env.BUILD_USER_ID ?: 'system'
}
currentBuild.displayName = "#${env.BUILD_NUMBER} runner"
currentBuild.description = "by=${env.RUN_TRIGGER_NAME}; qaRef=${params.QA_REPO_REF}; mobileRef=${params.MOBILE_REPO_REF}"
}
}
}
stage('Run Jobs In Parallel') {
steps {
script {
def fanout = [:]
fanout['selenium'] = {
build job: 'qa-selenium-tests',
def run = build job: 'qa-selenium-tests',
wait: true,
propagate: true,
propagate: false,
parameters: [
string(name: 'QA_REPO_URL', value: params.QA_REPO_URL),
string(name: 'QA_REPO_REF', value: params.QA_REPO_REF),
string(name: 'BROWSER', value: params.BROWSER),
string(name: 'BASE_URL', value: params.BASE_URL),
string(name: 'EXECUTION_MODE', value: params.EXECUTION_MODE),
string(name: 'SELENOID_URL', value: params.SELENOID_URL),
string(name: 'HEADLESS', value: params.HEADLESS)
]
writeFile file: 'downstream-selenium.txt', text: "${run.number}|${run.result}\n"
}
fanout['mobile'] = {
build job: 'qa-mobile-appium-tests',
def run = build job: 'qa-mobile-appium-tests',
wait: true,
propagate: true,
propagate: false,
parameters: [
string(name: 'MOBILE_REPO_URL', value: params.MOBILE_REPO_URL),
string(name: 'MOBILE_REPO_REF', value: params.MOBILE_REPO_REF),
string(name: 'MOBILE_MAX_EMULATORS', value: params.MOBILE_MAX_EMULATORS),
string(name: 'JUNIT_PARALLELISM', value: params.JUNIT_PARALLELISM),
string(name: 'APP_URL', value: params.APP_URL),
string(name: 'DB_URL', value: params.DB_URL),
string(name: 'DB_USER', value: params.DB_USER),
@@ -40,13 +59,64 @@ pipeline {
string(name: 'RESERVATION_PASSWORD', value: params.RESERVATION_PASSWORD),
string(name: 'RESERVATION_OWNER', value: params.RESERVATION_OWNER)
]
writeFile file: 'downstream-mobile.txt', text: "${run.number}|${run.result}\n"
}
fanout['api'] = {
build job: 'qa-api-citrus-tests', wait: true, propagate: true
def run = build job: 'qa-api-citrus-tests',
wait: true,
propagate: false,
parameters: [
string(name: 'QA_REPO_URL', value: params.QA_REPO_URL),
string(name: 'QA_REPO_REF', value: params.QA_REPO_REF)
]
writeFile file: 'downstream-api.txt', text: "${run.number}|${run.result}\n"
}
parallel fanout
def parseRun = { String fileName ->
if (!fileExists(fileName)) {
return [number: 'n/a', result: 'NOT_BUILT']
}
def parts = readFile(fileName).trim().tokenize('|')
return [
number: parts ? parts[0] : 'n/a',
result: parts.size() > 1 ? parts[1] : 'UNKNOWN'
]
}
def seleniumRun = parseRun('downstream-selenium.txt')
def mobileRun = parseRun('downstream-mobile.txt')
def apiRun = parseRun('downstream-api.txt')
def lines = []
lines << "job=${env.JOB_NAME}"
lines << "build=${env.BUILD_NUMBER}"
lines << "trigger_user=${env.RUN_TRIGGER_USER}"
lines << "trigger_name=${env.RUN_TRIGGER_NAME}"
lines << "qa_repo_url=${params.QA_REPO_URL}"
lines << "qa_repo_ref=${params.QA_REPO_REF}"
lines << "mobile_repo_url=${params.MOBILE_REPO_URL}"
lines << "mobile_repo_ref=${params.MOBILE_REPO_REF}"
lines << "selenium_build=${seleniumRun.number}"
lines << "selenium_result=${seleniumRun.result}"
lines << "mobile_build=${mobileRun.number}"
lines << "mobile_result=${mobileRun.result}"
lines << "api_build=${apiRun.number}"
lines << "api_result=${apiRun.result}"
lines << "selenium_link=/job/qa-selenium-tests/${seleniumRun.number}/"
lines << "mobile_link=/job/qa-mobile-appium-tests/${mobileRun.number}/"
lines << "api_link=/job/qa-api-citrus-tests/${apiRun.number}/"
lines << "selenium_link_abs=${env.JENKINS_URL}job/qa-selenium-tests/${seleniumRun.number}/"
lines << "mobile_link_abs=${env.JENKINS_URL}job/qa-mobile-appium-tests/${mobileRun.number}/"
lines << "api_link_abs=${env.JENKINS_URL}job/qa-api-citrus-tests/${apiRun.number}/"
writeFile file: 'runner-summary.txt', text: lines.join('\n') + '\n'
archiveArtifacts allowEmptyArchive: false, artifacts: 'runner-summary.txt'
def failed = [seleniumRun, mobileRun, apiRun].any { it.result != 'SUCCESS' }
if (failed) {
error("One or more downstream QA jobs failed. See runner-summary.txt for build links and statuses.")
}
}
}
}