mirror of
https://github.com/status-im/status-desktop.git
synced 2025-02-10 21:56:37 +00:00
This way we prevent situation in which a developer or QA engineer runs a custom job with adjusted parameters, and then all following jobs use those modified parameters implicitly. The more sane behavior is to always revert to defaults for PR builds, but remember last used parameters for non-PR builds. Signed-off-by: Jakub Sokołowski <jakub@status.im>
204 lines
6.0 KiB
Plaintext
204 lines
6.0 KiB
Plaintext
library 'status-jenkins-lib@v1.6.8'
|
|
|
|
/* Options section can't access functions in objects. */
|
|
def isPRBuild = utils.isPRBuild()
|
|
|
|
pipeline {
|
|
agent {
|
|
label 'linux && x86_64 && qt-5.15.2'
|
|
}
|
|
|
|
parameters {
|
|
booleanParam(
|
|
name: 'RELEASE',
|
|
description: 'Decides whether binaries are built with debug symbols.',
|
|
defaultValue: params.RELEASE ?: false
|
|
)
|
|
string(
|
|
name: 'SQUISH_SUITE',
|
|
description: 'Name of test suite to run in Squish. Defaults to all.',
|
|
defaultValue: forcePRDefaults(params.SQUISH_SUITE, '*')
|
|
)
|
|
string(
|
|
name: 'SQUISH_TAGS',
|
|
description: 'List of tags to use for Squish tests separated by spaces.',
|
|
defaultValue: forcePRDefaults(params.SQUISH_TAGS, '~mayfail ~merge ~relyon-mailserver')
|
|
)
|
|
choice(
|
|
name: 'VERBOSE',
|
|
description: 'Level of verbosity based on nimbus-build-system setup.',
|
|
choices: ['0', '1', '2']
|
|
)
|
|
}
|
|
|
|
options {
|
|
timestamps()
|
|
/* Prevent Jenkins jobs from running forever */
|
|
timeout(time: 120, unit: 'MINUTES')
|
|
/* manage how many builds we keep */
|
|
buildDiscarder(logRotator(
|
|
numToKeepStr: '10',
|
|
daysToKeepStr: '30',
|
|
artifactNumToKeepStr: '3',
|
|
))
|
|
/* Throttle number of concurrent builds. */
|
|
throttleJobProperty(
|
|
throttleEnabled: true,
|
|
throttleOption: 'category',
|
|
maxConcurrentPerNode: 1,
|
|
maxConcurrentTotal: 9
|
|
)
|
|
/* Abort old PR builds. */
|
|
disableConcurrentBuilds(
|
|
abortPrevious: isPRBuild
|
|
)
|
|
}
|
|
|
|
environment {
|
|
TARGET = 'tests/e2e'
|
|
/* Improve make performance */
|
|
MAKEFLAGS = "-j4 V=${params.VERBOSE}"
|
|
/* Disable colors in Nim compiler logs */
|
|
NIMFLAGS = '--colors:off'
|
|
/* Makefile assumes the compiler folder is included */
|
|
QTDIR = '/opt/qt/5.15.2/gcc_64'
|
|
PATH = "${env.QTDIR}/bin:${env.PATH}"
|
|
/* Include library in order to compile the project */
|
|
LD_LIBRARY_PATH = "$QTDIR/lib:$WORKSPACE/vendor/status-go/build/bin:$WORKSPACE/vendor/status-keycard-go/build/libkeycard/"
|
|
/* Container ports */
|
|
RPC_PORT = "${8545 + env.EXECUTOR_NUMBER.toInteger()}"
|
|
P2P_PORT = "${6010 + env.EXECUTOR_NUMBER.toInteger()}"
|
|
/* Ganache config */
|
|
GANACHE_RPC_PORT = "${9545 + env.EXECUTOR_NUMBER.toInteger()}"
|
|
GANACHE_MNEMONIC = 'pelican chief sudden oval media rare swamp elephant lawsuit wheat knife initial'
|
|
TEST_ENVIRONMENT = '1'
|
|
}
|
|
|
|
stages {
|
|
stage('Deps') {
|
|
steps {
|
|
sh 'make update'
|
|
sh 'make deps'
|
|
}
|
|
}
|
|
|
|
stage('status-go') {
|
|
steps {
|
|
sh 'make status-go'
|
|
}
|
|
}
|
|
|
|
stage('build') {
|
|
environment {
|
|
GANACHE_NETWORK_RPC_URL = "http://localhost:${env.GANACHE_RPC_PORT}"
|
|
}
|
|
steps {
|
|
sh 'make'
|
|
}
|
|
}
|
|
|
|
stage('Containers') {
|
|
parallel {
|
|
stage('Ganache') { steps { script {
|
|
ganache = docker.image(
|
|
'trufflesuite/ganache:v7.4.1'
|
|
).run(
|
|
["-p 127.0.0.1:${env.GANACHE_RPC_PORT}:8545",
|
|
"-v ${env.WORKSPACE}/test/ui-test/fixtures/ganache-dbs/goerli:/goerli-db"].join(' '),
|
|
["-m='${GANACHE_MNEMONIC}'", "-e=10",
|
|
'--chain.chainId=5',
|
|
'--database.dbPath=/goerli-db'].join(' ')
|
|
)
|
|
} } }
|
|
|
|
stage('Nim-Waku') { steps { script {
|
|
nimwaku = docker.image(
|
|
'statusteam/nim-waku:v0.13.0'
|
|
).run(
|
|
["-p 127.0.0.1:${env.RPC_PORT}:8545",
|
|
"-p 127.0.0.1:${env.P2P_PORT}:30303/tcp",
|
|
"-p 127.0.0.1:${env.P2P_PORT}:30303/udp",
|
|
"-v ${env.WORKSPACE}/ci/mailserver/config.json:/config.json"].join(' '),
|
|
['--store=true',
|
|
'--keep-alive=true',
|
|
'--rpc-address=0.0.0.0',
|
|
'--nat=none'].join(' ')
|
|
)
|
|
env.TEST_PEER_ENR = getPeerAddress()
|
|
} } }
|
|
}
|
|
}
|
|
|
|
stage('Tests') {
|
|
options {
|
|
throttle(categories: ['status-desktop-e2e-tests'])
|
|
}
|
|
steps { script {
|
|
/* Combine specified tags with --tags flag for each. */
|
|
def tags = params.SQUISH_TAGS.split(' ')
|
|
def flags = Collections.nCopies(tags.size(), "--tags")
|
|
def tagsFlags = [flags, tags].transpose().flatten()
|
|
|
|
wrap([
|
|
$class: 'Xvfb',
|
|
autoDisplayName: true,
|
|
parallelBuild: true,
|
|
screen: '2560x1440x24',
|
|
]) { script {
|
|
def result = squish([
|
|
extraOptions: (tagsFlags + [
|
|
'--retry', '2',
|
|
'--config', 'addAUT', 'nim_status_client',
|
|
"${WORKSPACE}/bin",
|
|
]).join('\n'),
|
|
squishPackageName: 'squish-7.1-20230222-1555-qt515x-linux64',
|
|
testSuite: "${WORKSPACE}/test/ui-test/testSuites/${params.SQUISH_SUITE}",
|
|
])
|
|
print("Squish run result: ${result}")
|
|
if (!['SUCCESS'].contains(result)) {
|
|
throw new Exception('Squish run failed!')
|
|
}
|
|
} }
|
|
} }
|
|
post {
|
|
failure { script {
|
|
sh("docker logs ${nimwaku.id}")
|
|
sh("docker logs ${ganache.id}")
|
|
} }
|
|
}
|
|
}
|
|
}
|
|
|
|
post {
|
|
success { script {
|
|
github.notifyPR(true)
|
|
} }
|
|
failure { script {
|
|
github.notifyPR(false)
|
|
} }
|
|
always { script { /* No artifact but a PKG_URL is necessary. */
|
|
env.PKG_URL = "${currentBuild.absoluteUrl}/consoleText"
|
|
} }
|
|
cleanup { script {
|
|
sh './scripts/clean-git.sh'
|
|
if (binding.hasVariable('ganache')) { ganache.stop() }
|
|
if (binding.hasVariable('nimwaku')) { nimwaku.stop() }
|
|
} }
|
|
}
|
|
}
|
|
|
|
def getPeerAddress() {
|
|
def rpcResp = sh(
|
|
script: "${env.WORKSPACE}/scripts/rpc.sh get_waku_v2_debug_v1_info",
|
|
returnStdout: true
|
|
).trim()
|
|
assert rpcResp : 'Could not get node address from RPC API!'
|
|
return readJSON(text: rpcResp)['result']['listenAddresses'][0]
|
|
}
|
|
|
|
/* Helper that prevents saving of parameters in PR jobs. */
|
|
def String forcePRDefaults(String previousValue, String defaultValue) {
|
|
if (utils.isPRBuild()) { return defaultValue }
|
|
return previousValue ?: defaultValue
|
|
}
|