Tooling: Jenkins configuration for nightly build in source control

Previously this was inline at Jenkins which lead to configuration drift. This
commti introduces Slack notifications for failed builds.
This commit is contained in:
Oskar Thorén 2017-09-12 11:11:46 +02:00 committed by Roman Volosovskyi
parent 9cda6806e3
commit efd5a4c841
1 changed files with 78 additions and 0 deletions

78
Jenkinsfile.nightly Normal file
View File

@ -0,0 +1,78 @@
// 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')
env.LANG="en_US.UTF-8"
env.LANGUAGE="en_US.UTF-8"
env.LC_ALL="en_US.UTF-8"
node {
def apkUrl = ''
def ipaUrl = ''
def testPassed = true
sh 'source /etc/profile'
try {
stage('Git & Dependencies') {
git([url: 'https://github.com/status-im/status-react.git', branch: 'develop'])
// Checkout master because used for iOS Plist version information
sh 'git checkout -- .'
sh 'git fetch --tags'
sh 'git checkout master'
sh 'git checkout ' + 'develop'
sh 'rm -rf node_modules'
sh 'cp .env.jenkins .env'
sh 'lein deps && npm install && ./re-natal deps'
sh 'sed -i "" "s/301000/1201000/g" node_modules/react-native/packager/src/JSTransformer/index.js'
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'
}
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 /Users/Xcloud/archive.plist'
}
stage('Deploy (Android)') {
def artifact_dir = pwd() + '/android/app/build/outputs/apk/'
def artifact = new File(artifact_dir + 'app-release.apk')
assert artifact.exists()
def server = Artifactory.server('artifacts')
def shortCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim().take(6)
def filename = 'im.status.ethereum-' + shortCommit + '.apk'
artifact.renameTo artifact_dir + filename
def uploadSpec = '{ "files": [ { "pattern": "*apk/' + filename + '", "target": "nightlies-local" }]}'
def buildInfo = server.upload(uploadSpec)
slackSend color: 'good', message: 'develop' + ' (Android) http://artifacts.status.im:8081/artifactory/nightlies-local/' + filename
}
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()
slackSend color: 'good', message: 'develop' + ' (iOS) https://i.diawi.com/' + hash
}
}
} catch (e) {
slackSend color: 'bad', message: 'Nightly build (develop) failed to build. ' + env.BUILD_URL
throw e
}
stage('Slack Notification') {
def c = (testPassed ? 'good' : 'warning' )
slackSend color: c, message: 'Nightly build (develop) \nTests: ' + (testPassed ? ':+1:' : ':-1:') + ')\nAndroid: ' + apkUrl + '\n iOS: ' + ipaUrl
}
}