Android Studio,Gradle:如何自动将release.apk发布到svn存储库?

Bev*_*vor 7 gradle gradle-release-plugin android-studio

在Maven中,发布过程没有问题.由于我被迫使用带有Gradle的Android Studio,我希望实现与Eclipse和Maven相同的行为.我找到了一些非常好的Maven-like发布插件(https://github.com/researchgate/gradle-release),它几乎按预期工作,但它没有上传发布apk,虽然它正确创建了apk /app/build/outputs/apk和标记我的SVN存储库中的源代码.release文件夹仍为空.我甚至不确定这个插件是否可以做到这一点,因为它没有很好的文档,但我想我需要告诉这个插件要上传什么以及在哪里找到它.只有一个afterReleaseBuild.dependsOn uploadArchives.这是什么意思,我必须覆盖这个uploadArchives方法或Gradle中的这个意思?它似乎是内置的东西,因为如果我在我的脚本中编写并运行,Gradle构建不会抱怨gradlew release.显然插件已经知道存储库并且可以通过ssh连接,否则它无法创建标记,但似乎它不知道要上传什么,发布文件夹保持空白.与此同时,我试图通过许多其他Gradle尝试来解决这个问题,例如使用Maven插件,但后来我遇到SSH证书问题而没有解决方案,即使它有效,也不会是一个好的解决方案,因为我不喜欢不想创建pom.xml文件等,这本来就是一种解决方法.

目标是发布过程应该自动在svn存储库的releases文件夹中创建一个文件夹,该文件夹的名称与当前版本相同(因为它已在tags文件夹中工作,例如1.0.0)并将已发布的apk复制到已经重命名的apk中Gradle的myapp-app-1.0.0-release.apk,因为这是本地输出文件夹中包的名称.

这是我当前的gradle脚本,它可以在输出文件夹中生成release apk但不会将其上传到svn:

apply plugin: 'com.android.application'
apply plugin: 'net.researchgate.release'

def keystorePropertiesFile = rootProject.file("/home/myuser/.android/keystore.properties")
def keystoreProperties = new Properties()
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

android {
    lintOptions {
        //TODO remove this or set to true
        abortOnError false
    }

    signingConfigs {
        myapp_release_config {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }
    compileSdkVersion 24
    buildToolsVersion "24.0.1"

    packagingOptions {
        exclude 'META-INF/ASL2.0'
    }

    defaultConfig {
        applicationId "com.mydomain.myapp"
        minSdkVersion 9
        targetSdkVersion 24
        versionCode 1
        versionName '1.0.0'
        archivesBaseName = "myapp-app-$versionName"
    }
    buildTypes {
        debug {
            debuggable true
            zipAlignEnabled false
        }
        release {
            minifyEnabled true
            proguardFiles 'proguard-rules.pro'
            signingConfig signingConfigs.myapp_release_config
            afterReleaseBuild.dependsOn uploadArchives
        }
    }
}

release {
    failOnUnversionedFiles = false

    svn {
        username = 'myuser'
        password = 'mypassword'
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.mydomain.myapp:model:1.0'
    //support-v4
    compile 'com.android.support:support-core-utils:24.2.0'
    compile 'com.android.support:support-fragment:24.2.0'
    //compile 'com.android.support:multidex:1.0.0'
    //support-design
    compile 'com.android.support:design:24.2.0'
    //support-v7
    compile 'com.android.support:appcompat-v7:24.2.0'
    //FlowLayout
    compile 'com.wefika:flowlayout:0.4.1'
    compile 'javax.validation:validation-api:1.1.0.Final'
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.13'

    testCompile 'junit:junit:4.12'
    testCompile 'org.hamcrest:hamcrest-all:1.3'
}
Run Code Online (Sandbox Code Playgroud)

ADe*_*Dev 1

您可以将任务添加到 build.gradle

这是用于发布的示例任务和 bash 脚本:

task publishit (type: Exec) {
    commandLine './publish.sh', android.defaultConfig.versionName
}
assembleRelease.finalizedBy(publishit)
Run Code Online (Sandbox Code Playgroud)

并将publish.sh放入您的应用程序路径中(并使其可执行)

#!/bin/bash
 
### Settings
svn_path='/path/to/repo/'
svn_user='user'
svn_password='password'
app_prefix='myapp-app-'
app_suffix='-release.apk'
release_name='app-release.apk'
dir='/'

current_path=`pwd`
release_path=$current_path$dir$release_name
code_name=$1
app_path=$svn_path$code_name$dir$app_prefix$code_name$app_suffix

cd $svn_path
mkdir $code_name
cp $release_path $app_path

# check and fix these:
svn add $code_name
svn update
svn commit -m "new version" --username $svn_user --password $svn_passwd > publish_log
Run Code Online (Sandbox Code Playgroud)

您可以使用 gradle 语法来完成此操作,有关更多信息,请阅读此处