pipeline { agent { docker { label 'linux' image 'statusteam/status-build-android:1.0.0' args ( "-v /home/jenkins/tmp:/var/tmp:rw "+ "-v /home/jenkins/status-im.keystore:/tmp/status-im.keystore:ro" ) } } options { timestamps() disableConcurrentBuilds() /* Prevent Jenkins jobs from running forever */ timeout(time: 35, unit: 'MINUTES') /* Limit builds retained */ buildDiscarder(logRotator( numToKeepStr: '10', daysToKeepStr: '20', artifactNumToKeepStr: '10', )) } parameters { string( name: 'BUILD_TYPE', description: 'Specify build type. Values: pr / e2e / nightly / release', defaultValue: 'pr', ) } environment { BUILD_PLATFORM = 'android' LANG = 'en_US.UTF-8' LANGUAGE = 'en_US.UTF-8' LC_ALL = 'en_US.UTF-8' FASTLANE_DISABLE_COLORS = 1 REALM_DISABLE_ANALYTICS = 1 /* since we are mounting it we need to specify location */ STATUS_RELEASE_STORE_FILE = '/tmp/status-im.keystore' ANDROID_HOME = '/usr/lib/android-sdk' ANDROID_SDK_ROOT = '/usr/lib/android-sdk' ANDROID_NDK = '/usr/lib/android-ndk' ANDROID_NDK_HOME = '/usr/lib/android-ndk' /* We use EXECUTOR_NUMBER to avoid multiple instances clashing */ LEIN_HOME = "/var/tmp/lein-${EXECUTOR_NUMBER}" YARN_CACHE_FOLDER = "/var/tmp/yarn-${EXECUTOR_NUMBER}" BUNDLE_PATH = "/var/tmp/bundle-${EXECUTOR_NUMBER}" GRADLE_USER_HOME = "/var/tmp/gradle-${EXECUTOR_NUMBER}" } stages { stage('Prep') { steps { script { /* Necessary to load methods */ mobile = load 'ci/mobile.groovy' cmn = load 'ci/common.groovy' print "Running ${cmn.getBuildType()} build!" /* Read the valid NodeJS version */ env.NODE_VERSION = cmn.getToolVersion('node') /* Cleanup and Prep */ nvm(env.NODE_VERSION) { mobile.prep(cmn.getBuildType()) } } } } stage('Lint') { steps { nvm(env.NODE_VERSION) { script { cmn.runLint() } } } } stage('Tests') { steps { nvm(env.NODE_VERSION) { script { cmn.runTests() } } } } stage('Build') { steps { nvm(env.NODE_VERSION) { script { mobile.leinBuild('android') } } } } stage('Bundle') { steps { nvm(env.NODE_VERSION) { script { apk = mobile.android.bundle(cmn.getBuildType()) } } } } stage('Archive') { steps { archiveArtifacts apk } } stage('Upload') { steps { script { env.PKG_URL = cmn.uploadArtifact(apk) /* build type specific */ switch (cmn.getBuildType()) { case 'release': mobile.android.uploadToPlayStore(); break; case 'nightly': env.DIAWI_URL = mobile.android.uploadToDiawi(); break; case 'e2e': env.SAUCE_URL = mobile.android.uploadToSauceLabs() } } } } stage('Cleanup') { steps { script { cmn.clean() } } } } post { failure { script { load('ci/common.groovy').notifyPRFailure() } } success { script { load('ci/common.groovy').notifyPRSuccess() } } } }