#!/usr/bin/env groovy library 'status-jenkins-lib@v1.9.14' /* Object to store public URLs for description. */ urls = [:] pipeline { agent { label 'linux' } options { timestamps() disableConcurrentBuilds() /* Prevent Jenkins jobs from running forever */ timeout(time: 120, unit: 'MINUTES') /* Limit builds retained */ buildDiscarder(logRotator( numToKeepStr: '30', daysToKeepStr: '30', artifactNumToKeepStr: '10', )) /* Allows combined build to copy */ copyArtifactPermission('/status-desktop/*') } parameters { booleanParam( name: 'PUBLISH', description: 'Trigger publishing of build results to GitHub.', defaultValue: getPublishDefault(params.PUBLISH), ) } stages { stage('Build') { parallel { stage('Linux/x86_64 and E2E') { stages { stage('Linux/x86_64') { steps { script { linux_x86_64 = getArtifacts( 'Linux', jenkins.Build('status-desktop/systems/linux/x86_64/package') ) } } } stage('E2E') { steps { script { linux_e2e = build( job: 'status-desktop/systems/linux/x86_64/tests-e2e-new', parameters: jenkins.mapToParams([ BUILD_SOURCE: linux_x86_64.fullProjectName, TESTRAIL_RUN_NAME: utils.pkgFilename(), TEST_SCOPE_FLAG: utils.isReleaseBuild() ? '-m=critical' : '', GIT_REF: env.BRANCH_NAME, ]), ) } } } } } stage('Linux/x86_64/Nix') { steps { script { linux_x86_64_nix = getArtifacts( 'Linux', jenkins.Build('status-desktop/systems/linux/x86_64/package-nix') ) } } } stage('Windows/x86_64') { steps { script { windows_x86_64 = getArtifacts( 'Windows', jenkins.Build('status-desktop/systems/windows/x86_64/package') ) } } } stage('MacOS/x86_64') { steps { script { macos_x86_64 = getArtifacts( 'MacOS/x86_64', jenkins.Build('status-desktop/systems/macos/x86_64/package') ) } } } stage('MacOS/aarch64') { steps { script { macos_aarch64 = getArtifacts( 'MacOS/aarch64', jenkins.Build('status-desktop/systems/macos/aarch64/package') ) } } } } } stage('Publish') { when { expression { params.PUBLISH } } steps { script { github.publishReleaseFiles(repo: 'status-desktop'); } } } } post { always { script { dir('pkg') { /* Generate sha256 checksums for all artifacts. */ sha = "./${utils.pkgFilename(ext: 'sha256')}" sh "sha256sum * | tee ./${sha}" urls['SHA'] = s3.uploadArtifact(sha) jenkins.setBuildDesc(urls) } archiveArtifacts('pkg/*') } } failure { script { discord.send( header: 'CI Desktop build Failure!', cred: 'discord-status-desktop-webhook', ) } } cleanup { cleanWs() } } } /* Helper that makes PUBLISH default to 'false' unless: * - The build is for a release branch * - A user explicitly specified a value * Since release builds create and re-create GitHub drafts every time. */ def Boolean getPublishDefault(Boolean previousValue) { if (env.JOB_NAME.startsWith('status-desktop/release')) { return true } if (previousValue != null) { return previousValue } return false } /* Helper for getting artifacts from child builds. */ def getArtifacts(key, childBuild) { /* Copy artifacts from child build to parent. */ jenkins.copyArts(childBuild) /* Archive right away to make artifacts available. */ archiveArtifacts('pkg/*') /* Add new URL from child build and update description. */ urls[key] = utils.pkgUrl(childBuild) jenkins.setBuildDesc(urls) return childBuild }