properties([ buildDiscarder(logRotator( numToKeepStr: '3', daysToKeepStr: '7', )) ]) env.LANG="en_US.UTF-8" env.LANGUAGE="en_US.UTF-8" env.LC_ALL="en_US.UTF-8" env.FASTLANE_DISABLE_COLORS=1 def installJSDeps() { def attempt = 1 def maxAttempts = 10 def installed = false while (!installed && attempt <= maxAttempts) { println "#${attempt} attempt to install npm deps" sh 'scripts/prepare-for-platform.sh mobile' sh 'npm install' installed = fileExists('node_modules/web3/index.js') attemp = attempt + 1 } } timeout(90) { node ('fastlane') { load "$HOME/env.groovy" try { stage('Git & Dependencies') { slackSend color: 'good', message: BRANCH_NAME + '(' + env.CHANGE_BRANCH + ') build started. ' + env.BUILD_URL checkout scm try { sh 'git rebase origin/develop' } catch (e) { sh 'git rebase --abort' throw e } sh 'rm -rf node_modules' sh 'cp .env.jenkins .env' installJSDeps() sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack' sh 'cd ios && pod install && cd ..' } stage('Code style checks') { sh 'lein cljfmt check' } stage('Tests') { sh 'lein test-cljs' } stage('Build') { sh 'lein prod-build' } // Android stage('Build (Android)') { sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease' } stage('Deploy (Android)') { withCredentials([ string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'), string(credentialsId: 'GIT_HUB_TOKEN', variable: 'GITHUB_TOKEN'), string(credentialsId: 'SLACK_JENKINS_WEBHOOK', variable: 'SLACK_URL') ]) { sh 'fastlane android upload_diawi' } } // iOS stage('Build (iOS)') { withCredentials([ string(credentialsId: "slave-pass-${env.NODE_NAME}", variable: 'KEYCHAIN_PASSWORD'), string(credentialsId: 'fastlane-match-password', variable:'MATCH_PASSWORD')]) { sh 'fastlane ios adhoc' } } stage('Deploy (iOS)') { withCredentials([ string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'), string(credentialsId: 'GIT_HUB_TOKEN', variable: 'GITHUB_TOKEN'), string(credentialsId: 'SLACK_JENKINS_WEBHOOK', variable: 'SLACK_URL') ]) { sh 'fastlane ios upload_diawi' } } // Android for e2e stage('Build (Android) for e2e tests') { sh 'cd android && mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/app-release.original.apk && ENVFILE=.env.e2e ./gradlew assembleRelease' } stage('Upload apk for e2e tests') { if (env.CHANGE_ID != null) { env.SAUCE_LABS_APK = env.CHANGE_ID + '.apk' withCredentials([ string(credentialsId: 'SAUCE_ACCESS_KEY', variable: 'SAUCE_ACCESS_KEY'), string(credentialsId: 'SAUCE_USERNAME', variable: 'SAUCE_USERNAME'), string(credentialsId: 'diawi-token', variable: 'DIAWI_TOKEN'), string(credentialsId: 'GIT_HUB_TOKEN', variable: 'GITHUB_TOKEN'), string(credentialsId: 'SLACK_JENKINS_WEBHOOK', variable: 'SLACK_URL') ]) { sh 'fastlane android saucelabs' sh 'fastlane android upload_diawi' } } } } catch (e) { slackSend color: 'bad', message: BRANCH_NAME + ' failed to build. ' + env.BUILD_URL throw e } } }