Формирование сводного отчета Allure при последовательном запуске 2-х и более итераций VB/ADD с разным набором сценариев

jenkins
add

#1

Есть такая ситуация, что запуск VB выполняется в 2-х шагах пайплайна последовательно c разным набором сценариев и получается что в отчет Алюра попадают только результаты второго шага.
Можно как-то сделать чтобы оба попадали?
Отдельно вопрос что делать если нужно параллельно запустить?


#2

Я ставлю параметр ДобавлятьКИмениСценарияУловияВыгрузки. И это спасает.
Параллельно запускается несколько сборок в рамках одно шага.

Могу приложить Jenkinsfile


#3

@KrapivinAndrey Покажи примерчик, плз!


#4

#!groovy

@Library(‘MainLibrary@master’)

def xUnitConfOF = [“xUnit_BP_1_6”, “xUnit_BP_2_0”, “xUnit_UT_10_3”, “xUnit_KA_1_1”, “xUnit_UPP_1_3”];
def xUnitConfUF = [“xUnit_UT_11_1”, “xUnit_UNF_1_6”, “xUnit_ROZN_2_2”];
def vanessaConf = [“UT_11_3_Supp”, “UT_11_4_Supp_WO”];

def parallelStagesOF = xUnitConfOF.collectEntries {
[“xUnit ${it}” : xUnitStep(it)]
}

def parallelStagesUF = xUnitConfUF.collectEntries {
[“xUnit ${it}” : xUnitStep(it)]
}

def parallelStagesPreparexUnitOF = xUnitConfOF.collectEntries {
[“Prepare ${it}” : preparexUnitStep(it)]
}

def parallelStagesPreparexUnitUF = xUnitConfUF.collectEntries {
[“Prepare ${it}” : preparexUnitStep(it)]
}

def parallelStagesPrepareVanessa = vanessaConf.collectEntries {
[“Prepare ${it}” : prepareVBStep(it)]
}

def xUnitStep(synonym) {
return {
cmd “vrunner xunit ./tests --settings ./tools/JSON/${synonym}/Settings.json --xddExitCodePath ./Build/${synonym}_xddExitCodePath.txt --reportsxunit ГенераторОтчетаAllureXMLВерсия2{./Build/allurereport/${synonym}.xml}”
}
}

def preparexUnitStep(synonym) {
return {
cmd “vrunner init-dev --settings ./tools/JSON/${synonym}/Settings.json”
}
}
def prepareVBStep(synonym) {
return {
cmd “vrunner init-dev --settings ./tools/JSON/${synonym}/Settings.json”
cmd “vrunner run --settings ./tools/JSON/${synonym}/Settings.json”
}
}

def runVanessaTest(synonym) {
def command = “vrunner vanessa --settings ./tools/JSON/${synonym}/Settings.json”
cmd(command)
}

def deployToSVN() {
cmd ‘git show -s --format="%%aN">author.txt’
cmd ‘git show -s --format="%%B">msg.txt’
cmd ‘vrunner run --settings ./tools/JSON/Deploy/Settings.json’
}

def very_secret_key = env.GitLab_Key_EDI

properties (
[
disableConcurrentBuilds(),
gitLabConnection(‘Label’),
buildDiscarder(logRotator(artifactDaysToKeepStr: ‘’, artifactNumToKeepStr: ‘’, daysToKeepStr: ‘5’, numToKeepStr: ‘20’)),
pipelineTriggers([
[
$class: ‘GitLabPushTrigger’,
branchFilterType: ‘All’,
triggerOnPush: true,
triggerOnMergeRequest: true,
triggerOpenMergeRequestOnPush: “never”,
triggerOnNoteRequest: true,
noteRegex: “Еще раз”,
skipWorkInProgressMergeRequest: true,
secretToken: very_secret_key,
ciSkip: false,
setBuildDescription: true,
addNoteOnMergeRequest: true,
addCiMessage: true,
addVoteOnMergeRequest: true,
acceptMergeRequestOnSuccess: false,
branchFilterType: “NameBasedFilter”,
includeBranchesSpec: “”,
excludeBranchesSpec: “”,
]
])
]
)

