library 'status-jenkins-lib@v1.7.0' pipeline { agent { label 'linux && nix-2.11 && x86_64' } options { timestamps() disableConcurrentBuilds() /* Prevent Jenkins jobs from running forever */ timeout(time: 30, unit: 'MINUTES') /* Go requires a certain directory structure */ checkoutToSubdirectory('src/github.com/waku-org/go-waku') buildDiscarder(logRotator( numToKeepStr: '10', daysToKeepStr: '30', )) } /* WARNING: Defining parameters here with the ?: trick causes them to remember last value. */ parameters { booleanParam( name: 'RACE', description: 'Run tests with check for race condition.', defaultValue: getRaceDefault() ) } environment { TARGET = 'tests' DB_CONT = "go-waku-test-db-${env.EXECUTOR_NUMBER.toInteger() + 1}" DB_PORT = "${5432 + env.EXECUTOR_NUMBER.toInteger()}" REPO = "${env.WORKSPACE}/src/github.com/waku-org/go-waku" GOCACHE = "${env.WORKSPACE_TMP}/go-build" GOPATH = "${env.WORKSPACE}/go" PATH = "${env.PATH}:${env.GOPATH}/bin" /* Necesary to avoid cache poisoning by other builds. */ GOLANGCI_LINT_CACHE = "${env.WORKSPACE_TMP}/golangci-lint" /* Ganache config */ GANACHE_RPC_PORT = "${8989 + env.EXECUTOR_NUMBER.toInteger()}" GANACHE_MNEMONIC = 'swim relax risk shy chimney please usual search industry board music segment' } stages { stage('Lint') { steps { script { dir(env.REPO) { nix.develop('make lint', pure: false) } } } } stage('Test') { steps { script { dir(env.REPO) { if (params.RACE) { nix.develop('make test-with-race', pure: false) }else { nix.develop('make test-ci', pure: false) } } } } } stage('PostgresSQL') { environment { TEST_DB_PORT = "${env.DB_PORT}" } steps { script { dir(env.REPO) { 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 -> if (params.RACE) { nix.develop('make test-postgres-with-race', pure: false) }else { nix.develop('make test-postgres', pure: false) } } } } } post { cleanup { /* Leftover DB containers. */ sh "docker rm ${DB_CONT} || true" } } } stage('Ganache') { steps { script { ganache = docker.image( 'trufflesuite/ganache:v7.4.1' ).run( "-p 127.0.0.1:${env.GANACHE_RPC_PORT}:8545", "-m='${GANACHE_MNEMONIC}'" ) } } } stage('On-chain tests') { environment { GANACHE_NETWORK_RPC_URL = "ws://localhost:${env.GANACHE_RPC_PORT}" } steps { script { dir(env.REPO) { if (params.RACE) { nix.develop('make test-onchain-with-race', pure: false) }else { nix.develop('make test-onchain', pure: false) } } } } } } post { always { script { /* No artifact but a PKG_URL is necessary. */ env.PKG_URL = "${currentBuild.absoluteUrl}consoleText" } } success { script { github.notifyPR(true) } } failure { script { github.notifyPR(false) } } cleanup { script { cleanWs() catchError { ganache.stop() } } } } } def Boolean getRaceDefault() { return env.JOB_NAME.split('/').contains('race') }