mirror of
https://github.com/status-im/status-react.git
synced 2025-02-13 11:27:08 +00:00
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>
179 lines
7.0 KiB
Plaintext
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
|
|
}
|
|
}
|
|
}
|