node (‘master’) {
stage (‘Checkout scm’) {

    GL_running('1. Checkout')
	checkout scm
	cmd 'git clean -fdx'
	stash excludes: '**/src/*', name: 'repo'
    GL_success('1. Checkout')
}

}
node (‘Cloud’) {
stage(‘Unit OF tests’) {

    cleanWs deleteDirs: true
    unstash 'repo'
    GL_running('2. Unit OF tests')
    timeout(time: 30, unit: 'MINUTES') {
        try {
            echo 'Prepare bases for tests'
            parallel parallelStagesPreparexUnitOF

            echo 'Run tests'
            parallel parallelStagesOF
        
            GL_success('2. Unit OF tests')
        } catch(e) {
            echo "xUnit OF tests status: ${e}"
            sleep 2
            setStatusByExeption(e)
            GL_failed('2. Unit OF tests')
        }
    }

    stash allowEmpty: true, includes: 'Build/allurereport/**', name: 'xUnitOF'

}

stage('Unit UF tests') {

    cleanWs deleteDirs: true
    unstash 'repo'
    GL_running('3. Unit UF tests')
    timeout(time: 30, unit: 'MINUTES') {
        try {
            echo 'Prepare bases for tests'
            parallel parallelStagesPreparexUnitUF

            echo 'Run tests'
            parallel parallelStagesUF
        
            GL_success('3. Unit UF tests')
        } catch(e) {
            echo "xUnit UF tests status: ${e}"
            sleep 2
            setStatusByExeption(e)
            GL_failed('3. Unit UF tests')
        }
    }

    stash allowEmpty: true, includes: 'Build/allurereport/**', name: 'xUnitUF'

}
stage('UI tests') {
    cleanWs deleteDirs: true
    unstash 'repo'
    GL_running('4. UI tests')
    timeout(time: 30, unit: 'MINUTES') {
        try {
            echo 'Prepare bases for tests'
            parallel parallelStagesPrepareVanessa

            echo 'Run tests'
            runVanessaTest 'UT_11_3_Supp'
            runVanessaTest 'UT_11_4_Supp_WO'

            GL_success('4. UI tests')
        
        } catch(e) {
            echo "UI tests status: ${e}"
            sleep 2
            setStatusByExeption(e)
            GL_failed('4. UI tests')
        }
    }

    stash allowEmpty: true, includes: 'Build/allurereport/**', name: 'UI'
}

}
node (‘master’) {
stage(‘Reports’) {

    cleanWs deleteDirs: true, patterns: [[pattern: 'Build/allurereport/**', type: 'INCLUDE']]
    GL_running('5. Reports')
    try {
        unstash 'xUnitOF' 
    } catch (e) {
        echo 'No xUnit OF results'
    }
    try {
        unstash 'xUnitUF' 
    } catch (e) {
        echo 'No xUnit UF results'
    }
    try {
        unstash 'UI'
    } catch (e) {
        echo 'No UI results'
    }
    try {
	    allure commandline: 'allure2', includeProperties: false, jdk: '', report: 'Build/allure-report', results: [[path: 'Build'],[path: 'Build/allurereport'], [path: 'Build/ScreenShots']]
    } catch (e) {
	    echo "allure status : ${e}"
    }
    GL_success('5. Reports')
    jenekCheckMR()
        
}
stage('Deploy') {
    GL_running('6. Deploy')
    timeout(time: 3, unit: 'MINUTES') {
		try {
			if ((env.BRANCH_NAME == 'develop' || env.gitlabTargetBranch == 'develop') && currentBuild.result == 'SUCCESS') {
				deployToSVN()
                archiveArtifacts allowEmptyArchive: true, artifacts: 'My.epf', onlyIfSuccessful: true
	        }
            GL_success('6. Deploy')
		} catch (e) {

			echo "Deploy to SVN status : ${e}"
            GL_failed('6. Deploy')
		}
	}
}
stage('Static analyze') {
    GL_running('7. Static analyze')
    timeout(time: 30, unit: 'MINUTES') {
		echo "Code duplication"
		cmd 'cpd -d src/My/ -i *.bsl -r pmd -f cpd.xml ||exit 0'

		echo "Cyclomatic complexy"
		cmd 'oscript ./tools/OScript/Cyclo.os ./src/My ccm.xml checkstyle.xml cyclo.txt||exit 0'

		echo "Reports"
		dry defaultEncoding: 'UTF-8', healthy: '', pattern: 'cpd.xml', unHealthy: ''
        checkstyle defaultEncoding: 'UTF-8', healthy: '', pattern: 'checkstyle.xml', unHealthy: ''

    }
    GL_success('7. Static analyze')
}

}


#5

И пример JSON

