diff --git a/ci/Jenkinsfile.linux b/ci/Jenkinsfile.linux deleted file mode 100644 index 872402d65f..0000000000 --- a/ci/Jenkinsfile.linux +++ /dev/null @@ -1,140 +0,0 @@ -#!/usr/bin/env groovy -library 'status-jenkins-lib@v1.8.18' - -/* Options section can't access functions in objects. */ -def isPRBuild = utils.isPRBuild() - -pipeline { - agent { - /* Necessary image with Ubuntu 20.04 for older Glibc. */ - docker { - label 'linux' - image 'statusteam/nim-status-client-build:1.4.1-qt5.15.2' - /* allows jenkins use cat and mounts '/dev/fuse' for linuxdeployqt */ - args '--entrypoint="" --cap-add SYS_ADMIN --security-opt apparmor:unconfined --device /dev/fuse' - } - } - - parameters { - booleanParam( - name: 'RELEASE', - description: 'Decides whether release credentials are used.', - defaultValue: params.RELEASE ?: false - ) - booleanParam( - name: 'INCLUDE_DEBUG_SYMBOLS', - description: 'Decides whether binaries are built with debug symbols.', - defaultValue: params.INCLUDE_DEBUG_SYMBOLS ?: false - ) - choice( - name: 'VERBOSE', - description: 'Level of verbosity based on nimbus-build-system setup.', - choices: ['0', '1', '2'] - ) - string( - name: 'NIMFLAGS', - description: 'Extra Nim flags. Examples: --verbosity:2 --passL:"-v" --passC:"-v"', - defaultValue: '--colors:off' - ) - booleanParam( - name: 'USE_MOCKED_KEYCARD_LIB', - description: 'Decides whether the mocked status-keycard-go library is built.', - defaultValue: false - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 25, unit: 'MINUTES') - /* manage how many builds we keep */ - buildDiscarder(logRotator( - numToKeepStr: '10', - daysToKeepStr: '30', - artifactNumToKeepStr: '1', - )) - /* Allows combined build to copy */ - copyArtifactPermission('/status-desktop/*') - /* Abort old PR builds. */ - disableConcurrentBuilds( - abortPrevious: isPRBuild - ) - } - - environment { - PLATFORM = "linux/${getArch()}" - /* Improve make performance */ - MAKEFLAGS = "-j4 V=${params.VERBOSE}" - /* Makefile assumes the compiler folder is included */ - QTDIR = "/opt/qt/5.15.2/gcc_64" - PATH = "${env.QTDIR}/bin:${env.PATH}" - /* Avoid weird bugs caused by stale cache. */ - QML_DISABLE_DISK_CACHE = "true" - /* Control output the filename */ - STATUS_CLIENT_APPIMAGE = "pkg/${utils.pkgFilename(ext: 'AppImage', arch: getArch())}" - STATUS_CLIENT_TARBALL = "pkg/${utils.pkgFilename(ext: 'tar.gz', arch: getArch())}" - } - - stages { - stage('Deps') { - steps { - sh 'make update' - sh 'make deps' - } - } - - stage('status-go') { - steps { - sh 'make status-go' - } - } - - stage('Package') { - steps { script { - linux.bundle('tgz-linux') - } } - } - - stage('Parallel Upload') { - parallel { - stage('Upload') { - steps { script { - env.PKG_URL = s3.uploadArtifact(env.STATUS_CLIENT_TARBALL) - jenkins.setBuildDesc(AppImage: env.PKG_URL) - } } - } - stage('Archive') { - steps { script { - archiveArtifacts("${env.STATUS_CLIENT_TARBALL}*") - } } - } - } - } - - stage('E2E') { - when { expression { utils.isPRBuild() } } - steps { script { - build( - job: 'status-desktop/e2e/prs', - wait: false, - parameters: jenkins.mapToParams([ - GIT_REF: env.GIT_COMMIT, - BUILD_SOURCE: env.JOB_NAME, - ]), - ) - } } - } - } - post { - success { script { github.notifyPR(true) } } - failure { script { github.notifyPR(false) } } - cleanup { sh './scripts/clean-git.sh' } - } -} - -def getArch() { - def tokens = Thread.currentThread().getName().split('/') - for (def arch in ['x86_64', 'aarch64']) { - if (tokens.contains(arch)) { return arch } - } -} diff --git a/ci/Jenkinsfile.macos b/ci/Jenkinsfile.macos deleted file mode 100644 index a088c8ef98..0000000000 --- a/ci/Jenkinsfile.macos +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/env groovy -library 'status-jenkins-lib@v1.8.13' - -/* Options section can't access functions in objects. */ -def isPRBuild = utils.isPRBuild() - -pipeline { - /* This way we run the same Jenkinsfile on different platforms. */ - agent { - label "${getAgentLabels().join(' && ')} && qt-5.15 && go-1.21" - } - - parameters { - booleanParam( - name: 'RELEASE', - description: 'Decides whether release credentials are used.', - defaultValue: params.RELEASE ?: false - ) - booleanParam( - name: 'INCLUDE_DEBUG_SYMBOLS', - description: 'Decides whether binaries are built with debug symbols.', - defaultValue: params.INCLUDE_DEBUG_SYMBOLS ?: false - ) - choice( - name: 'VERBOSE', - description: 'Level of verbosity based on nimbus-build-system setup.', - choices: ['0', '1', '2'] - ) - string( - name: 'NIMFLAGS', - description: 'Extra Nim flags. Examples: --verbosity:2 --passL:"-v" --passC:"-v"', - defaultValue: '--colors:off' - ) - booleanParam( - name: 'USE_MOCKED_KEYCARD_LIB', - description: 'Decides whether the mocked status-keycard-go library is built.', - defaultValue: false - ) - choice( - name: 'ENTITLEMENTS', - description: 'Select app entitlements. Squish requires extra entitlements.', - choices: ['resources/Entitlements.plist', 'resources/Entitlements_squish.plist'] - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 30, unit: 'MINUTES') - /* manage how many builds we keep */ - buildDiscarder(logRotator( - numToKeepStr: '10', - daysToKeepStr: '30', - artifactNumToKeepStr: '1', - )) - /* Allows combined build to copy */ - copyArtifactPermission('/status-desktop/*') - /* Abort old PR builds. */ - disableConcurrentBuilds( - abortPrevious: isPRBuild - ) - } - - environment { - PLATFORM = "macos/${getArch()}" - /* Improve make performance */ - MAKEFLAGS = "-j4 V=${params.VERBOSE}" - /* WARNING: Qt 5.15.8 installed via Brew. */ - QTDIR = '/opt/homebrew/opt/qt@5' - /* Enforce Go version installed infra-role-golang. */ - PATH = "${env.QTDIR}/bin:/usr/local/go/bin:${env.PATH}" - /* Avoid weird bugs caused by stale cache. */ - QML_DISABLE_DISK_CACHE = "true" - /* Control output the filename */ - STATUS_CLIENT_DMG = "pkg/${utils.pkgFilename(ext: 'dmg', arch: getArch())}" - /* Apple Team ID for Notarization */ - MACOS_NOTARIZE_TEAM_ID = "8B5X2M6H2Y" - } - - stages { - stage('Deps') { - steps { - sh 'make update' - withCredentials([ - usernamePassword( /* For fetching HomeBrew bottles. */ - credentialsId: "status-im-auto-pkgs", - usernameVariable: 'GITHUB_USER', - passwordVariable: 'GITHUB_TOKEN' - ) - ]) { - sh 'make deps' - } - } - } - - stage('status-go') { - steps { - sh 'make status-go' - } - } - - stage('Package') { - steps { script { - macos.bundle('pkg-macos') - } } - } - - stage('Notarize') { - when { expression { utils.isReleaseBuild() } } - steps { script { - macos.notarize() - } } - } - - stage('Parallel Upload') { - parallel { - stage('Upload') { - steps { script { - env.PKG_URL = s3.uploadArtifact(env.STATUS_CLIENT_DMG) - jenkins.setBuildDesc(Dmg: env.PKG_URL) - } } - } - stage('Archive') { - steps { script { - archiveArtifacts(env.STATUS_CLIENT_DMG) - } } - } - } - } - } - post { - success { script { github.notifyPR(true) } } - failure { script { github.notifyPR(false) } } - cleanup { sh './scripts/clean-git.sh' } - } -} - -/* This allows us to use one Jenkinsfile and run - * jobs on different platforms based on job name. */ -def getAgentLabels() { - if (params.AGENT_LABEL) { return params.AGENT_LABEL } - /* We extract the name of the job from currentThread because - * before an agent is picket env is not available. */ - def tokens = Thread.currentThread().getName().split('/') - def labels = [] - /* Check if the job path contains any of the valid labels. */ - ['linux', 'macos', 'x86_64', 'aarch64', 'arm64'].each { - if (tokens.contains(it)) { labels.add(it) } - } - return labels -} - -def getArch() { - def tokens = Thread.currentThread().getName().split('/') - for (def arch in ['x86_64', 'aarch64']) { - if (tokens.contains(arch)) { return arch } - } -} diff --git a/ci/Jenkinsfile.tests-e2e b/ci/Jenkinsfile.tests-e2e deleted file mode 100644 index ae723a02fc..0000000000 --- a/ci/Jenkinsfile.tests-e2e +++ /dev/null @@ -1,263 +0,0 @@ -#!/usr/bin/env groovy -library 'status-jenkins-lib@v1.8.6' - -pipeline { - - agent { - label "${params.AGENT} && x86_64 && qt-5.15.2" - } - - parameters { - gitParameter( - name: 'GIT_REF', - description: 'Git branch to checkout.', - branchFilter: 'origin/(.*)', - branch: '', - defaultValue: 'master', - quickFilterEnabled: false, - selectedValue: 'DEFAULT', - sortMode: 'ASCENDING_SMART', - tagFilter: '*', - type: 'PT_BRANCH' - ) - string( - name: 'BUILD_SOURCE', - description: 'URL to tar.gz file OR path to Jenkins build.', - defaultValue: getDefaultBuildSource() - ) - string( - name: 'TEST_NAME', - description: 'Paste test name/part of test name to run specific test.', - defaultValue: '' - ) - string( - name: 'TEST_SCOPE_FLAG', - description: 'Paste a known mark to run tests labeled with this mark', - defaultValue: getDefaultTestScopeFlag() - ) - string( - name: 'TESTRAIL_RUN_NAME', - description: 'Test run name in Test Rail.', - defaultValue: '' - ) - choice( - name: 'LOG_LEVEL', - description: 'Log level for pytest.', - choices: ['INFO', 'DEBUG', 'TRACE', 'WARNING', 'CRITICAL'] - ) - /* FIXME: This is temporary and should be removed. */ - choice( - name: 'AGENT', - description: 'Agent name to run tests on it.', - choices: ['linux', 'linux-01', 'linux-02', 'linux-03', 'linux-04', 'linux-05'] - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 120, unit: 'MINUTES') - /* manage how many builds we keep */ - buildDiscarder(logRotator( - daysToKeepStr: '60', - numToKeepStr: '50', - artifactNumToKeepStr: '50', - )) - } - - environment { - SQUISH_DIR = '/opt/squish-runner-7.2.1' - PYTHONPATH = "${SQUISH_DIR}/lib:${SQUISH_DIR}/lib/python:${PYTHONPATH}" - LD_LIBRARY_PATH = "${SQUISH_DIR}/lib:${SQUISH_DIR}/python3/lib:${LD_LIBRARY_PATH}" - - /* Avoid race conditions with other builds using virtualenv. */ - VIRTUAL_ENV = "${WORKSPACE_TMP}/venv" - PATH = "${VIRTUAL_ENV}/bin:${PATH}" - - TESTRAIL_URL = 'https://ethstatus.testrail.net' - TESTRAIL_PROJECT_ID = 18 - /* Override QT xcb plugin with linux to avoid errors like: - * "Could not load the Qt platform plugin "xcb" in "" even though it was found." */ - QT_QPA_PLATFORM = "linuxfb" - - /* Runtime flag to make testing of the app easier. Switched off: unpredictable app behavior under new tests */ - /* STATUS_RUNTIME_TEST_MODE = 'True' */ - - /* Logging rules let you enable or disable logging for categories */ - QT_LOGGING_RULES = '*.warning=true' - - /* Set to a non-zero value to make Qt print out diagnostic information about the each (C++) plugin it tries to load. */ - QT_DEBUG_PLUGINS = 0 - } - - stages { - stage('Prep') { - steps { script { - setNewBuildName() - updateGitHubStatus() - } } - } - - stage('Deps') { - steps { script { dir('test/e2e') { - sh "python3 -m venv ${VIRTUAL_ENV}" - sh 'pip3 install -r requirements.txt' - } } } - } - - stage('Download') { - when { expression { params.BUILD_SOURCE.startsWith('http') } } - steps { timeout(5) { script { dir('test/e2e') { - sh 'mkdir -p ./pkg/' - setBuildDescFromFile(params.BUILD_SOURCE) - fileOperations([ - fileDownloadOperation( - url: params.BUILD_SOURCE, - targetFileName: 'StatusIm-Desktop.tar.gz', - targetLocation: './pkg/', - userName: '', - password: '', - ) - ]) - } } } } - } - - stage('Copy') { - when { expression { ! params.BUILD_SOURCE.startsWith('http') } } - steps { timeout(5) { script { dir('test/e2e') { - copyArtifacts( - projectName: params.BUILD_SOURCE, - filter: 'pkg/*-x86_64.tar.gz', - selector: lastWithArtifacts(), - target: './' - ) - setBuildDescFromFile(utils.findFile('pkg/*tar.gz')) - } } } } - } - - stage('Unpack') { - steps { timeout(5) { script { dir('test/e2e') { - sh 'mkdir aut' - sh "tar -zxvf '${utils.findFile('pkg/*tar.gz')}' -C './aut'" - env.AUT_PATH = utils.findFile('aut/*.AppImage') - } } } } - } - - stage('Test') { - steps { timeout(getTestStageTimeout()) { script { dir('test/e2e') { - def flags = [] - if (params.TEST_NAME) { flags.add("-k=${params.TEST_NAME}") } - if (params.TEST_SCOPE_FLAG) { flags.add(params.TEST_SCOPE_FLAG) } - if (params.LOG_LEVEL) { flags.addAll(["--log-level=${params.LOG_LEVEL}", "--log-cli-level=${params.LOG_LEVEL}"]) } - dir ('configs') { sh 'ln -s _local.ci.py _local.py' } - wrap([ - $class: 'Xvfb', - autoDisplayName: true, - parallelBuild: true, - screen: '1920x1080x24', - additionalOptions: '-dpi 1' - ]) { - sh 'fluxbox &' - withCredentials([ - usernamePassword( - credentialsId: 'test-rail-api-devops', - usernameVariable: 'TESTRAIL_USR', - passwordVariable: 'TESTRAIL_PSW' - ) - ]) { - /* Keep the --reruns flag first, or it won't work */ - sh """ - python3 -m pytest --reruns=1 --timeout=180 ${flags.join(" ")} \ - --disable-warnings \ - --alluredir=./allure-results \ - -o timeout_func_only=true - """ - } - } - } } } } - } - } - - post { - always { script { dir('test/e2e') { - archiveArtifacts('aut/*.log') - - /* Needed to categorize types of errors and add environment section in allure report. */ - sh 'cp ext/allure_files/categories.json allure-results' - sh 'cp ext/allure_files/environment.properties allure-results' - - allure([ - results: [[path: 'allure-results']], - reportBuildPolicy: 'ALWAYS', - properties: [], - jdk: '', - ]) - updateGitHubStatus() - } } } - failure { script { - discord.send( - header: '**Desktop E2E test failure!**', - cred: 'discord-status-desktop-e2e-webhook', - ) - } } - cleanup { cleanWs() } - } -} - -def setNewBuildName() { - if (currentBuild.upstreamBuilds) { - def parent = utils.parentOrCurrentBuild() - currentBuild.displayName = parent.getFullDisplayName().minus('status-desktop ยป ') - } -} - -def setBuildDescFromFile(fileNameOrPath) { - def tokens = utils.parseFilename(utils.baseName(fileNameOrPath)) - if (tokens == null) { /* Fallback for regex fail. */ - currentBuild.description = utils.baseName(fileNameOrPath) - return - } - if (tokens.build && tokens.build.startsWith('pr')) { - currentBuild.displayName = tokens.build.replace(/^pr/, 'PR-') - } - currentBuild.description = formatMap([ - Node: NODE_NAME, - Build: tokens.build, - Commit: tokens.commit, - Version: (tokens.tstamp ?: tokens.version), - ]) -} - -def updateGitHubStatus() { - /* For PR builds update check status. */ - if (params.BUILD_SOURCE ==~ /.*\/PR-[0-9]+\/?$/) { - github.statusUpdate( - context: 'jenkins/prs/tests/e2e-new', - commit: jenkins.getJobCommitByPath(params.BUILD_SOURCE), - repo_url: 'https://github.com/status-im/status-desktop' - ) - } -} - -def formatMap(Map data=[:]) { - def text = '' - data.each { key, val -> text += "${key}: ${val}
\n" } - return text -} - -def getDefaultBuildSource() { - if (JOB_NAME ==~ 'status-desktop/qa-automation/prs/.*') { - return 'status-desktop/nightly' - } - return '' -} - -def getDefaultTestScopeFlag() { - if (JOB_NAME == "status-desktop/systems/linux/x86_64/tests-e2e") { - return '' - } else { - return '-m=critical' - } -} - -def getTestStageTimeout() { TEST_SCOPE_FLAG == '-m=critical' ? 30 : 120 } diff --git a/ci/Jenkinsfile.tests-nim b/ci/Jenkinsfile.tests-nim deleted file mode 100644 index 12f64f2912..0000000000 --- a/ci/Jenkinsfile.tests-nim +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env groovy -library 'status-jenkins-lib@v1.8.13' - -/* Options section can't access functions in objects. */ -def isPRBuild = utils.isPRBuild() - -pipeline { - agent { - docker { - label 'linux' - image 'statusteam/nim-status-client-build:1.2.1-qt5.15.2' - } - } - - parameters { - choice( - name: 'VERBOSE', - description: 'Level of verbosity based on nimbus-build-system setup.', - choices: ['0', '1', '2'] - ) - string( - name: 'NIMFLAGS', - description: 'Extra Nim flags. Examples: --verbosity:2 --passL:"-v" --passC:"-v"', - defaultValue: '--colors:off' - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 20, unit: 'MINUTES') - /* manage how many builds we keep */ - buildDiscarder(logRotator( - numToKeepStr: '10', - daysToKeepStr: '30', - artifactNumToKeepStr: '1', - )) - /* Abort old PR builds. */ - disableConcurrentBuilds( - abortPrevious: isPRBuild - ) - } - - environment { - PLATFORM = 'tests/nim' - /* Improve make performance */ - MAKEFLAGS = "-j4 V=${params.VERBOSE}" - /* Makefile assumes the compiler folder is included */ - QTDIR = "/opt/qt/5.15.2/gcc_64" - /* Avoid weird bugs caused by stale cache. */ - QML_DISABLE_DISK_CACHE = "true" - /* Include library in order to compile the project */ - LD_LIBRARY_PATH = "$QTDIR/lib" - } - - stages { - stage('Deps') { - steps { - sh 'make update' - sh 'make deps' - } - } - - stage('Tests') { - steps { sh 'make tests-nim-linux' } - } - } - - post { - success { script { github.notifyPR(true) } } - failure { script { github.notifyPR(false) } } - always { script { env.PKG_URL = "${currentBuild.absoluteUrl}/consoleText" } } - cleanup { cleanWs() } - } -} diff --git a/ci/Jenkinsfile.tests-ui b/ci/Jenkinsfile.tests-ui deleted file mode 100644 index d6d6200e00..0000000000 --- a/ci/Jenkinsfile.tests-ui +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env groovy -library 'status-jenkins-lib@v1.8.13' - -/* Options section can't access functions in objects. */ -def isPRBuild = utils.isPRBuild() - -pipeline { - agent { - label 'linux && x86_64 && qt-5.15.2' - } - - parameters { - 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: '1', - )) - /* Abort old PR builds. */ - disableConcurrentBuilds( - abortPrevious: isPRBuild - ) - } - - environment { - PLATFORM = 'tests/ui' - /* Improve make performance */ - MAKEFLAGS = "-j4 V=${params.VERBOSE}" - /* Makefile assumes the compiler folder is included */ - QTDIR = "/opt/qt/5.15.2/gcc_64" - PATH = "${env.QTDIR}/bin:${env.PATH}" - } - - stages { - stage('Build StatusQ Tests') { - steps { - sh 'make statusq-tests' - } - } - - stage('Build StatusQ Sanity Checker') { - steps { - sh 'make statusq-sanity-checker' - } - } - - stage('Build Storybook') { - steps { - sh 'make storybook-build' - } - } - - stage('Check StatusQ Tests') { - steps { script { - /* Needed for QGuiApplication to import QtQuick.Dialogs */ - wrap([ - $class: 'Xvfb', - autoDisplayName: true, - parallelBuild: true, - screen: '2560x1440x24', - ]) { - sh('make run-statusq-tests') - } - } } - } - - stage('Check StatusQ Sanity Checker') { - steps { script { - /* Needed for QGuiApplication to import QtQuick.Dialogs */ - wrap([ - $class: 'Xvfb', - autoDisplayName: true, - parallelBuild: true, - screen: '2560x1440x24', - ]) { - sh('make run-statusq-sanity-checker') - } - } } - } - - stage('Check Storybook Tests') { - steps { script { - /* Needed for QGuiApplication to import QtQuick.Dialogs */ - wrap([ - $class: 'Xvfb', - autoDisplayName: true, - parallelBuild: true, - screen: '2560x1440x24', - ]) { - sh('make run-storybook-tests') - } - } } - } - - stage('Check Storybook Pages Validator') { - steps { script { - /* Needed for QGuiApplication to import QtQuick.Dialogs */ - wrap([ - $class: 'Xvfb', - autoDisplayName: true, - parallelBuild: true, - screen: '2560x1440x24', - ]) { - sh('make run-storybook-pages-validator') - } - } } - } - - stage('Upload') { - steps { script { - env.PKG_URL = "${currentBuild.absoluteUrl}/consoleText" - } } - } - } - - post { - success { script { github.notifyPR(true) } } - failure { script { github.notifyPR(false) } } - cleanup { cleanWs() } - } -} diff --git a/ci/Jenkinsfile.windows b/ci/Jenkinsfile.windows deleted file mode 100644 index 75208b3de0..0000000000 --- a/ci/Jenkinsfile.windows +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env groovy -library 'status-jenkins-lib@v1.8.13' - -/* Options section can't access functions in objects. */ -def isPRBuild = utils.isPRBuild() - -pipeline { - agent { label 'windows && x86_64 && qt-5.15.2 && go-1.21' } - - parameters { - booleanParam( - name: 'RELEASE', - description: 'Decides whether release credentials are used.', - defaultValue: params.RELEASE ?: false - ) - booleanParam( - name: 'INCLUDE_DEBUG_SYMBOLS', - description: 'Decides whether binaries are built with debug symbols.', - defaultValue: params.INCLUDE_DEBUG_SYMBOLS ?: false - ) - choice( - name: 'VERBOSE', - description: 'Level of verbosity based on nimbus-build-system setup.', - choices: ['0', '1', '2'] - ) - string( - name: 'NIMFLAGS', - description: 'Extra Nim flags. Examples: --verbosity:2 --passL:"-v" --passC:"-v"', - defaultValue: '--colors:off' - ) - booleanParam( - name: 'USE_MOCKED_KEYCARD_LIB', - description: 'Decides whether the mocked status-keycard-go library is built.', - defaultValue: false - ) - } - - options { - timestamps() - /* Prevent Jenkins jobs from running forever */ - timeout(time: 60, unit: 'MINUTES') - /* manage how many builds we keep */ - buildDiscarder(logRotator( - numToKeepStr: '10', - daysToKeepStr: '30', - artifactNumToKeepStr: '1', - )) - /* Allows combined build to copy */ - copyArtifactPermission('/status-desktop/*') - /* Abort old PR builds. */ - disableConcurrentBuilds( - abortPrevious: isPRBuild - ) - } - - environment { - PLATFORM = "windows/${getArch()}" - /* Improve make performance */ - MAKEFLAGS = "-j${utils.getProcCount()} V=${params.VERBOSE}" - /* Explicitly set the QT version */ - QTDIR = "/c/Qt/5.15.2/msvc2019_64" - PATH = "${env.QTDIR}/bin:${env.PATH}" - /* Avoid weird bugs caused by stale cache. */ - QML_DISABLE_DISK_CACHE = "true" - /* Control output the filename */ - STATUS_CLIENT_EXE = "pkg/${utils.pkgFilename(ext: 'exe', arch: getArch())}" - /* 7zip archive filename */ - STATUS_CLIENT_7Z = "pkg/${utils.pkgFilename(ext: '7z', arch: getArch())}" - /* RFC 3161 timestamping URL for DigiCert */ - WINDOWS_CODESIGN_TIMESTAMP_URL = 'http://timestamp.digicert.com' - } - - stages { - stage('Deps') { - steps { - sh 'make update' - sh 'make deps' - } - } - - stage('status-go') { - steps { - sh 'make status-go' - } - } - - stage('Package') { - steps { script { - windows.bundle("${env.STATUS_CLIENT_EXE} ${env.STATUS_CLIENT_7Z}") - } } - } - - stage('Parallel Upload') { - /* Uploads on Windows are slow. */ - parallel { - stage('Upload 7Z') { - steps { script { - zip_url = s3.uploadArtifact(env.STATUS_CLIENT_7Z) - } } - } - stage('Upload EXE') { - steps { script { - exe_url = s3.uploadArtifact(env.STATUS_CLIENT_EXE) - } } - } - } - } - - stage('Archive') { - steps { script { - archiveArtifacts(env.STATUS_CLIENT_EXE) - archiveArtifacts(env.STATUS_CLIENT_7Z) - env.PKG_URL = exe_url - jenkins.setBuildDesc(Zip: zip_url, Exe: exe_url) - } } - } - } - post { - success { script { github.notifyPR(true) } } - failure { script { github.notifyPR(false) } } - // Windows workspace often becomes broken if stoped during checkout. - // Post cleanup will fail too. - // Use 'Wipe out repository and force clone' manual UI option to prevent it. - cleanup { cleanWs() } - } -} - -def getArch() { - def tokens = Thread.currentThread().getName().split('/') - for (def arch in ['x86_64', 'aarch64']) { - if (tokens.contains(arch)) { return arch } - } -}