status-react/ci/Jenkinsfile.nightly_fastlane
Igor Mandrigin 329c360a40
Less magic for fastlane parameters.
1. Don't require all the nodes to be provisioned manually to upload to Google play.

2. Don't require all the nodes to be provisioned manually to send to Slack channel.

Pass it as a credential from Jenkins instead.

Signed-off-by: Igor Mandrigin <i@mandrigin.ru>
2018-08-14 16:14:07 +02:00

179 lines
7.0 KiB
Plaintext

// We need nightly 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')
properties([
buildDiscarder(logRotator(
numToKeepStr: '30',
daysToKeepStr: '30',
))
])
env.LANG="en_US.UTF-8"
env.LANGUAGE="en_US.UTF-8"
env.LC_ALL="en_US.UTF-8"
env.FASTLANE_DISABLE_COLORS=1
env.REALM_DISABLE_ANALYTICS=1
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
}
}
timeout(90) {
node ('fastlane'){
def apkUrl = ''
def ipaUrl = ''
def testPassed = true
def version
def build_no
load "$HOME/env.groovy"
try {
stage('Git & Dependencies') {
slackSend color: 'good', message: 'Nightly build started. ' + env.BUILD_URL
checkout scm
sh 'git fetch --tags'
sh 'rm -rf node_modules'
sh 'cp .env.nightly .env'
sh 'scripts/prepare-for-platform.sh mobile'
version = readFile("${env.WORKSPACE}/VERSION").trim()
installJSDeps()
sh 'mvn -f modules/react-native-status/ios/RCTStatus dependency:unpack'
sh 'cd ios && pod install && cd ..'
}
stage('Tag Build') {
withCredentials([[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'status-im-auto',
usernameVariable: 'GIT_USER',
passwordVariable: 'GIT_PASS'
]]) {
build_no = sh(
returnStdout: true,
script: './scripts/build_no.sh --increment'
).trim()
}
}
stage('Tests') {
sh 'lein test-cljs'
}
stage('Build') {
sh 'lein prod-build'
}
stage('Build (Android)') {
sh 'cd android && ./gradlew react-native-android:installArchives && ./gradlew assembleRelease'
}
stage('Deploy (Android)') {
def artifact_dir = pwd() + '/android/app/build/outputs/apk/release/'
println (artifact_dir + 'app-release.apk')
def artifact = (artifact_dir + 'app-release.apk')
def server = Artifactory.server('artifacts')
shortCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim().take(6)
def filename = 'im.status.ethereum-' + shortCommit + '-n-fl' + '.apk'
def newArtifact = (artifact_dir + filename)
sh ('cp ' + artifact + ' ' + newArtifact)
def uploadSpec = '{ "files": [ { "pattern": "*apk/release/' + filename + '", "target": "nightlies-local" }]}'
def buildInfo = server.upload(uploadSpec)
apkUrl = 'http://artifacts.status.im:8081/artifactory/nightlies-local/' + filename
sh ('echo ARTIFACT Android: ' + apkUrl)
withCredentials([
string(
credentialsId: "SUPPLY_JSON_KEY_DATA",
variable: 'GOOGLE_PLAY_JSON_KEY'
),
string(
credentialsId: "SLACK_URL",
variable: 'SLACK_URL'
)
]) {
sh ('bundle exec fastlane android nightly')
}
}
stage('Build & TestFlight (iOS)') {
withCredentials([
string(credentialsId: "slave-pass-${env.NODE_NAME}", variable: 'KEYCHAIN_PASSWORD'),
string(credentialsId: "SLACK_URL", variable: 'SLACK_URL'),
string(credentialsId: 'FASTLANE_PASSWORD', variable: 'FASTLANE_PASSWORD'),
string(credentialsId: 'APPLE_ID', variable: 'APPLE_ID'),
string(credentialsId: 'fastlane-match-password', variable:'MATCH_PASSWORD')]) {
sh "plutil -replace CFBundleShortVersionString -string ${version} ios/StatusIm/Info.plist"
sh "plutil -replace CFBundleVersion -string ${build_no} ios/StatusIm/Info.plist"
sh 'fastlane ios nightly'
}
}
stage('Deploy diawi (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-adhoc/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)
}
}
} catch (e) {
slackSend color: 'bad', message: 'Nightly build (develop) failed to build. ' + env.BUILD_URL
throw e
}
stage('Run status-nightly-publish-link job') {
build(
job: 'misc/status-im.github.io-update_env',
parameters: [
[$class: 'StringParameterValue', name: 'APK_URL', value: apkUrl],
[$class: 'StringParameterValue', name: 'IOS_URL', value: ipaUrl]
]
)
}
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') {
withCredentials([string(credentialsId: 'SAUCE_ACCESS_KEY', variable: 'key'), string(credentialsId: 'SAUCE_USERNAME', variable: 'username')]){
apk_name = 'im.status.ethereum-e2e-' + shortCommit + '.apk'
sh('curl -u ' + username+ ':' + key + ' -X POST -H "Content-Type: application/octet-stream" https://saucelabs.com/rest/v1/storage/' + username + '/' + apk_name + '?overwrite=true --data-binary @android/app/build/outputs/apk/release/app-release.apk')
}
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()
testApkUrl = 'https://i.diawi.com/' + hash
sh ('echo ARTIFACT Android for e2e tests: ' + testApkUrl)
}
}
stage('Slack Notification') {
def c = (testPassed ? 'good' : 'warning' )
slackSend color: c, message: 'Nightly build (develop) \nTests: ' + (testPassed ? ':+1:' : ':-1:') + ')\nAndroid: ' + apkUrl + '\n iOS: ' + ipaUrl + '\n Android for e2e: ' + testApkUrl
}
stage('Run extended e2e tests') {
build job: 'end-to-end-tests/status-app-nightly', parameters: [string(name: 'apk', value: '--apk=' + apk_name)], wait: false
}
}
}