#!/usr/bin/env groovy library 'status-jenkins-lib@v1.9.48' QT_VERSION = "6.11.0" /* Options section can't access functions in objects. */ def isPRBuild = utils.isPRBuild() /* Object to store public URLs for description. */ descLinks = [:] pipeline { agent { /* Image with Ubuntu 22.04, QT ${QT_VERSION}, Android SDK/NDK, Go, and Nim */ docker { label 'linuxcontainer' image "harbor.status.im/status-im/status-desktop-build:1.0.1-qt${QT_VERSION}-android" alwaysPull true args '--entrypoint="" ' + '--volume=/nix:/nix ' + '--volume=/etc/nix:/etc/nix ' customWorkspace "/home/jenkins/workspace/status-app-android/${env.BUILD_NUMBER}" } } parameters { booleanParam( name: 'RELEASE', description: 'Decides whether release credentials are used.', defaultValue: params.RELEASE ?: false ) choice( name: 'VERBOSE', description: 'Level of verbosity based on nimbus-build-system setup.', choices: ['0','1','2','3'] ) string( name: 'STATUS_GO_REF', description: 'Override vendor/status-go submodule to this SHA/ref.', defaultValue: '' ) booleanParam( name: 'RUN_E2E', description: 'Trigger the Android E2E job after the build. Off for PRs, enable for manual runs.', defaultValue: params.RUN_E2E ?: false ) } options { timestamps() /* Prevent Jenkins jobs from running forever */ timeout(time: 45, unit: 'MINUTES') /* manage how many builds we keep */ buildDiscarder(logRotator( numToKeepStr: '10', daysToKeepStr: '30', artifactNumToKeepStr: '1', artifactDaysToKeepStr: '30' )) /* Allows combined build to copy */ copyArtifactPermission('/status-app/*') /* Abort old PR builds. */ disableConcurrentBuilds(abortPrevious: isPRBuild) disableRestartFromStage() } environment { GOCACHE = "${env.WORKSPACE_TMP}/go-cache" GOMODCACHE = "${env.WORKSPACE_TMP}/go-mod-cache" GOTMPDIR = "${env.WORKSPACE_TMP}" /* sets App Version in Settings */ VERSION = "${utils.getVersion()}" /* Control output the filename */ APP_TYPE = "${utils.getAppType()}" PLATFORM = "android/arm64" MAKEFLAGS = "-j${utils.getProcCount()} V=${params.VERBOSE}" QT_VERSION = "${QT_VERSION}" QT_ANDROID_PATH = "/opt/qt/${QT_VERSION}/android_arm64_v8a" QMAKE = "/opt/qt/${QT_VERSION}/android_arm64_v8a/bin/qmake" STATUS_ARTIFACT = "pkg/${utils.pkgFilename(ext: 'apk', arch: 'arm64', version: env.VERSION, type: env.APP_TYPE)}" STATUS_AAB_ARTIFACT = "pkg/${utils.pkgFilename(ext: 'aab', arch: 'arm64', version: env.VERSION, type: env.APP_TYPE)}" NIM_SDS_SOURCE_DIR = "${env.WORKSPACE_TMP}/nim-sds" /* Enable test mode (hooks for e2e) for PR/nightly builds, but NOT for releases */ STATUSQ_TESTMODE = "${!utils.isReleaseBuild()}" } stages { stage('Initialize') { steps { script { def gitBranch = env.GIT_BRANCH ?: '' def isRelease = gitBranch.contains('release/') env.IS_RELEASE_BRANCH = isRelease ? 'true' : 'false' env.PACKAGE_TYPE = isRelease ? 'apk-aab' : 'apk' env.BUILD_VARIANT = isRelease ? 'release' : 'pr' env.STATUS_ANDROID_APP_NAME = isRelease ? 'Status' : 'StatusPR' env.STATUS_BINARY = "${env.WORKSPACE}/mobile/bin/android/qt6/${env.STATUS_ANDROID_APP_NAME}.apk" env.STATUS_AAB_BINARY = "${env.WORKSPACE}/mobile/bin/android/qt6/${env.STATUS_ANDROID_APP_NAME}.aab" } } } stage('Cleanup Workspace') { steps { sh './scripts/clean-git.sh' } } stage('Fetch submodules') { steps { sh 'git submodule update --init --recursive' } } stage('Override status-go ref') { when { expression { params.STATUS_GO_REF?.trim() } } steps { sh "./scripts/override-status-go-ref.sh ${params.STATUS_GO_REF}" } } stage('QML Lint Mobile') { steps { sh 'make qml-lint-mobile QTDIR=/opt/qt/${QT_VERSION}/gcc_64 QT_MOBILE_DIR=/opt/qt/${QT_VERSION}/android_arm64_v8a' } } stage('Build Android') { steps { script { status.buildSigned(platform='android', target='mobile-build PACKAGE_TYPE=' + env.PACKAGE_TYPE, verbose=params.VERBOSE) } } } stage('Package') { steps { script { sh 'mkdir -p pkg' sh "cp -v ${env.STATUS_BINARY} ${env.STATUS_ARTIFACT}" if (env.IS_RELEASE_BRANCH == 'true') { sh "cp -v ${env.STATUS_AAB_BINARY} ${env.STATUS_AAB_ARTIFACT}" } } } } stage('Parallel Upload') { parallel { stage('Upload') { steps { script { env.PKG_URL = s5cmd.upload(env.STATUS_ARTIFACT) descLinks.APK = env.PKG_URL } } } stage('Upload AAB') { when { expression { env.IS_RELEASE_BRANCH == 'true' } } steps { script { env.AAB_URL = s5cmd.upload(env.STATUS_AAB_ARTIFACT) descLinks.AAB = env.AAB_URL } } } } } stage('Archive') { steps { script { archiveArtifacts env.STATUS_ARTIFACT if (env.IS_RELEASE_BRANCH == 'true') { archiveArtifacts env.STATUS_AAB_ARTIFACT } } } } stage('E2E') { when { expression { params.RUN_E2E } } steps { script { build( job: 'status-app/e2e/prs-android', wait: false, parameters: jenkins.mapToParams([ CHANGE_ID: env.CHANGE_ID, GIT_REF: env.CHANGE_BRANCH ?: env.BRANCH_NAME, BUILD_SOURCE: env.PKG_URL, ]), ) } } } } post { always { script { jenkins.setBuildDesc(descLinks) } } success { script { github.notifyPR(true) } } failure { script { github.notifyPR(false) } } cleanup { cleanWs(disableDeferredWipeout: true) dir(env.WORKSPACE_TMP) { deleteDir() } } } }