status-desktop/ci/Jenkinsfile.combined

136 lines
4.1 KiB
Groovy

#!/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 {
def version = sh(script: './scripts/version.sh', returnStdout: true).trim()
github.publishReleaseFiles(repo: 'status-desktop', version: version);
} }
}
}
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
}