Parametrize gradle build

Make API level parameter and get rid of flavours so build take less time
  and require less disk space, and builder can configure it at the API
  level needed
Add Dockerfile to produce AAR
Attempt to use the generated doker images for gitlab.com CI
This commit is contained in:
Gioacchino Mazzurco 2022-02-15 08:22:35 +01:00
parent 47626b7106
commit 6733885330
No known key found for this signature in database
GPG Key ID: A1FBCA3872E87051
3 changed files with 171 additions and 76 deletions

View File

@ -1,6 +1,6 @@
deploy:
image: gradle:6.5-jdk11
image: registry.gitlab.com/retroshare/retroshare:android_aar_base_16
script:
- './gradlew publish'
- './gradlew build publish -Dorg.gradle.project.buildDir=/libretroshare-build/ -PANDROID_MIN_API_LEVEL=16 -PLIBRETROSHARE_SOURCE_VERSION="$CI_COMMIT_SHORT_SHA" -PNATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"'
only:
- gitlab_maven_repo

View File

@ -7,6 +7,24 @@
* SPDX-License-Identifier: CC0-1.0
*/
/*
* Set minumum Android API level supported by this build passing
* -PANDROID_MIN_API_LEVEL=16 (change 16 to what you need) on the gradle command
* line.
*
* LIBRETROSHARE_SOURCE_VERSION Set source version ex:
* -PLIBRETROSHARE_SOURCE_VERSION="$(git describe --always)"
*
* Optionally set JNI_NATIVE_LIBS_ARCHS to a space separated target CPU
* architectures list named as seen in AAR native libraries directories passing
* -PJNI_NATIVE_LIBS_ARCHS="arm64-v8a armeabi-v7a" defaults to all architectures
* supported by current script at current Android minimum API
*
* Optionally set NATIVE_TOOLCHAINS_DIR for easier reuse of toolchains which
* take a lot to build and doesn't change often
* -PNATIVE_TOOLCHAINS_DIR="/native/toolchains/path"
*/
buildscript
{
repositories
@ -32,6 +50,9 @@ allprojects
}
}
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
ext.buildLibretroshareNativeLib =
{
pApiLevel, /* Android API level */
@ -58,7 +79,16 @@ ext.buildLibretroshareNativeLib =
break;
}
def toolchainsWorkdir = "${buildDir}/native_toolchains/"
def toolchainsWorkdir = null
if(project.hasProperty('NATIVE_TOOLCHAINS_DIR'))
{
toolchainsWorkdir = NATIVE_TOOLCHAINS_DIR
}
else
{
toolchainsWorkdir = "${buildDir}/native_toolchains/"
}
mkdir toolchainsWorkdir
def currToolchainPath = "$toolchainsWorkdir/$pApiLevel-$toolchainArch/"
@ -91,7 +121,7 @@ ext.buildLibretroshareNativeLib =
}
}
def nativeLibsDir = "${buildDir}/native_libs-$pApiLevel/"
def nativeLibsDir = "${buildDir}/native_libs/"
mkdir nativeLibsDir
def currAbiLibDir = "${nativeLibsDir}/$pAbi/"
@ -115,8 +145,43 @@ ext.buildLibretroshareNativeLib =
}
}
apply plugin: 'com.android.library'
apply plugin: 'maven-publish'
task prepareRetroshareNativeLibs
{
doLast
{
def pAbis = null
if(project.hasProperty('JNI_NATIVE_LIBS_ARCHS'))
{
pAbis = JNI_NATIVE_LIBS_ARCHS.split(' ') as List
}
else
{
if(ANDROID_MIN_API_LEVEL.toInteger() <= 16)
{
pAbis = ['armeabi-v7a']
}
else
{
pAbis = ['arm64-v8a', 'armeabi-v7a']
}
}
def pNdkPath = android.getNdkDirectory().getAbsolutePath()
pAbis.each
{
abi ->
buildLibretroshareNativeLib(ANDROID_MIN_API_LEVEL, abi, pNdkPath)
}
}
}
build.dependsOn prepareRetroshareNativeLibs
ext.getArtifactBaseName =
{
config ->
return project.name + "-MinApiLevel" + ANDROID_MIN_API_LEVEL
}
android
{
@ -127,11 +192,16 @@ android
defaultConfig
{
minSdkVersion ANDROID_MIN_API_LEVEL
targetSdkVersion 28
/* Prevent proguard run at applications build time, to alter
* libretroshare Java classes that are used by libretroshare C++ code */
consumerProguardFiles 'misc/Android/proguard-keep-libretroshare-java-classes.pro'
}
setProperty("archivesBaseName", getArtifactBaseName(defaultConfig))
sourceSets
{
main
@ -139,22 +209,7 @@ android
java.srcDirs = [ 'src/rs_android/' ]
manifest.srcFile 'src/rs_android/AndroidManifest.xml'
assets.srcDirs = [ "${buildDir}/libretroshare-build/android-assets/" ]
jniLibs.srcDirs = [ "${buildDir}/native_libs-16" ]
}
minApi16
{
jniLibs.srcDirs = [ "${buildDir}/native_libs-16" ]
}
minApi21
{
jniLibs.srcDirs = [ "${buildDir}/native_libs-21" ]
}
minApi24
{
jniLibs.srcDirs = [ "${buildDir}/native_libs-24" ]
jniLibs.srcDirs = [ "${buildDir}/native_libs/" ]
}
}
@ -163,48 +218,6 @@ android
disable 'LongLogTag'
}
flavorDimensions 'api'
def currNdk = android.getNdkDirectory().getAbsolutePath()
productFlavors
{
minApi16
{
minSdkVersion '16'
targetSdkVersion '16'
def currApi = minSdkVersion.mApiLevel
versionNameSuffix "-API_${currApi}"
buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk)
}
minApi21
{
minSdkVersion '21'
targetSdkVersion '21'
def currApi = minSdkVersion.mApiLevel
versionNameSuffix "-API_${currApi}"
buildLibretroshareNativeLib(currApi, "arm64-v8a", currNdk)
buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk)
}
minApi24
{
minSdkVersion '24'
targetSdkVersion '28'
def currApi = minSdkVersion.mApiLevel
versionNameSuffix "-API_${currApi}"
buildLibretroshareNativeLib(currApi, "arm64-v8a", currNdk)
buildLibretroshareNativeLib(currApi, "armeabi-v7a", currNdk)
}
}
publishing
{
multipleVariants
@ -221,21 +234,37 @@ afterEvaluate
// see https://developer.android.com/reference/tools/gradle-api/7.1/com/android/build/api/dsl/LibraryPublishing
publications
{
android.libraryVariants.each
debug(MavenPublication)
{
variant ->
publishing.publications.create(variant.name, MavenPublication)
groupId = 'org.retroshare.service'
artifactId "${getArtifactBaseName()}-debug"
version LIBRETROSHARE_SOURCE_VERSION
artifact bundleReleaseAar
}
release(MavenPublication)
{
groupId = 'org.retroshare.service'
artifactId "${getArtifactBaseName()}-release"
version LIBRETROSHARE_SOURCE_VERSION
artifact bundleReleaseAar
}
}
repositories
{
maven
{
url = uri("https://gitlab.com/api/v4/projects/${System.getenv('CI_PROJECT_ID')}/packages/maven")
name = "Gitlab"
credentials(HttpHeaderCredentials)
{
from components.findByName(variant.name)
groupId = 'org.retroshare.service'
// -${variant.flavorName}
artifactId "${rootProject.name}-${variant.name}"
version "0.6.6"
artifacts = [ "${buildDir}/outputs/aar/${rootProject.name}-${variant.flavorName}-${variant.buildType.name}.aar" ]
name = "Job-Token"
value = System.getenv("CI_JOB_TOKEN")
}
authentication
{
header(HttpHeaderAuthentication)
}
}
}
}
}
}

