status-desktop/ci/Jenkinsfile.combined

129 lines
3.8 KiB
Groovy

#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.8.0'
pipeline {
agent { label 'linux' }
options {
timestamps()
disableConcurrentBuilds()
/* Prevent Jenkins jobs from running forever */
timeout(time: 90, unit: 'MINUTES')
/* Limit builds retained */
buildDiscarder(logRotator(
numToKeepStr: '30',
daysToKeepStr: '30',
artifactNumToKeepStr: '10',
))
}
parameters {
booleanParam(
name: 'PUBLISH',
description: 'Trigger publishing of build results to GitHub.',
defaultValue: getPublishDefault(params.PUBLISH),
)
}
stages {
stage('Build') {
parallel {
stage('Linux/x86_64') { steps { script {
linux_x86_64 = jenkins.Build('status-desktop/systems/linux/x86_64/package')
} } }
stage('Windows/x86_64') { steps { script {
windows_x86_64 = jenkins.Build('status-desktop/systems/windows/x86_64/package')
} } }
stage('MacOS/x86_64') { steps { script {
macos_x86_64 = jenkins.Build('status-desktop/systems/macos/x86_64/package')
} } }
stage('MacOS/aarch64') { steps { script {
macos_aarch64 = jenkins.Build('status-desktop/systems/macos/aarch64/package')
} } }
}
}
stage('Tests') {
parallel {
stage('Linux/E2E/old') { steps { script {
linux_e2e = jenkins.Build('status-desktop/systems/linux/x86_64/tests-e2e-old')
} } }
stage('Linux/E2E/new') { steps { script {
linux_e2e = build(
job: 'status-desktop/systems/linux/x86_64/tests-e2e-new',
parameters: jenkins.mapToParams([BUILD_SOURCE: linux_x86_64.fullProjectName]),
)
} } }
}
}
stage('Archive') {
steps { script {
sh('rm -f pkg/*')
jenkins.copyArts(linux_x86_64)
jenkins.copyArts(windows_x86_64)
jenkins.copyArts(macos_x86_64)
jenkins.copyArts(macos_aarch64)
sha = "pkg/${utils.pkgFilename(ext: 'sha256')}"
dir('pkg') {
/* generate sha256 checksums for upload */
sh "sha256sum * | tee ../${sha}"
archiveArtifacts('*')
}
} }
}
stage('Upload') {
steps { script {
/* object for easier URLs handling */
urls = [
/* mobile */
'Linux': utils.pkgUrl(linux_x86_64),
'Windows': utils.pkgUrl(windows_x86_64),
'MacOS/x86_64': utils.pkgUrl(macos_x86_64),
'MacOS/aarch64': utils.pkgUrl(macos_aarch64),
/* upload the sha256 checksums file too */
SHA: s3.uploadArtifact(sha),
]
/* add URLs to the build description */
jenkins.setBuildDesc(urls)
} }
}
stage('Publish') {
when { expression { params.PUBLISH } }
steps { script {
github.publishReleaseFiles(repo: 'status-desktop');
} }
}
}
post {
failure { script {
withCredentials([
string(
credentialsId: 'discord-status-desktop-webhook',
variable: 'DISCORD_WEBHOOK'
),
]) {
discordSend(
title: "${env.JOB_NAME}#${env.BUILD_NUMBER}",
description: """
CI Desktop build Failure!
Branch: `${GIT_BRANCH}`
Commit: `${GIT_COMMIT.take(8)}`
""",
link: env.BUILD_URL,
result: currentBuild.currentResult,
webhookURL: env.DISCORD_WEBHOOK
)
}
} }
}
}
/* 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
}