#!groovy node { def testsFailed = false try { stage('Checkout') { dir("cucumber/features") { // clean old features from last run, if it failed deleteDir() } checkout scm } stage('Export feature files') { step([$class: 'XrayExportBuilder', serverInstance: '89d8e9d1-8aff-4f28-8830-5d1217f0d789', filter: '12407', filePath: 'cucumber/features', ]) } stage('Test') { withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: "${credentials}", usernameVariable: 'CRED_USER', passwordVariable: 'CRED_PASSWORD']]) { docker.image("registry.nspop.dk/tools/node-chrome:18").inside("--entrypoint=''"){ dir("cucumber") { sh "npm install" try { sh "mkdir -p target" sh "DRG_USER=\"${CRED_USER}\" DRG_PASSWORD=\"${CRED_PASSWORD}\" ENV=\"${ENVIRONMENT}\" npm run test" } catch (err) { // dont yell - we upload test report testsFailed = true } } } } } } catch (err) { slackSend channel: 'arosii_ci', color: 'bad', message: "${env.JOB_NAME} ${env.BUILD_NUMBER} - Jenkinsjob failed ... (<${env.BUILD_URL}|Open>)", tokenCredentialId: 'Slack-Token' throw err } finally { stage('Archive') { cucumber( reportTitle: 'SKR_NRT', fileIncludePattern: 'cucumber/target/*.json', trendsLimit: 10, ) if (testsFailed) { if (fileExists("cucumber/target/report.json")) { String reportJson = readFile("cucumber/target/report.json") String[] lines = reportJson.split("\n") def fails = lines.findAll{ line-> line =~ "\"status\": \"failed\""}.size() slackSend channel: 'arosii_ci', color: 'bad', message: "${env.JOB_NAME} ${env.BUILD_NUMBER} A total of ${fails} tests failed ... (<${env.BUILD_URL}|Open>)", tokenCredentialId: 'Slack-Token' } else { slackSend channel: 'arosii_ci', color: 'bad', message: "${env.JOB_NAME} ${env.BUILD_NUMBER} - Tests failed ... (<${env.BUILD_URL}|Open>)", tokenCredentialId: 'Slack-Token' println("no file found") } } if (fileExists("cucumber/target/report.json")) { step([$class: 'XrayImportBuilder', serverInstance: '89d8e9d1-8aff-4f28-8830-5d1217f0d789', projectKey: 'NRT', endpointName: '/cucumber', importFilePath: 'cucumber/target/report.json', importToSameExecution: 'true' ]) def log = currentBuild.rawBuild.getLog(2000000) def pattern = /"testExecIssue":\{"id":"(\d+)","key":"[^"]+","self":"([^"]+)"\}/ def testExecIssueSelfLink for (String line : log) { def matcher = (line =~ pattern) if (matcher.find()) { testExecIssueSelfLink = matcher.group(2) //issue link break } } if(testExecIssueSelfLink != null){ withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: "bb69c5ba-a22f-44e7-99fa-07f1975fa9a2", usernameVariable: 'USER', passwordVariable: 'PASSWORD']]) { def now = new Date().format("dd/MM/yyyy HH:mm", TimeZone.getTimeZone('CET')) sh(script: """curl -X PUT "${testExecIssueSelfLink}" -H "Content-Type: application/json" -u "${USER}:${PASSWORD}" -d '{"fields": {"summary": "${env.JOB_NAME} - ${now}"}}'""", returnStdout: true) } } } } stage ('Clean') { deleteDir() } } }