{
“ИмяСборки”: “Behavior UT 11.3 Supp”,
“КаталогФич”: “$workspaceRoot/features/”,
“КаталогиБиблиотек”: [
“$workspaceRoot/features/Lib”,
“./features/Libraries”
],
“ВыполнитьСценарии”: “Истина”,
“ЗавершитьРаботуСистемы”: “Истина”,
“ВыгружатьСтатусВыполненияСценариевВФайл”: “Истина”,
“ПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев”: “$workspaceRoot/Build/BuildStatus.log”,
“ДелатьОтчетВФорматеАллюр”: “Истина”,
“КаталогOutputAllureБазовый”: “$workspaceRoot/Build/allurereport”,
“ДелатьСкриншотПриВозникновенииОшибки”: “Истина”,
“КомандаСделатьСкриншот”: ‘“C:/Program Files/IrfanView/i_view64.exe” /capture=1 /convert=’,
“КаталогOutputСкриншоты”: “$workspaceRoot/Build/ScreenShots”,
“СоздаватьПодкаталогВКаталогеAllureДляЭтойСборки”: “Ложь”,
“ДобавлятьКИмениСценарияУловияВыгрузки”: “Истина”,
“СписокТеговИсключение”: [
“IgnoreOnUITests”,
“Ignore”
]
}


#6

@KrapivinAndrey Я правильно понимаю, что ты делаешь stash для результататов тестов для allure, а потом все их собираешь и генеришь отчет?


#7

Да, потому что у меня Master и Cloud это разные машины. Точнее Cloud это три машины…


#8

У тебя тут ошибка: вместо “Условия” - “Уловия”: Это твоя опечатка сейчас? Это опечатка в VB? Параметр не используется на самом деле? :slight_smile:


#9

Это в VB ошибка. Я о ней делал issue - сказали менять не будем, так как много у кого уже используется


#10

В АДД исправлено вроде бы


#11

а можно складывать на мастер без стеша если использовать filepath

def createFilePath(path) {
	if (env['NODE_NAME'] == null) {
		error "envvar NODE_NAME is not set, probably not inside an node {} or running an older version of Jenkins!"
	} else if (env['NODE_NAME'].equals("master")) {
		return new FilePath(new File(path))
	} else {
		return new FilePath(Jenkins.getInstance().getComputer(env['NODE_NAME']).getChannel(), path)
	}
}

#12

А если нод несколько по NODE_NAME?


#13

мой вариант (нода для теста одна и не мастер)

	parallel "Базовые тесты": {
			if(needBase) {
				timeout(180) {
					cmdTry("bia-autotest ./ ./allure-reports", "Статический анализ завершен с ошибкой.")
				}
			}
		},

		"Юнит-тестирование": {
			if(needXUnit) {
				timeout(120) {
					def xunitParams = "--settings ${pathVRunnerCFG('xunit')}"
					cmdTry("vrunner xunit ${xunitParams}", "Юнит-тестирование завершено с ошибкой.")
				}
			}
		},

		"Сценарное тестирование": {
			if(needVanessa) {
				timeout(120) {
					def vanessaParams = "--settings ${pathVRunnerCFG('vanessa')}"
					cmdTry("vrunner vanessa ${vanessaParams}", "Сценарное тестирование завершено с ошибкой.")
				}
			}
		}

	try {
		allure jdk: '', results: [[path: 'allure-reports/base'], [path: 'allure-reports/vanessa'], [path: 'allure-reports/xUnit']]
		junit keepLongStdio: true, testResults: '**/*junit.xml'
	}
	catch(err) {
              analizeErrorTest(err)
        }
        
       return analizeTests()


#14

Похоже что нет, потому что у меня на add собирается с этим же параметром.


#15

имена у нод разные - использую тэги для группировки


#16

Проверил - исправили


#17

А при таком подходе не слишком много данных через мастер гоняются. У меня просто мастер и слайвы далеко друг от друга.


#18

Надо понимать, что стэш лимитирован по размеру, а артефакты могу занимать 10 и сотни мегов.


#19

stash : Stash some files to be used later in the build

Saves a set of files for use later in the same build, generally on another node/workspace. Stashed files are not otherwise available and are generally discarded at the end of the build. Note that the stash and unstash steps are designed for use with small files. For large data transfers, use the External Workspace Manager plugin, or use an external repository manager such as Nexus or Artifactory. This is because stashed files are archived in a compressed TAR, and with large files this demands considerable on-master resources, particularly CPU time. There’s not a hard stash size limit, but between 5-100 MB you should probably consider alternatives.