sainth.de

sainth.de

Ein persönlicher Blog über alles, was mich interessiert, also überwiegend Programmierung im Allgemeinen und Spieleprogrammierung im Speziellen.

Nexus als Binär-Repository für APKs nutzen

Kurzes Tutorial, wie man Nexus OSS als Binarrepository für APKs benutzen kann

Tobias Wink

Lesezeit: 3 Minuten

Nexus logo

Wer Nexus OSS nutzt, um seine fertigen Binärartefakte abzulegen, möchte dies natürlich auch für seine APKs machen. Da ich momentan beruflich an einer Android-App arbeite, habe ich nun meine Erfahrungen damit sammeln dürfen. Und damit ich beim nächsten Mal nicht wieder über dieselben Fallstricke stolpere, werde ich es hier Schritt für Schritt erläutern.

Meine bisherigen Erfahrungen mit Gradle sind (glücklicherweise) kaum der Rede wert, sodass zuerst eine ausführliche Google-Recherche auf dem Programm stand. Diese führte mich auch alsbald zum Maven-Plugin für Gradle und der folgenden Konfiguration für uploadArchives:

apply plugin: 'maven'

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: "file://localhost/tmp/myRepo/")
    }
  }
}

Ein entsprechender Aufruf mit gradlew clean assemble uploadArchives lief zwar erfolgreich durch, aber es wurden keinerlei Artefakte abgelegt. So wurde ich dann auf den Gradle-Userguide Publishing artifacts aufmerksam und mir wurde klar, dass die APKs deklariert werden müssen, damit uploadArchives auch weiß, was hochgeladen werden soll.

Um die APKs aller Buildvarianten (Debug, Release und/ oder Productflavors), die mit assemble erstellt werden, hinzuzufügen hilft die folgende Ergänzung:

android.applicationVariants.all { variant ->
  def apkFile = file(variant.outputs.outputFile[0])

  tasks."assemble${variant.name.capitalize()}" << {
    artifacts {
      archives file: apkFile
    }
  }
}

Leider funktioniert nun mit den hinzugefügten APKs uploadArchives nicht mehr, da innerhalb einer POM nicht mehrere Artefakte desselben Typs und Classifiers vorkommen dürfen. Es erscheint folgende Fehlermeldung:

:app:uploadArchives FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:uploadArchives'.
> Could not publish configuration 'archives'
   > A POM cannot have multiple artifacts with the same type and classifier. Already have MavenArtifact app:apk:apk:null, trying to add MavenArtifact app:apk:apk:null.

Also muss die Konfiguration der Artefakte noch ein wenig erweitert werden. Am einfachsten geht es über den classifier, wie im nachfolgenden Snippet:

android.applicationVariants.all { variant ->
  def apkFile = file(variant.outputs.outputFile[0])

  tasks."assemble${variant.name.capitalize()}" << {
    artifacts {
      archives file: apkFile, name: variant.baseName, type: 'apk', classifier: variant.baseName
    }
  }
}

Damit ist der erste Teil abgeschlossen. Die APKs landen im konfigurierten Repository. Nun müssen nur noch bei Bedarf die Standardwerte der POM-Generierung angepasst werden, in meinem Fall groupId, artifactId und version:

apply plugin: 'maven'

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: "file://localhost/tmp/myRepo/")
      pom {
        groupId 'de.sainth.android'
        artifactId 'meineTolleApp'
        version android.defaultConfig.versionName
      }
    }
  }
}

Zu guter Letzt das lokale Repository durch das Reale ersetzen. Um die Zugangsdaten für den Nexus nicht einchecken zu müssen, bietet es sich an, sie in der zentralen ~/.gradle/gradle.properties zu hinterlegen und darauf zu verweisen.

nexusUser=Benutzername
nexusPassword=Passwort

So entsteht dann zum Schluss die nachfolgende Konfiguration für das Zusammenspiel von Gradle und Nexus für die APK-Ablage:

apply plugin: 'maven'

android.applicationVariants.all { variant ->
  def apkFile = file(variant.outputs.outputFile[0])

  tasks."assemble${variant.name.capitalize()}" << {
    artifacts {
      archives file: apkFile, name: variant.baseName, type: 'apk', classifier: variant.baseName
    }
  }
}

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: "https://mein.nexus.de/repo/") {
        authentication(userName: "$nexusUser", password: "$nexusPassword")
      }
      pom {
        groupId 'de.sainth.android'
        artifactId 'meineTolleApp'
        version android.defaultConfig.versionName
      }
    }
  }
}

Neueste Artikel

Kategorien

Über Mich

Ich bin nur ein einfacher Mensch, der sich etwas mit Computern beschäftigt. 😉