#!/usr/bin/env groovy library 'status-jenkins-lib@v1.8.6' pipeline { agent { dockerfile { label 'linux' dir 'ci' } } parameters { string( name: 'ITERATIONS', description: 'Number of repeated integration test runs', defaultValue: params.ITERATIONS ?: '1000' ) } environment { /* Avoid cache poisoning by other jobs. */ GOCACHE = "${env.WORKSPACE_TMP}/go-build" GOPATH = "${env.WORKSPACE_TMP}/go" RUST_BACKTRACE = 1 } options { disableConcurrentBuilds() buildDiscarder(logRotator( numToKeepStr: '20', daysToKeepStr: '30', )) } stages { stage('Integration Tests') { matrix { axes { axis { name 'FEATURE' values 'libp2p' } } stages { stage('Tests') { options { lock('sync-integration-${env.GIT_COMMIT}') } stages { stage("BuildAndTest") { steps { script { /* This will be overwritten if job succeeds */ writeFile(file: "${WORKSPACE}/report.txt", text: "Job failed to start.") /* To prevent rebuilding node for each test, tests are defined here */ def tests = ['two_nodes_happy', 'disseminate_and_retrieve'] def report = runBuildAndTestsForFeature(FEATURE, tests) writeFile(file: "${WORKSPACE}/report.txt", text: report) } } } } } } } } } post { always { script { def report = readFile("${WORKSPACE}/report.txt").trim() discord.send( header: "Nightly Integration Tests ${currentBuild.currentResult}: ${report}", cred: 'nomos-node-discord-commits-webhook', ) } } cleanup { cleanWs() } } } def runBuildAndTestsForFeature(feature, tests) { echo "Building node for feature: ${feature}" def build_node = "cargo build --all --no-default-features --features ${feature}" if (sh(script: build_node, returnStatus: true) != 0) { return reportError("Build '${feature}' node failed") } int iterations = params.ITERATIONS.toInteger() return runTestCases(tests, iterations) } def runTestCases(test_cases, iterations) { for (int i = 0; i < iterations; i++) { echo "Running iteration ${i + 1} of ${iterations}" for (test_case in test_cases) { def test_cmd = "cargo test -p tests --all --no-default-features --features ${feature} ${test_case}" if (sh(script: test_cmd, returnStatus: true) != 0) { return reportError("Test '${test_case}' failed on iteration ${i + 1}") } } } return "${iterations}/${iterations} iterations succeeded" } def reportError(e) { error(e) return e }