diff --git a/Jenkinsfile.release b/Jenkinsfile.release index cbe6251ce9..6399c9295d 100644 --- a/Jenkinsfile.release +++ b/Jenkinsfile.release @@ -63,7 +63,7 @@ node ('macos1'){ } stage('Build (iOS)') { - def build_no = sh(returnStdout: true, script: 'git rev-list --count HEAD').trim() + def build_no = sh(returnStdout: true, script: './build_no.sh --tag').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' @@ -97,6 +97,17 @@ node ('macos1'){ sh ('echo ARTIFACT iOS: ' + ipaUrl) } } + + stage('Push build tag') { + withCredentials([[ + $class: 'UsernamePasswordMultiBinding', + credentialsId: 'jenkins-status-im', + usernameVariable: 'GIT_USER', + passwordVariable: 'GIT_PASS' + ]]) { + sh ('git push --tags https://${GIT_USER}:${GIT_PASS}@github.com/status-im/status-react --tags') + } + } } catch (e) { slackSend color: 'bad', message: 'Release build failed to build. ' + env.BUILD_URL throw e diff --git a/Jenkinsfile.upload_release b/Jenkinsfile.upload_release index 3832f36f2a..802097f4be 100644 --- a/Jenkinsfile.upload_release +++ b/Jenkinsfile.upload_release @@ -64,7 +64,7 @@ node ('macos1'){ stage('Build (iOS)') { withCredentials([string(credentialsId: 'jenkins_pass', variable: 'password')]) { - def build_no = sh(returnStdout: true, script: 'git rev-list --count HEAD').trim() + def build_no = sh(returnStdout: true, script: './build_no.sh --tag').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' @@ -80,6 +80,18 @@ node ('macos1'){ stage('Deploy (iOS)') { sh ('bundle exec fastlane ios release || exit 0') } + + + stage('Push build tag') { + withCredentials([[ + $class: 'UsernamePasswordMultiBinding', + credentialsId: 'jenkins-status-im', + usernameVariable: 'GIT_USER', + passwordVariable: 'GIT_PASS' + ]]) { + sh ('git push --tags https://${GIT_USER}:${GIT_PASS}@github.com/status-im/status-react --tags') + } + } } catch (e) { slackSend color: 'bad', message: 'Release build failed uploading to iTC/Play Market. ' + env.BUILD_URL throw e diff --git a/android/app/build.gradle b/android/app/build.gradle index bb43faf743..f71654fad2 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -98,8 +98,9 @@ def enableProguardInReleaseBuilds = false def getVersionCode = { -> new ByteArrayOutputStream().withStream { stdOut -> exec { - commandLine "git", "rev-list", "--count", "HEAD" + commandLine "sh", "../../build_no.sh", "--tag" standardOutput = stdOut + errorOutput = System.err } return stdOut.toString().toInteger() } diff --git a/build_no.sh b/build_no.sh new file mode 100755 index 0000000000..c81df4c685 --- /dev/null +++ b/build_no.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env sh + +# +# This script manages app build numbers. +# It returns the next build number to be used. +# If ran with --tag it will mark current HEAD with new build number. +# +# These numbers are used to mark app artifacts for: +# * Play Store - versionCode attribute (gradle) +# * Apple Store - CFBundleVersion attribute (plutil) +# +# The numbers need to be incremeneted and are maintained via +# git tags matching the '^build-[0-9]+$' regex. +# Builds from an already tagged commit should use the same number. +# +# For more details see: +# * https://developer.android.com/studio/publish/versioning +# * https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# + +getNumber () { + echo "$BUILD" | sed 's/[^0-9]*//g' +} + +REGEX='^build-[0-9]\+$' + +# make sure we have all the tags +git fetch --tags --quiet + +# check if current commit has a build tag +BUILD=$(git tag --points-at HEAD | grep -e "$REGEX") + +# chech for multiple lines +if [ 1 -lt $(echo "$BUILD" | grep -c -) ]; then + echo "Commit marked with one than one build tag!" >&2 + echo "$BUILD" >&2 + exit 1 +fi + +# use already existing build number if applicable +if [ -n "$BUILD" ]; then + echo "Current commit already tagged: $BUILD" >&2 + getNumber $BUILD + exit 0 +fi + +# otherwise find the last used build number +BUILD=$(git tag -l --sort=-v:refname | grep -e "$REGEX" | head -n 1) +# extract the number +BUILD_NO=$(getNumber "$BUILD") +# increment +BUILD_NO="$((BUILD_NO+1))" + +if [ "$1" = "--tag" ]; then + echo "Tagging HEAD: build-$BUILD_NO" >&2 + echo "You will need to 'git push --tags' to make this tag take effect." >&2 + git tag "build-$BUILD_NO" HEAD +fi + +# finally print build number +echo "$BUILD_NO"