Android gradle: autoincrement version before release task

Hi. I have version string like “1.0.3” in gradle.properties file.

I want to have 3 tasks:

release - update version to 2.0.0 and create release apk releaseBeta - update version to 1.1.0 and create release apk releaseNightly - update version to 1.0.4 and create release apk

I’ve done it already for gradle 1.12 and plugin 0.12.+, but with gradle 2.2.1 and plugin 1.0 my solution doesn’t work (version of created apk is the old instead updated one)

My code is: VersionUtils is just helper java class to operate with version strings

import java.util.regex.Matcher
import java.util.regex.Pattern
  buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:1.0.0"
    }
}
  task wrapper(type: Wrapper) {
    gradleVersion = '2.2.1'
}
  ext {
    deliveryDir = 'delivery'
    appVersion = new Version(project: this, subprojects: subprojects, versionName: versionName)
}
  subprojects {
    repositories {
        jcenter()
    }
}
  subprojects.each { subproject ->
    subproject.configurations.all {
        resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
        resolutionStrategy.cacheDynamicVersionsFor 0, 'seconds'
    }
    evaluationDependsOn(subproject.path)
}
  subprojects.findAll { project -> project.hasProperty('android') && project.android.hasProperty('applicationVariants') }.each { project ->
    def deliverToLocal = task("deliverToLocal_${project.name}") {
        ext.outputDir = "${deliveryDir}/${project.name}"
        description = "Deliver ${project.name} binaries to ${outputDir} folder"
          dependsOn project.assembleRelease
        doLast {
            deliverBinariesFor project, outputDir
        }
    }
      task("release_${project.name}", dependsOn: deliverToLocal) << {
        description = "Release ${project.name} application"
    }
}
  task clearDeliveryDir << {
    delete deliveryDir
    delete 'build'
}
  def deliverBinariesFor(def project, def outputDir) {
    project.android.applicationVariants.all { variant ->
        copy {
            variant.outputs.each { output ->
                from output.outputFile
            }
            from "${project.buildDir}/outputs/proguard/release/mapping.txt"
            from "${project.buildDir}/outputs/lint-results-release-fatal.html"
            into outputDir
        }
        copy {
            from("${project.buildDir}/outputs") {
                include 'lint-results*_files/*.css'
                include 'lint-results*_files/*.png'
            }
            into "${outputDir}/lint-result-release-fatal"
        }
    }
}
  task deliverToExternal(dependsOn: [tasks.findAll { task -> task.name.startsWith('release_') }]) << {}
  //---------------release app---------------------------
  task increaseMajorVersion << {
    appVersion.increaseMajor()
}
  task increaseBetaVersion << {
    appVersion.increaseBeta()
}
  task increaseNightlyVersion << {
    appVersion.increaseNightly()
}
  task saveVersion << {
    appVersion.save()
}
  clearDeliveryDir.mustRunAfter increaseMajorVersion
clearDeliveryDir.mustRunAfter increaseBetaVersion
clearDeliveryDir.mustRunAfter increaseNightlyVersion
deliverToExternal.mustRunAfter clearDeliveryDir
saveVersion.mustRunAfter deliverToExternal
  task releaseMajor(dependsOn: [increaseMajorVersion, clearDeliveryDir, deliverToExternal, saveVersion]) {
    description 'Release a new version of application, create tag and increase version'
      doLast {
        println "${appVersion} released"
    }
}
  task releaseBeta(dependsOn: [increaseBetaVersion, clearDeliveryDir, deliverToExternal, saveVersion]) {
    description 'Release a new version of application, create tag and increase version'
      doLast {
        println "${appVersion} released"
    }
}
  task releaseNightly(dependsOn: [increaseNightlyVersion, clearDeliveryDir, deliverToExternal, saveVersion]) {
    description 'Release a new version of application, create tag and increase version'
      doLast {
        println "${appVersion} released"
    }
}
  //-------------------Utils----------------
  class Version {
    def project
    def subprojects
    String versionName
    boolean release
      String toString() { return VersionUtils.toString(versionName) }
      Version increaseMajor() { versionName = VersionUtils.increaseMajor(versionName); apply(); this }
      Version increaseBeta() { versionName = VersionUtils.increaseBeta(versionName); apply(); this }
      Version increaseNightly() { versionName = VersionUtils.increaseNightly(versionName); apply(); this }
      void apply() {
        subprojects.findAll { project -> project.hasProperty('android') && project.android.hasProperty('applicationVariants') }.each { project ->
            project.android.defaultConfig.versionName = this.toString()
            project.android.defaultConfig.versionCode = VersionUtils.makeVersionCode(this.toString(), project.android.defaultConfig.minSdkVersion.mApiLevel as int)
            project.android.productFlavors.each { flavor ->
                flavor.versionName = this.toString()
                flavor.versionCode = VersionUtils.makeVersionCode(this.toString(), flavor.minSdkVersion.mApiLevel as int)
                  println "${flavor.name} versionName = ${flavor.versionName}, versionCode = ${flavor.versionCode}"
            }
        }
    }
      void save() {
        project.ant.propertyfile(file: 'gradle.properties') {
            entry(key: "versionName", value: versionName)
        }
        project.ant.replaceregexp(file: 'gradle.properties', match: /^#[^ ].*\s*/, replace: "", flags: "g")
    }
}

So please help me to understand, why after updating from gradle 1.12 to 2.2.1 my code stops working.