diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 2806045b5e..12b5dfda64 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -80,8 +80,9 @@ timeout(90) { // iOS stage('Build (iOS)') { - sh 'export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ~/archive.plist' + env.RCT_NO_LAUNCH_PACKAGER = true + sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' + sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' } stage('Deploy (iOS)') { diff --git a/ci/Jenkinsfile.nightly b/ci/Jenkinsfile.nightly index 2c6bcdc8e8..413731383d 100644 --- a/ci/Jenkinsfile.nightly +++ b/ci/Jenkinsfile.nightly @@ -56,8 +56,9 @@ timeout(90) { } stage('Build (iOS)') { - sh 'export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ~/archive.plist' + env.RCT_NO_LAUNCH_PACKAGER = true + sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' + sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' } stage('Deploy (Android)') { diff --git a/ci/Jenkinsfile.nightly_fastlane b/ci/Jenkinsfile.nightly_fastlane index 4f83828b81..c1e5f7ed55 100644 --- a/ci/Jenkinsfile.nightly_fastlane +++ b/ci/Jenkinsfile.nightly_fastlane @@ -74,13 +74,16 @@ timeout(90) { } stage('Build (iOS)') { - withCredentials([string(credentialsId: 'jenkins_pass', variable: 'password')]) { - 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' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ~/archive.plist' + withCredentials([ + string(credentialsId: 'jenkins_pass', variable: 'password') + ]) { + sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" + sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" + env.RCT_NO_LAUNCH_PACKAGER = true + sh '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 ios/archive-release.plist' + sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive.plist' } } diff --git a/ci/Jenkinsfile.parameters b/ci/Jenkinsfile.parameters index 0576b16281..27909d1ec1 100644 --- a/ci/Jenkinsfile.parameters +++ b/ci/Jenkinsfile.parameters @@ -4,124 +4,124 @@ 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 - } + 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 ('macos') { - def apkUrl = '' - def ipaUrl = '' - def testPassed = true - def branch; + node ('macos') { + def apkUrl = '' + def ipaUrl = '' + def testPassed = true + def branch; - load "$HOME/env.groovy" + load "$HOME/env.groovy" - try { + try { + stage('Git & Dependencies') { + slackSend color: 'good', message: REPO + ":" + BRANCH_NAME + ' build started. ' + env.BUILD_URL - stage('Git & Dependencies') { - slackSend color: 'good', message: REPO + ":" + BRANCH_NAME + ' build started. ' + env.BUILD_URL + checkout scm - checkout scm + sh 'rm -rf node_modules' - sh 'rm -rf node_modules' + sh 'test ${JENKINS_REBASE_DEVELOP} -eq 1 && git rebase origin/develop || echo "Not rebasing on develop."' - sh 'test ${JENKINS_REBASE_DEVELOP} -eq 1 && git rebase origin/develop || echo "Not rebasing on develop."' + // Assume all parameters are set in Jenkins 'Parameterized build' + // TODO(oskarth): Consider read/write from .env to avoid having to specify in Jenkins again + // sh 'cp .env.jenkins .env' + sh 'echo TESTFAIRY_ENABLED=' + TESTFAIRY_ENABLED + '>>' + '.env' + sh 'echo ETHEREUM_DEV_CLUSTER=' + ETHEREUM_DEV_CLUSTER + '>>' + '.env' + sh 'echo MAINNET_NETWORKS_ENABLED=' + MAINNET_NETWORKS_ENABLED + '>>' + '.env' + sh 'echo LOG_LEVEL=' + LOG_LEVEL + '>>' + '.env' + sh 'echo LOG_LEVEL_STATUS_GO=' + LOG_LEVEL_STATUS_GO + '>>' + '.env' + sh 'echo OFFLINE_INBOX_ENABLED=' + OFFLINE_INBOX_ENABLED + '>>' + '.env' + sh 'echo POW_TARGET=' + POW_TARGET + '>>' + '.env' + sh 'echo POW_TIME=' + POW_TIME + '>>' + '.env' + sh 'echo MAINNET_WARNING_ENABLED=' + MAINNET_WARNING_ENABLED + '>>' + '.env' + sh 'echo DEFAULT_NETWORK=' + DEFAULT_NETWORK + '>>' + '.env' - // Assume all parameters are set in Jenkins 'Parameterized build' - // TODO(oskarth): Consider read/write from .env to avoid having to specify in Jenkins again - // sh 'cp .env.jenkins .env' - sh 'echo TESTFAIRY_ENABLED=' + TESTFAIRY_ENABLED + '>>' + '.env' - sh 'echo ETHEREUM_DEV_CLUSTER=' + ETHEREUM_DEV_CLUSTER + '>>' + '.env' - sh 'echo MAINNET_NETWORKS_ENABLED=' + MAINNET_NETWORKS_ENABLED + '>>' + '.env' - sh 'echo LOG_LEVEL=' + LOG_LEVEL + '>>' + '.env' - sh 'echo LOG_LEVEL_STATUS_GO=' + LOG_LEVEL_STATUS_GO + '>>' + '.env' - sh 'echo OFFLINE_INBOX_ENABLED=' + OFFLINE_INBOX_ENABLED + '>>' + '.env' - sh 'echo POW_TARGET=' + POW_TARGET + '>>' + '.env' - sh 'echo POW_TIME=' + POW_TIME + '>>' + '.env' - sh 'echo MAINNET_WARNING_ENABLED=' + MAINNET_WARNING_ENABLED + '>>' + '.env' - sh 'echo DEFAULT_NETWORK=' + DEFAULT_NETWORK + '>>' + '.env' + sh 'echo "**********************************************************************"' + sh 'echo PARAMETERIZED BUILD - USING CUSTOM ENVIRONMENT' + sh 'cat .env' + sh 'echo "**********************************************************************"' - sh 'echo "**********************************************************************"' - sh 'echo PARAMETERIZED BUILD - USING CUSTOM ENVIRONMENT' - sh 'cat .env' - sh 'echo "**********************************************************************"' + installJSDeps() - 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' - } - - // Android - stage('Build (Android)') { - sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease' - } - stage('Deploy (Android)') { - withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@android/app/build/outputs/apk/release/app-release.apk -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() - sh 'sleep 10' - def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() - apkUrl = 'https://i.diawi.com/' + hash - - sh ('echo ARTIFACT Android: ' + apkUrl) - } - } - - // try { - // stage('Test (Android)') { - // sauce('b9aded57-5cc1-4f6b-b5ea-42d989987852') { - // sh 'cd test/appium && mvn -DapkUrl=' + apkUrl + ' test' - // saucePublisher() - // } - // } - // } catch(e) { - // testPassed = false - // } - - // iOS - stage('Build (iOS)') { - sh 'export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' - sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ~/archive.plist' - } - stage('Deploy (iOS)') { - withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { - def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() - sh 'sleep 10' - def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() - ipaUrl = 'https://i.diawi.com/' + hash - - sh ('echo ARTIFACT iOS: ' + ipaUrl) - - } - } - - stage('Slack Notification') { - def c = (testPassed ? 'good' : 'warning' ) - slackSend color: c, message: 'Branch: ' + REPO + ":" + BRANCH_NAME + - '\nAndroid: ' + apkUrl + - '\niOS: ' + ipaUrl - } - - } catch (e) { - slackSend color: 'bad', message: REPO + ":" + BRANCH_NAME + ' failed to build. ' + env.BUILD_URL - throw e + 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' + } + + // Android + stage('Build (Android)') { + sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease' + } + stage('Deploy (Android)') { + withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { + def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@android/app/build/outputs/apk/release/app-release.apk -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() + sh 'sleep 10' + def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() + apkUrl = 'https://i.diawi.com/' + hash + + sh ('echo ARTIFACT Android: ' + apkUrl) + } + } + + // try { + // stage('Test (Android)') { + // sauce('b9aded57-5cc1-4f6b-b5ea-42d989987852') { + // sh 'cd test/appium && mvn -DapkUrl=' + apkUrl + ' test' + // saucePublisher() + // } + // } + // } catch(e) { + // testPassed = false + // } + + // iOS + stage('Build (iOS)') { + env.RCT_NO_LAUNCH_PACKAGER = true + sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' + sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' + } + stage('Deploy (iOS)') { + withCredentials([string(credentialsId: 'diawi-token', variable: 'token')]) { + def job = sh(returnStdout: true, script: 'curl https://upload.diawi.com/ -F token='+token+' -F file=@status/StatusIm.ipa -F find_by_udid=0 -F wall_of_apps=0 | jq -r ".job"').trim() + sh 'sleep 10' + def hash = sh(returnStdout: true, script: "curl -vvv 'https://upload.diawi.com/status?token="+token+"&job="+job+"'|jq -r '.hash'").trim() + ipaUrl = 'https://i.diawi.com/' + hash + + sh ('echo ARTIFACT iOS: ' + ipaUrl) + } + } + + stage('Slack Notification') { + def c = (testPassed ? 'good' : 'warning' ) + slackSend( + color: c, + message: "Branch: ${REPO}:${BRANCH_NAME}\nAndroid: ${apkUrl}\niOS: ${ipaUrl}" + ) + } + + } catch (e) { + slackSend color: 'bad', message: REPO + ":" + BRANCH_NAME + ' failed to build. ' + env.BUILD_URL + throw e } + } } diff --git a/ci/Jenkinsfile.release b/ci/Jenkinsfile.release index bc5dd3bd4c..b5eb51aa4e 100644 --- a/ci/Jenkinsfile.release +++ b/ci/Jenkinsfile.release @@ -75,10 +75,11 @@ timeout(90) { } stage('Build (iOS)') { - 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 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ~/archive.plist' + sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" + sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" + env.RCT_NO_LAUNCH_PACKAGER = true + sh 'xcodebuild -workspace ios/StatusIm.xcworkspace -scheme StatusIm -configuration release -archivePath status clean archive' + sh 'xcodebuild -exportArchive -exportPath status -archivePath status.xcarchive -exportOptionsPlist ios/archive-develop.plist' } stage('Deploy (Android)') { diff --git a/ci/Jenkinsfile.upload_release_ios b/ci/Jenkinsfile.upload_release_ios index 3cfb53eaa4..3c272b4af5 100644 --- a/ci/Jenkinsfile.upload_release_ios +++ b/ci/Jenkinsfile.upload_release_ios @@ -75,11 +75,12 @@ timeout(90) { stage('Build (iOS)') { withCredentials([string(credentialsId: 'jenkins_pass', variable: 'password')]) { - 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' + sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist" + sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist" + env.RCT_NO_LAUNCH_PACKAGER = true + sh '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 ios/archive-release.plist' } } diff --git a/ios/archive-develop.plist b/ios/archive-develop.plist new file mode 100644 index 0000000000..fbed5e8ee1 --- /dev/null +++ b/ios/archive-develop.plist @@ -0,0 +1,10 @@ + + + + + teamID + DTX7Z4U3YA + method + development + + diff --git a/ios/archive-release.plist b/ios/archive-release.plist new file mode 100644 index 0000000000..4d2930c966 --- /dev/null +++ b/ios/archive-release.plist @@ -0,0 +1,16 @@ + + + + + teamID + DTX7Z4U3YA + method + app-store + uploadBitcode + + compileBitcode + + ITSAppUsesNonExemptEncryption + + +