From 74281a742f173a1bdb40cb1f61c4cc69a77031a8 Mon Sep 17 00:00:00 2001 From: Roman Volosovskyi Date: Wed, 4 Apr 2018 17:36:26 +0100 Subject: [PATCH] upload release to iTC/PM --- Jenkinsfile.nightly_fastlane | 2 +- Jenkinsfile.upload_release | 92 ++++++++++++++++++++++++++++++++++++ android/app/build.gradle | 4 ++ fastlane/Fastfile | 13 +++++ 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 Jenkinsfile.upload_release diff --git a/Jenkinsfile.nightly_fastlane b/Jenkinsfile.nightly_fastlane index 59f1c2dd72..8802a94100 100644 --- a/Jenkinsfile.nightly_fastlane +++ b/Jenkinsfile.nightly_fastlane @@ -60,7 +60,7 @@ node ('macos1'){ withCredentials([string(credentialsId: 'jenkins_pass', variable: 'password')]) { sh ('git tag -d ' + latest_tag + ' || exit 0') sh ('git tag ' + latest_tag) - def build_no = sh(returnStdout: true, script: 'git rev-list --count 0.9.15').trim() + def build_no = sh(returnStdout: true, script: 'git rev-list --count HEAD').trim() sh ('plutil -replace CFBundleShortVersionString -string ' + latest_tag + ' ios/StatusIm/Info.plist') sh ('plutil -replace CFBundleVersion -string ' + build_no + ' ios/StatusIm/Info.plist') sh 'export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' diff --git a/Jenkinsfile.upload_release b/Jenkinsfile.upload_release new file mode 100644 index 0000000000..456b760e58 --- /dev/null +++ b/Jenkinsfile.upload_release @@ -0,0 +1,92 @@ +// We need release builds for users who want to test apps, diawi removes old builds and limits downloads, hence the need for Artifactory. +// To see env: echo sh(returnStdout: true, script: 'env') + +env.LANG="en_US.UTF-8" +env.LANGUAGE="en_US.UTF-8" +env.LC_ALL="en_US.UTF-8" + +def installJSDeps() { + def attempt = 1 + def maxAttempts = 10 + def installed = false + while (!installed && attempt <= maxAttempts) { + println "#${attempt} attempt to install npm deps" + sh 'npm install' + installed = fileExists('node_modules/web3/index.js') + attemp = attempt + 1 + } +} + +node ('macos1'){ + def apkUrl = '' + def ipaUrl = '' + def testPassed = true + def version + + load "$HOME/env.groovy" + + try { + + stage('Git & Dependencies') { + slackSend color: 'good', message: BRANCH_NAME + ' build started. ' + env.BUILD_URL + + if (!BRANCH_NAME.startsWith("release/")){ + error "Wrong branch name format: " + BRANCH_NAME + ", but it should be `release/version`" + } + + version = BRANCH_NAME.substring(8) + + println version + + checkout scm + + sh 'git fetch --tags' + + sh 'rm -rf node_modules' + sh 'cp .env.prod .env' + sh 'lein deps' + installJSDeps() + + sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack' + sh 'cd ios && pod install && cd ..' + } + + stage('Tests') { + sh 'lein test-cljs' + } + + stage('Build') { + sh 'lein prod-build' + } + + stage('Build (Android)') { + sh 'cd android && ./gradlew assembleRelease -PreleaseVersion=' + version + } + + stage('Build (iOS)') { + withCredentials([string(credentialsId: 'jenkins_pass', variable: 'password')]) { + def build_no = sh(returnStdout: true, script: 'git rev-list --count HEAD').trim() + sh ('plutil -replace CFBundleShortVersionString -string ' + version + ' ios/StatusIm/Info.plist') + sh ('plutil -replace CFBundleVersion -string ' + build_no + ' ios/StatusIm/Info.plist') + sh 'export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' + sh ('security unlock-keychain -p ' + password + ' login.keychain') + sh 'xcodebuild -exportArchive -exportPath status_appstore -archivePath status.xcarchive -exportOptionsPlist ~/archive-release.plist' + } + } + + stage('Deploy (Android)') { + sh ('bundle exec fastlane android release || exit 0') + } + + stage('Deploy (iOS)') { + sh ('bundle exec fastlane ios release || exit 0') + } + } catch (e) { + slackSend color: 'bad', message: 'Release build failed uploading to iTC/Play Market. ' + env.BUILD_URL + throw e + } + + stage('Slack Notification') { + slackSend color: 'good', message: 'Release build ' + version + ' succesfully aploade to iTC/Play Market' + } +} diff --git a/android/app/build.gradle b/android/app/build.gradle index 656e179ea9..6ac84b7882 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -107,6 +107,10 @@ def getVersionCode = { -> def getVersionName = { -> new ByteArrayOutputStream().withStream { stdOut -> + if (project.hasProperty("releaseVersion")) { + return project.releaseVersion + } + exec { commandLine "git", "describe", "--tags", "--always", "--dirty=+" standardOutput = stdOut diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 9106391755..40fe85d425 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -18,6 +18,12 @@ platform :ios do ) slack(message: "New nightly build uploaded to iTunes Connect") end + lane :release do + upload_to_testflight( + ipa: "status_appstore/StatusIm.ipa" + ) + slack(message: "New release build uploaded to iTunes Connect") + end desc "Remove inactive TestFlight users" lane :clean do clean_testflight_testers @@ -34,4 +40,11 @@ platform :android do ) slack(message: "New nightly build uploaded to Google Play") end + lane :release do + upload_to_play_store( + track: "alpha", + apk: "android/app/build/outputs/apk/release/app-release.apk" + ) + slack(message: "New release build uploaded to Google Play") + end end