View File

@ -0,0 +1,66 @@
## To prepare an image suitable as base for Gitlab CI use
## image name must match gitlab repository name, you can play just with the tag
## the part after :
# export ANDROID_MIN_API_LEVEL=16
# export CI_IMAGE_NAME="registry.gitlab.com/retroshare/retroshare:android_aar_base_$ANDROID_MIN_API_LEVEL"
# docker build --squash --tag "${CI_IMAGE_NAME}" --build-arg ANDROID_MIN_API_LEVEL=$ANDROID_MIN_API_LEVEL --build-arg LIBRETROSHARE_SOURCE_VERSION="$(git describe --always)" --file misc/Android/Dockerfile-AAR .
## --squash is very important in case of GitlabCI shared runners as they are
## limited to 25GB disk size
## To push it to gitlab CI registry you need first to login and the to push
# docker login registry.gitlab.com
# docker push ${CI_IMAGE_NAME}
FROM ubuntu:21.10
ENV DEBIAN_FRONTEND=noninteractive
ENV APT_UNAT="--assume-yes --quiet"
RUN apt-get update $APT_UNAT && apt-get upgrade --show-upgraded $APT_UNAT && \
apt-get clean $APT_UNAT
RUN apt-get install --no-install-recommends $APT_UNAT \
bash build-essential bzip2 cmake curl chrpath doxygen \
git python python3 tclsh unzip wget zip
# Dependencies to create Android pkg
RUN apt-get install --no-install-recommends $APT_UNAT \
openjdk-11-jre openjdk-11-jdk openjdk-11-jdk-headless
ENV ANDROID_SDK_PATH="/opt/android-sdk"
ENV ANDROID_HOME="$ANDROID_SDK_PATH"
ENV ANDROID_SDK_ROOT="$ANDROID_SDK_PATH"
ENV JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64/"
ARG SOURCE_PATH=./
COPY $SOURCE_PATH /libretroshare
WORKDIR /libretroshare-build/
RUN /libretroshare/misc/Android/prepare-toolchain-clang.sh install_android_sdk
WORKDIR /libretroshare/
ARG ANDROID_MIN_API_LEVEL=16
ARG LIBRETROSHARE_SOURCE_VERSION="Dockerfile_AAR_unset"
ENV NATIVE_TOOLCHAINS_DIR="/libretroshare-native-toolchains/"
RUN ./gradlew build -Dorg.gradle.project.buildDir=/libretroshare-build/ \
-PANDROID_MIN_API_LEVEL=$ANDROID_MIN_API_LEVEL \
-PNATIVE_TOOLCHAINS_DIR=$NATIVE_TOOLCHAINS_DIR \
-PLIBRETROSHARE_SOURCE_VERSION="$LIBRETROSHARE_SOURCE_VERSION"
WORKDIR /
## Save generated AAR to make life easier to newcomers that might want to use
## this just to build the libretroshare AAR
RUN mv /libretroshare-build/outputs/aar/ /libretroshare-aar/
## Cleanup all the rest now unneded stuff so squashing is more effective
RUN rm -rf /libretroshare-build/
## Clean reamining cruft inside native_toolchains
RUN rm -rf $NATIVE_TOOLCHAINS_DIR/*-build
## Clean apt cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
## No need to keep sources inside the image
RUN rm -rf /libretroshare/