#!/usr/bin/env groovy library 'status-jenkins-lib@v1.7.0' pipeline { agent { label 'linux && x86_64 && nix-2.14' } parameters { string( name: 'BRANCH', defaultValue: 'develop', description: 'Name of branch to build.' ) string( name: 'UNIT_TEST_COUNT', defaultValue: getDefaultUnitTestCount(), description: 'How many times to run tests?' ) booleanParam( name: 'UNIT_TEST_FAILFAST', defaultValue: getDefaultUnitTestFailfast(), description: 'Should the job fail fast on first test failure?' ) booleanParam( name: 'UNIT_TEST_RERUN_FAILS', defaultValue: getDefaultUnitTestRerunFails(), description: 'Should the job rerun failed tests?' ) booleanParam( name: 'UNIT_TEST_USE_DEVELOPMENT_LOGGER', defaultValue: getDefaultUnitTestUseDevelopmentLogger(), description: 'Should the job use detailed logging for tests, potentially generating large logs?' ) } options { timestamps() /* Prevent Jenkins jobs from running forever */ timeout(time: getDefaultTimeout(), unit: 'MINUTES') disableConcurrentBuilds() /* manage how many builds we keep */ buildDiscarder(logRotator( numToKeepStr: '5', daysToKeepStr: '30', artifactNumToKeepStr: '1', )) } environment { TARGET = 'tests' DB_CONT = "status-go-test-db-${env.EXECUTOR_NUMBER.toInteger() + 1}" DB_PORT = "${5432 + env.EXECUTOR_NUMBER.toInteger()}" TMPDIR = "${WORKSPACE_TMP}" GOPATH = "${WORKSPACE_TMP}/go" GOCACHE = "${WORKSPACE_TMP}/gocache" PATH = "${PATH}:${GOPATH}/bin" REPO_SRC = "${GOPATH}/src/github.com/status-im/status-go" } stages { stage('Prep') { steps { /* Go needs to find status-go in GOPATH. */ sh "mkdir -p \$(dirname ${REPO_SRC})" sh "ln -s ${WORKSPACE} ${REPO_SRC}" } } stage('Vendor Check') { steps { script { nix.shell('make install-modvendor', pure: false) nix.shell('make vendor', pure: false) /* fail build if vendoring hasn't been done */ nix.shell('git diff --exit-code --no-color --stat vendor/') } } } stage('Migration') { when { // https://github.com/status-im/status-go/issues/4993#issuecomment-2022685544 expression { !isTestNightlyJob() } } steps { script { nix.shell('make migration-check', pure: false) } } } stage('Lint') { steps { script { nix.shell('make lint', pure: true) } } } stage('Canary') { steps { script { nix.shell('make canary-test', pure: true) } } } stage('Unit Tests') { environment { TEST_POSTGRES_PORT = "${env.DB_PORT}" } steps { script { db = docker.image('postgres:9.6-alpine').withRun([ "--name=${DB_CONT}", "--env=POSTGRES_HOST_AUTH_METHOD=trust", "--publish=${DB_PORT}:${DB_PORT}", ].join(' '), "-p ${DB_PORT}") { c -> nix.shell('make generate-handlers', pure: true) nix.shell('make test-unit V=1', pure: false) } } } post { cleanup { /* Leftover DB containers. */ sh "docker rm ${DB_CONT} || true" } } } } // stages post { always { script { env.PKG_URL = "${currentBuild.absoluteUrl}/consoleText" } script { if (isTestNightlyJob()) { archiveArtifacts artifacts: '**/report_*.xml, **/test_*.log' def totalSize = sh(script: "find . -name 'report_*.xml' | xargs wc -c | tail -n1 | awk '{print \$1}'", returnStdout: true).trim() echo "Total size of all report_*.xml files: ${totalSize} bytes" } if (params.UNIT_TEST_RERUN_FAILS) { def rerunReports = findFiles(glob: '**/report_rerun_fails_*.txt') if (rerunReports.length > 0) { archiveArtifacts artifacts: '**/report_rerun_fails_*.txt' } } } junit testResults: '**/report_*.xml', skipOldReports: true, skipPublishingChecks: true, skipMarkingBuildUnstable: true publishHTML target: [ allowMissing: true, alwaysLinkToLastBuild: true, keepAll: true, reportDir: 'reports', reportFiles: 'test_stats.txt', reportName: 'Reports', reportTitles: 'Test Stats' ] } success { script { github.notifyPR(true) } } failure { script { github.notifyPR(false) } } cleanup { dir(env.TMPDIR) { deleteDir() } sh "make git-clean" } } // post } // pipeline def isTestNightlyJob() { env.JOB_BASE_NAME == 'tests-nightly' } def getDefaultUnitTestCount() { isTestNightlyJob() ? '20' : '1' } def getDefaultUnitTestRerunFails() { isTestNightlyJob() ? false : true } def getDefaultUnitTestUseDevelopmentLogger() { isTestNightlyJob() ? false : true } def getDefaultUnitTestFailfast() { isTestNightlyJob() ? false : true } def getDefaultTimeout() { isTestNightlyJob() ? 5*60 : 50 }