diff --git a/Jenkinsfile b/Jenkinsfile index a737165..46fc6a5 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -65,12 +65,16 @@ lazyConfig( name: 'dummy-and', env: [ - RELEASE: true, - JAVA_HOME: '/usr/java/latest', - ANDROID_HOME: '/opt/android/sdk', - GRADLE_USER_HOME: '/opt/android/gradle', - GRADLE_OPTS: '-XX:MaxMetaspaceSize=256m -Xmx1792m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -Dme.jenkins -Dorg.gradle.daemon=false -Dkotlin.compiler.execution.strategy=in-process', - GOOGLE_API_CID: 'dappre-google-api', + RELEASE: true, + JAVA_HOME: '/usr/java/latest', + ANDROID_HOME: '/opt/android/sdk', + GRADLE_USER_HOME: '/opt/android/gradle', + GRADLE_OPTS: '-XX:MaxMetaspaceSize=256m -Xmx1792m -Dfile.encoding=UTF-8 -Duser.country=US -Duser.language=en -Duser.variant -Dme.jenkins -Dorg.gradle.daemon=false -Dkotlin.compiler.execution.strategy=in-process', + ANDROID_KEYALIAS: 'signing', + ANDROID_KEYSTORE_CID: 'dummy-android', + GOOGLE_API_CID: 'dappre-google-api', + FIREBASE_API_CID: 'dappre-firebase-api', + FIREBASE_GROUPS: 'dev', ], noIndex: '(.+_.+|production)', // Avoid automatic indexing for release and private branches xmppTargets: 'noise@conference.qiy.nl', @@ -92,10 +96,8 @@ sh("git checkout ${lazyConfig['branch']}") }, run: { - // Check project info with Fastlane - withEnv(["VERSION=${currentBuild.displayName}"],) { - fastLane('android', 'info') - } + // Check project structure and tooling + fastLane('android', 'validate') }, args: "-v /opt/android:/opt/android" + " -e ANDROID_HOME=${env.ANDROID_HOME}" @@ -146,6 +148,28 @@ ] } +lazyStage { + name = 'apptest' + onlyif = (! deployBranches.contains(lazyConfig['branch']) && lazyConfig['branch'] != workingBranch && lazyConfig.env.RELEASE ) + tasks = [ + pre: { + unarchive(mapping:["${buildDir}/" : '.']) + }, + run: { + if ( !lazyConfig.env.DRYRUN ) { + withCredentials([string(credentialsId: env.FIREBASE_API_CID, variable: 'FIREBASE_API_TOKEN')]) { + fastLane('android', 'firebase') + } + } + }, + args: "-v /opt/android:/opt/android" + + " -e ANDROID_HOME=${env.ANDROID_HOME}" + + " -e GRADLE_USER_HOME=${env.GRADLE_USER_HOME}", + in: [ 'centos7' ], + on: 'android', + ] +} + // Release stage only only if criteria are met lazyStage { name = 'release' @@ -194,6 +218,31 @@ ] } +// Release to internal test track, only for deploy branches +lazyStage { + name = 'internal' + onlyif = ( deployBranches.contains(lazyConfig['branch']) ) + input = 'Deploy to internal testers?' + tasks = [ + pre: { + unarchive(mapping:["${buildDir}/" : '.']) + }, + run: { + if ( !lazyConfig.env.DRYRUN ) { + withCredentials([file(credentialsId: env.GOOGLE_API_CID, variable: 'GOOGLE_API_FILE')]) { + sh('cp $GOOGLE_API_FILE ~/GoogleAPICredentials.json') + fastLane('android', 'internal') + } + } + }, + args: "-v /opt/android:/opt/android" + + " -e ANDROID_HOME=${env.ANDROID_HOME}" + + " -e GRADLE_USER_HOME=${env.GRADLE_USER_HOME}", + in: [ 'centos7' ], + on: 'android', + ] +} + // From alpha to beta, only for deploy branches lazyStage { name = 'alpha' @@ -245,26 +294,6 @@ on: 'android', ] } - -lazyStage { - name = 'beta_firebase' - onlyif = (! deployBranches.contains(lazyConfig['branch']) && lazyConfig['branch'] != workingBranch && lazyConfig.env.RELEASE ) - tasks = [ - pre: { - unarchive(mapping:["${buildDir}/" : '.']) - }, - run: { - if ( !lazyConfig.env.DRYRUN ) { - fastLane('android', 'beta_firebase', "fl_branch:\"${lazyConfig['branch']}\"") - } - }, - args: "-v /opt/android:/opt/android" - + " -e ANDROID_HOME=${env.ANDROID_HOME}" - + " -e GRADLE_USER_HOME=${env.GRADLE_USER_HOME}", - in: [ 'centos7' ], - on: 'android', - ] -} /* lazyStage { name = 'production' diff --git a/README.md b/README.md index a6c41c6..5ea3ee2 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,22 @@ # Dummy Android -## Requirements +## Docker + +This project relies on Docker to allow development using the same environment as the CI server (Jenkins). + +### Requirements - Android SDK - Docker (18.09.1+) - Docker Composer (1.21.0+) -## Configuration +### Configuration By default, Android SDK is expected under `~/android/sdk`. It is possible to adapt this path in `docker-compose.yml`. But it may also be specified in your `local.properties`! -## Usage +### Usage The following command should build (if required) and start a shell session inside the container: @@ -33,3 +37,16 @@ bundle update fastlane bundle update ``` + +## Jenkins + +The project is designed to be build from a Jenkins server, which will provide the above requirements. + +### Dependencies + +- [Jenkins Lazy Lib](https://github.com/digital-me/jenkins-lib-lazy) +- [Jenkins Custom Lib]() + +### Usage + +Like all projects using lazyLib, each build can be altered with LAZY_ENV parameter. diff --git a/app/build.gradle b/app/build.gradle index b549f3b..6fcddc5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -19,6 +19,15 @@ } apply plugin: 'com.android.application' +//apply plugin: 'jacoco' +//apply plugin: 'kotlin-android' +//apply plugin: 'kotlinx-serialization' +//apply plugin: 'kotlin-android-extensions' +//apply plugin: 'kotlin-kapt' +//apply plugin: 'kotlin-allopen' +//apply plugin: 'androidx.navigation.safeargs.kotlin' +apply plugin: 'com.google.firebase.crashlytics' +apply plugin: 'com.google.gms.google-services' android { signingConfigs { @@ -30,23 +39,44 @@ } } - compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion + compileSdkVersion build_versions.compile_sdk + buildToolsVersion build_versions.build_tools - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + dataBinding { + enabled = true } +// viewBinding { +// enabled = true +// } + +// kapt { +// correctErrorTypes true +// javacOptions { +// // Increase the max count of errors from annotation processors. +// // Default is 100. +// option("-Xmaxerrs", 500) +// } +// } defaultConfig { applicationId "nl.digital_me.dummyandroidapp" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.compileSdkVersion - versionCode project.hasProperty('versionCode') ? project.property('versionCode') as int : 77 + minSdkVersion build_versions.min_sdk + targetSdkVersion build_versions.target_sdk + versionCode project.hasProperty('versionCode') ? project.property('versionCode') as int : 78 versionName project.hasProperty('versionName') ? project.property('versionName') : "0.0.5" + vectorDrawables.useSupportLibrary true multiDexEnabled true buildConfigField "boolean", "CRASHLYTICS", "true" + + javaCompileOptions { + annotationProcessorOptions { + arguments = [ + "room.schemaLocation" : "$projectDir/schemas".toString(), + "room.incremental" : "true", + "room.expandProjection": "true"] + } + } } dexOptions { @@ -60,17 +90,49 @@ release { signingConfig signingConfigs.release minifyEnabled true + // When minifyEnabled is set to true, Crashlytics automatically + // uploads mapping files because the plugin detects that obfuscation + // is enabled. mappingFileUploadEnabled defaults to true if + // minifyEnabled is true. + shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-glide.pro', 'proguard-fresco.pro', 'proguard-rules.pro' debuggable false } debug { minifyEnabled true + firebaseCrashlytics { + // If you don't need crash reporting for your debug build, + // you can speed up your build by disabling mapping file uploading. + mappingFileUploadEnabled false + } useProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-glide.pro', 'proguard-fresco.pro', 'proguard-rules.pro' debuggable true + testCoverageEnabled !project.hasProperty('android.injected.invoked.from.ide') + ext.enableCrashlytics = false } } + testOptions { + unitTests.includeAndroidResources = true + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +// kotlinOptions { +// jvmTarget = "1.8" +// } + sourceSets { + androidTest.java.srcDirs += "src/test-common/java" + test.java.srcDirs += "src/test-common/java" + test.java.srcDirs += "../networking/src/test/java" + } + lintOptions { + lintConfig rootProject.file('lint.xml') + checkReleaseBuilds false + } + flavorDimensions "env" productFlavors { // May need to match branch name, passed by Jenkins PL as environment variable named BRANCH_NAME @@ -109,20 +171,22 @@ applicationVariants.all { variant -> if (variant.buildType.name == "release") { - variant.outputs.each { output -> + variant.outputs.all { output -> // Avoid to rename, so Fastlane default will work for now //output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", "dappre_${versionName}.${versionCode}.apk")) if (variant.getBuildType().isMinifyEnabled()) { - variant.assemble.doLast { - copy { - from variant.mappingFile - into output.outputFile.parent - // Avoid to rename, so Fastlane default will work for now - //rename { - // String fileName -> - // "mapping_${versionName}.${versionCode}.txt" - //} + variant.getAssembleProvider().configure() { + it.doLast { + copy { + from variant.mappingFile + into output.outputFile.parent + // Avoid to rename, so Fastlane default will work for now + //rename { + // String fileName -> + // "mapping_${versionName}.${versionCode}.txt" + //} + } } } } @@ -132,15 +196,63 @@ } repositories { - maven { url 'https://maven.fabric.io/public' } mavenCentral() } +//jacoco { +// toolVersion = "0.8.4+" +//} + +buildscript { + repositories { + jcenter() + google() + mavenLocal() + } + dependencies { +// classpath 'com.quinn.hunter:hunter-debug-plugin:0.9.7' +// classpath 'com.quinn.hunter:hunter-timing-plugin:0.9.1' +// classpath 'com.quinn.hunter:hunter-transform:0.9.3' + } +} + dependencies { - //compile fileTree(dir: 'libs', include: ['*.jar']) - testImplementation "junit:junit:$rootProject.ext.junitVersion" - testImplementation "org.mockito:mockito-core:2.19.0" - implementation 'androidx.appcompat:appcompat:1.0.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + + // plugins +// implementation 'com.quinn.hunter:hunter-debug-library:0.9.6' +// implementation 'com.quinn.hunter:hunter-timing-library:0.9.4' + + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2' + + // KAPT +// kapt deps.room.compiler +// kapt deps.glide.compiler +// kapt 'androidx.annotation:annotation:1.1.0' + + //noinspection GradleDependency +// kapt deps.data_binding_compiler +// kapt deps.dagger.android_support_compiler +// kapt deps.dagger.compiler + + // kapt deps.dagger.assisted_inject +// kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.5.2' +// +// kapt deps.lifecycle.compiler +// implementation deps.kotlin.stdlib8 +// implementation 'org.jetbrains.kotlinx:kotlinx-serialization-runtime:0.20.0-1.3.70-eap-274-2' +// implementation 'com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.5.0' + implementation deps.firebase_crashlytics + implementation deps.firebase +// implementation deps.firebase_messaging +// implementation deps.firebase_dynamic_links + implementation deps.firebase_analytics + + // [test] dependencies + testImplementation deps.junit + testImplementation deps.mockito.core + + implementation deps.support.app_compat implementation 'com.google.android.material:material:1.0.0' - implementation 'androidx.multidex:multidex:2.0.0' + implementation 'androidx.multidex:multidex:2.0.1' } diff --git a/app/src/acceptance/google-services.json b/app/src/acceptance/google-services.json new file mode 100644 index 0000000..53482e4 --- /dev/null +++ b/app/src/acceptance/google-services.json @@ -0,0 +1,69 @@ +{ + "project_info": { + "project_number": "73241222539", + "firebase_url": "https://dummy-27e6b.firebaseio.com", + "project_id": "dummy-27e6b", + "storage_bucket": "dummy-27e6b.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:73241222539:android:b54cdbef562781b312e38e", + "android_client_info": { + "package_name": "nl.digital_me.dummyandroidapp.acc" + } + }, + "oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3moppmy85R7j5ADC4yZazE9FA32mb5J8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:73241222539:android:2755489b34d07e8912e38e", + "android_client_info": { + "package_name": "nl.digital_me.dummyandroidapp.dev2" + } + }, + "oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3moppmy85R7j5ADC4yZazE9FA32mb5J8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/dev2/google-services.json b/app/src/dev2/google-services.json new file mode 100644 index 0000000..410ab1d --- /dev/null +++ b/app/src/dev2/google-services.json @@ -0,0 +1,40 @@ +{ + "project_info": { + "project_number": "73241222539", + "firebase_url": "https://dummy-27e6b.firebaseio.com", + "project_id": "dummy-27e6b", + "storage_bucket": "dummy-27e6b.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:73241222539:android:2755489b34d07e8912e38e", + "android_client_info": { + "package_name": "nl.digital_me.dummyandroidapp.dev2" + } + }, + "oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3moppmy85R7j5ADC4yZazE9FA32mb5J8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/production/google-services.json b/app/src/production/google-services.json new file mode 100644 index 0000000..a68b13d --- /dev/null +++ b/app/src/production/google-services.json @@ -0,0 +1,98 @@ +{ + "project_info": { + "project_number": "73241222539", + "firebase_url": "https://dummy-27e6b.firebaseio.com", + "project_id": "dummy-27e6b", + "storage_bucket": "dummy-27e6b.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:73241222539:android:9c5bd06ebcfc632412e38e", + "android_client_info": { + "package_name": "nl.digital_me.dummyandroidapp" + } + }, + "oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3moppmy85R7j5ADC4yZazE9FA32mb5J8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:73241222539:android:b54cdbef562781b312e38e", + "android_client_info": { + "package_name": "nl.digital_me.dummyandroidapp.acc" + } + }, + "oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3moppmy85R7j5ADC4yZazE9FA32mb5J8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:73241222539:android:2755489b34d07e8912e38e", + "android_client_info": { + "package_name": "nl.digital_me.dummyandroidapp.dev2" + } + }, + "oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyC3moppmy85R7j5ADC4yZazE9FA32mb5J8" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "73241222539-cndrmso63ealc3k6ateaip0h94h85l8g.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/build.gradle b/build.gradle index e41673e..9af14f1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,42 +1,50 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - + apply from: 'versions.gradle' + addRepos(repositories) + ext { - // Sdk and tools - compileSdkVersion = 28 - minSdkVersion = 16 - targetSdkVersion = 28 - - // App dependencies - buildToolsVersion = "28.0.3" - supportLibVersion = "28.0.0" - junitVersion = '4.12' - gradleVersion = '3.2.0' - } - - repositories { - // For the Gradle plugin and its deps - maven { url "https://maven.google.com" } - jcenter() - google() +// ktlintVersion = '0.33.0' } dependencies { - // https://jcenter.bintray.com/com/android/tools/build/gradle - classpath "com.android.tools.build:gradle:$gradleVersion" + classpath deps.android_gradle_plugin +// classpath deps.kotlin.plugin +// classpath deps.kotlin.serialization +// classpath deps.kotlin.android_extensions +// classpath deps.kotlin.allopen +// classpath deps.navigation.safe_args_plugin + classpath deps.crashlytics_gradle_plugin + classpath deps.google_services.plugin + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files } -} -allprojects { - repositories { - jcenter() - // For the support libraries - maven { url "https://maven.google.com" } + repositories { google() } } +//plugins { +// id "com.diffplug.gradle.spotless" version "3.27.2" +// +// // Example usage: +// // ./gradlew dependencyUpdates -Drevision=release -DoutputFormatter=plain +// id "com.github.ben-manes.versions" version "0.28.0" +//} + +allprojects { + addRepos(repositories) +} + +//spotless { +// kotlin { +// target "**/*.kt" +// ktlint(ktlintVersion) +// } +//} + task clean(type: Delete) { delete rootProject.buildDir } diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 992533f..c3cd799 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -38,10 +38,10 @@ end if flavor file.each do |line| - if line[/^(#.*)?$/] + if line[/^\s*([#\/].*)?$/] next end - #UI.message("Line = #{line.tr("\n",'')}") + #UI.message("Line = #{line.tr("\n",'')}") if toggle_flavors current_flavor = line[/(?=\s*)\w+(?=\s+\{)/] if ! current_flavor @@ -58,11 +58,11 @@ next end if line[/\s*}/] - if current_flavor - current_flavor = nil - toggle_flavors = true - next - end + if current_flavor + current_flavor = nil + toggle_flavors = true + next + end if toggle_flavors break end @@ -122,7 +122,7 @@ end before_all do |lane, options| - # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..." + # This block is called before any lane end desc "Display infos about the app" @@ -133,7 +133,22 @@ UI.message("App ID = #{getPackageName(options)}") end + desc "Validate the current setup" + # For now, dry-run gradle task + # TODO: verify Android SDK + lane :validate do |options| + gradle( + task: "clean assemble", + build_type: 'Release', + flavor: "#{getFlavorName(options)}", + flags: "--dry-run", + ) + end + desc "Run all the tests" + # Test both acceptance and production flavors + # So we detect problem for those before releasing + # Test for dev2 will be done with build lane anyway lane :test do |options| gradle( task: "test", @@ -147,6 +162,15 @@ ) end + desc "Run integration tests" + # Test remote API + # So we know this build will not work againt the back-end + lane :intgtest do |options| + gradle( + task: "networking:test" + ) + end + desc "Build the apk" lane :build do |options| gradle( @@ -156,64 +180,6 @@ ) end - desc "Bump version code/build number" - private_lane :bump do |options| - increment_version_code( - var_name: "versionCode|versionBuild", - verbose: true, - ) - end - - desc "Tag as a new version" - private_lane :tag do |options| - git_commit( - path: "app/build.gradle", - message: "Increment version code to #{lane_context[SharedValues::VERSION_CODE]} for next release", - ) - add_git_tag( - tag: "#{ENV['VERSION']}-#{lane_context[SharedValues::VERSION_CODE]}", - message: "Create new tag for version #{ENV['VERSION']}-#{lane_context[SharedValues::VERSION_CODE]}", - ) - push_to_git_remote( - local_branch: "HEAD", - remote_branch: "master", - ) - end - - desc "Build and deploy the apk for Alpha testing in Google Play store" - lane :deploy_alpha do |options| - bump - gradle( - task: "clean assemble", - build_type: 'Release', - ) - sh("cp -vf metadata/android/en-US/changelogs/latest.txt metadata/android/en-US/changelogs/#{lane_context[SharedValues::VERSION_CODE]}.txt") - sh("git add metadata/android/en-US/changelogs/#{lane_context[SharedValues::VERSION_CODE]}.txt") - sh("git add metadata/android/en-US/changelogs/latest.txt") - sh("cp -vf metadata/android/nl-NL/changelogs/latest.txt metadata/android/nl-NL/changelogs/#{lane_context[SharedValues::VERSION_CODE]}.txt") - sh("git add metadata/android/nl-NL/changelogs/#{lane_context[SharedValues::VERSION_CODE]}.txt") - sh("git add metadata/android/nl-NL/changelogs/latest.txt") - git_commit( - path: [ - "fastlane/metadata/android/en-US/changelogs/latest.txt", - "fastlane/metadata/android/en-US/changelogs/#{lane_context[SharedValues::VERSION_CODE]}.txt", - "fastlane/metadata/android/nl-NL/changelogs/latest.txt", - "fastlane/metadata/android/nl-NL/changelogs/#{lane_context[SharedValues::VERSION_CODE]}.txt", - ], - message: "Provide changelogs for this version", - ) - supply( - apk: "app/build/outputs/apk/#{getFlavorName(options)}/release/app-#{getFlavorName(options)}-release.apk", - mapping: "app/build/outputs/apk/#{getFlavorName(options)}/release/mapping.txt", - track: 'alpha', - skip_upload_apk: false, - skip_upload_metadata: false, - skip_upload_images: true, - skip_upload_screenshots: true, - ) - tag - end - desc "Update metadata only, including images and screenshots" lane :deploy_metadata do |options| supply( @@ -224,31 +190,33 @@ ) end - desc "Submit a new build to Crashlytics Beta" - lane :beta_crash do |options| - gradle(task: "assembleRelease") - crashlytics( - api_token: "b439e4099424e0f33cdab4e7b689b60c4bc3a5d2", - build_secret: "ecffdd52c995054f79161c3570ed769f2bacf2dd3082e2aba7489b147c29ce7d" - ) - end - - desc "Submit a new build to Firebase App Distribution" - lane :beta_firebase do |options| - gradle(task: "assembleRelease") - firebase_app_distribution( - app: "1:79978046456:android:ec6742f538f9269b", - apk_path: "app/build/outputs/apk/#{getFlavorName(options)}/release/app-#{getFlavorName(options)}-release.apk", - ) + lane :firebase do |options| + # Like for alpha and beta, this lane requires the apk to be already available + firebase_groups = ENV['FIREBASE_GROUPS'] || 'dev' + firebase_api_token = ENV['FIREBASE_API_TOKEN'] + if ! firebase_api_token + UI.user_error!("No Firebase API token found in environment (FIREBASE_API_TOKEN)") + else + find_firebase_app_id( + app_identifier: get_application_id(getFlavorName(options)), + ) + firebase_app_distribution( + app: lane_context[SharedValues::GOOGLE_APP_ID], + apk_path: "app/build/outputs/apk/#{getFlavorName(options)}/release/app-#{getFlavorName(options)}-release.apk", + firebase_cli_token: firebase_api_token, + release_notes_file: 'fastlane/metadata/android/en-US/changelogs/latest.txt', + groups: firebase_groups, + ) + end end - desc "Deploy a new version to the Google Play" - lane :alpha do |options| + desc "Deploy a new internal version to the Google Play" + lane :internal do |options| supply( apk: "app/build/outputs/apk/#{getFlavorName(options)}/release/app-#{getFlavorName(options)}-release.apk", mapping: "app/build/outputs/apk/#{getFlavorName(options)}/release/mapping.txt", - track: 'alpha', + track: 'internal', skip_upload_apk: false, skip_upload_metadata: false, skip_upload_images: false, @@ -257,7 +225,21 @@ ) end - desc "Deploy a new version to the Google Play" + desc "Deploy a new alpha version to the Google Play" + lane :alpha do |options| + supply( + track: 'internal', + track_promote_to: 'alpha', + skip_upload_apk: true, + skip_upload_metadata: true, + skip_upload_images: true, + skip_upload_screenshots: true, + package_name: "#{getPackageName(options)}", + version_code: getVersionCode(), + ) + end + + desc "Deploy a new beta version to the Google Play" lane :beta do |options| supply( track: 'alpha', @@ -285,21 +267,12 @@ ) end - # You can define as many lanes as you want - after_all do |lane, options| # This block is called, only if the executed lane was successful - - # slack( - # message: "Successfully deployed new App Update." - # ) end error do |lane, exception| - # slack( - # message: exception.message, - # success: false - # ) + # This block is called, only if the executed lane failed end end diff --git a/fastlane/Pluginfile b/fastlane/Pluginfile index 4e0f109..1afcc19 100644 --- a/fastlane/Pluginfile +++ b/fastlane/Pluginfile @@ -1,4 +1,5 @@ # TODO: Reimplement our actions in a plugin to be shared between projects, or use an existing plugin. #gem "fastlane-plugin-commit_android_version_bump", git: "https://github.com/digital-me/fastlane-plugin-commit_android_version_bump" #gem "increment_version_code", git "https://github.com/Jems22/fastlane-plugin-increment_version_code/tree/v0.4.3" -gem 'fastlane-plugin-firebase_app_distribution' \ No newline at end of file +gem 'fastlane-plugin-firebase_app_distribution' +gem 'fastlane-plugin-find_firebase_app_id' diff --git a/fastlane/metadata/android/en-US/changelogs/79.txt b/fastlane/metadata/android/en-US/changelogs/79.txt new file mode 100644 index 0000000..ed3b331 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/79.txt @@ -0,0 +1,3 @@ +- Switch to new signing key - reinstall needed +- Nothing else visible +- Update base image to CentOS 7.8 diff --git a/fastlane/metadata/android/en-US/changelogs/latest.txt b/fastlane/metadata/android/en-US/changelogs/latest.txt index 098b6f7..ed3b331 100644 --- a/fastlane/metadata/android/en-US/changelogs/latest.txt +++ b/fastlane/metadata/android/en-US/changelogs/latest.txt @@ -1,3 +1,3 @@ -- Nothing visible -- Backports from Dappre -- Improves PL \ No newline at end of file +- Switch to new signing key - reinstall needed +- Nothing else visible +- Update base image to CentOS 7.8 diff --git a/fastlane/metadata/android/nl-NL/changelogs/79.txt b/fastlane/metadata/android/nl-NL/changelogs/79.txt new file mode 100644 index 0000000..0274f99 --- /dev/null +++ b/fastlane/metadata/android/nl-NL/changelogs/79.txt @@ -0,0 +1,3 @@ +- Wisselen nieuwe specifiek sleutel - reinstall nodig +- Niets anders zichtbaar +- Bijwerken base image met CentOS 7.8 diff --git a/fastlane/metadata/android/nl-NL/changelogs/latest.txt b/fastlane/metadata/android/nl-NL/changelogs/latest.txt index 2ebc369..0274f99 100644 --- a/fastlane/metadata/android/nl-NL/changelogs/latest.txt +++ b/fastlane/metadata/android/nl-NL/changelogs/latest.txt @@ -1,3 +1,3 @@ -- Niets zichtbaar -- Backports van Dappre -- Verbeterd PL \ No newline at end of file +- Wisselen nieuwe specifiek sleutel - reinstall nodig +- Niets anders zichtbaar +- Bijwerken base image met CentOS 7.8 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9e1d929..bcf7aa8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/lazyDir/Gemfile b/lazyDir/Gemfile index 8247a68..3bbc7c3 100644 --- a/lazyDir/Gemfile +++ b/lazyDir/Gemfile @@ -4,6 +4,7 @@ gem "fastlane" gem "fastlane-plugin-firebase_app_distribution" +gem 'fastlane-plugin-find_firebase_app_id' # If needed, make sure fastlane dir is part of the docker context # plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') diff --git a/lazyDir/Gemfile.lock b/lazyDir/Gemfile.lock index 8f468dc..0bebd60 100644 --- a/lazyDir/Gemfile.lock +++ b/lazyDir/Gemfile.lock @@ -81,6 +81,7 @@ xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) + fastlane-plugin-find_firebase_app_id (0.1.1) fastlane-plugin-firebase_app_distribution (0.1.4) gh_inspector (1.1.3) google-api-client (0.36.4) @@ -175,6 +176,7 @@ DEPENDENCIES fastlane + fastlane-plugin-find_firebase_app_id fastlane-plugin-firebase_app_distribution RUBY VERSION diff --git a/lazyDir/centos7.Dockerfile b/lazyDir/centos7.Dockerfile index 66da721..da1ff9d 100644 --- a/lazyDir/centos7.Dockerfile +++ b/lazyDir/centos7.Dockerfile @@ -18,7 +18,7 @@ # # Pull base image from official repo -FROM centos:centos7.7.1908 +FROM centos:centos7.8.2003 # Import local GPG keys and enable epel repo RUN rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \ diff --git a/versions.gradle b/versions.gradle new file mode 100644 index 0000000..e0ae074 --- /dev/null +++ b/versions.gradle @@ -0,0 +1,258 @@ +ext.deps = [:] +def versions = [:] +versions.json = "20190722" +versions.arch_core = "2.1.0" +versions.room = "2.2.4" +versions.lifecycle = "2.2.0" +versions.fragment_ktx = " 1.2.3" +versions.activity_ktx = "1.1.0" +versions.transition = "1.3.1" +versions.viewmodel_savedstate = "2.2.0" +versions.legacy_support = "1.0.0" +versions.recyclerview_selection = "1.1.0-rc01" +versions.viewpager2 = "1.0.0" +versions.material = "1.1.0-rc02" +versions.support = "1.1.0" +versions.app_compat = "1.2.0-alpha03" +versions.dagger = '2.26' +versions.assisted_inject = '0.5.0' +versions.junit = '4.13' +versions.espresso = "3.2.0" +versions.retrofit = '2.6.1' +versions.okhttp = '3.12.3' +// OkHttp works on Android 5.0+ (API level 21+) and on Java 8+. +// The OkHttp 3.12.x branch supports Android 2.3+ (API level 9+) and Java 7+. +// These platforms lack support for TLS 1.2 and should not be used. +// But because upgrading is difficult we will backport critical fixes to the 3.12.x branch through December 31, 2020. +versions.mockito = '3.3.3' +versions.mockito_all = "1.10.19" +versions.mockito_android = '3.3.3' +versions.dexmaker = "2.19.0" +versions.constraint_layout = "2.0.0-beta4" +versions.glide = '4.11.0' +versions.timber = "4.7.1" +versions.slf4j = "1.7.28" +versions.android_gradle_plugin = '3.6.1' +versions.rxjava2 = "2.2.19" +versions.rx_android = "2.1.1" +versions.atsl_runner = "1.2.0" +versions.atsl_rules = "1.2.0" +versions.atsl_junit = "1.1.1" +versions.hamcrest = "1.3" +versions.kotlin = '1.3.70' +versions.paging = "2.1.1" +versions.navigation_testing = "1.0.0-alpha08" +versions.navigation_plugin = "2.2.0" +versions.navigation = "2.2.1" +versions.work = "2.3.3" +versions.crashlytics_gradle_plugin = "2.0.0-beta02" +versions.google_services = "4.3.3" +versions.vision = "20.0.0" +versions.firebase = "17.3.0" +versions.firebase_crashlytics = "17.0.0-beta01" +versions.firebase_messaging = "20.1.5" +versions.firebase_dynamic_links = "19.1.0" +versions.firebase_analytics = "17.3.0" +versions.firebase_ml_vision = "24.0.1" +versions.firebase_ml_vision_image_label = "19.0.0" +versions.firebase_ml_vision_automl = "18.0.3" +versions.fresco = "1.14.2" +versions.spongy_castle = "1.58.0.0" +versions.ui_automator = '2.2.0' +versions.gson = '2.8.5' +versions.ktx = '1.2.0' +versions.preference = '1.1.0' +versions.coroutines = '1.3.4' +versions.data_binding_compiler = versions.android_gradle_plugin +def deps = [:] + +def coroutines = [:] +coroutines.android = "org.jetbrains.kotlinx:kotlinx-coroutines-android:$versions.coroutines" +coroutines.core = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$versions.coroutines" +deps.coroutines = coroutines + +def okhttp = [:] +okhttp.client = "com.squareup.okhttp3:okhttp:$versions.okhttp" +okhttp.logging = "com.squareup.okhttp3:logging-interceptor:$versions.okhttp" +okhttp.mock_web_server = "com.squareup.okhttp3:mockwebserver:$versions.okhttp" +deps.okhttp = okhttp + +def support = [:] +support.annotations = "androidx.annotation:annotation:$versions.support" +support.app_compat = "androidx.appcompat:appcompat:$versions.app_compat" +support.recyclerview = "androidx.recyclerview:recyclerview:$versions.support" +support.cardview = "androidx.cardview:cardview:$versions.legacy_support" +support.recyclerview_selection = "androidx.recyclerview:recyclerview-selection:$versions.recyclerview_selection" +support.design = "com.google.android.material:material:$versions.material" +support.coordinatorlayout = "androidx.coordinatorlayout:coordinatorlayout:$versions.support" +support.vectordrawable = "androidx.vectordrawable:vectordrawable:$versions.support" +support.core_utils = "androidx.legacy:legacy-support-core-utils:$versions.support" +deps.support = support + +def room = [:] +room.runtime = "androidx.room:room-runtime:$versions.room" +room.compiler = "androidx.room:room-compiler:$versions.room" +room.rxjava2 = "androidx.room:room-rxjava2:$versions.room" +room.testing = "androidx.room:room-testing:$versions.room" +deps.room = room + +def lifecycle = [:] +lifecycle.runtime = "androidx.lifecycle:lifecycle-runtime:$versions.lifecycle" +lifecycle.extensions = "androidx.lifecycle:lifecycle-extensions:$versions.lifecycle" +lifecycle.java8 = "androidx.lifecycle:lifecycle-common-java8:$versions.lifecycle" +lifecycle.compiler = "androidx.lifecycle:lifecycle-compiler:$versions.lifecycle" +lifecycle.viewmodel = "androidx.lifecycle:lifecycle-viewmodel-ktx:$versions.lifecycle" +lifecycle.viewmodel_savedstate= "androidx.lifecycle:lifecycle-viewmodel-savedstate:$versions.viewmodel_savedstate" +lifecycle.livedata = "androidx.lifecycle:lifecycle-livedata-ktx:$versions.lifecycle" +lifecycle.reactive_streams = "androidx.lifecycle:lifecycle-reactivestreams:$versions.lifecycle" +deps.lifecycle = lifecycle + +def arch_core = [:] +arch_core.testing = "androidx.arch.core:core-testing:$versions.arch_core" +deps.arch_core = arch_core + +def retrofit = [:] +retrofit.runtime = "com.squareup.retrofit2:retrofit:$versions.retrofit" +retrofit.mock = "com.squareup.retrofit2:retrofit-mock:$versions.retrofit" +deps.retrofit = retrofit + +def dagger = [:] +dagger.runtime = "com.google.dagger:dagger:$versions.dagger" +dagger.android = "com.google.dagger:dagger-android:$versions.dagger" +dagger.android_support = "com.google.dagger:dagger-android-support:$versions.dagger" +dagger.compiler = "com.google.dagger:dagger-compiler:$versions.dagger" +dagger.android_support_compiler = "com.google.dagger:dagger-android-processor:$versions.dagger" +dagger.assisted_inject = "com.squareup.inject:assisted-inject-processor-dagger2:$versions.assisted_inject" + +deps.dagger = dagger + +def espresso = [:] +espresso.core = "androidx.test.espresso:espresso-core:$versions.espresso" +espresso.contrib = "androidx.test.espresso:espresso-contrib:$versions.espresso" +espresso.intents = "androidx.test.espresso:espresso-intents:$versions.espresso" +deps.espresso = espresso + +def atsl = [:] +atsl.runner = "androidx.test:runner:$versions.atsl_runner" +atsl.rules = "androidx.test:rules:$versions.atsl_runner" +atsl.ext_junit = "androidx.test.ext:junit:$versions.atsl_junit" +deps.atsl = atsl + +def mockito = [:] +mockito.core = "org.mockito:mockito-core:$versions.mockito" +mockito.all = "org.mockito:mockito-all:$versions.mockito_all" +mockito.android = "org.mockito:mockito-android:$versions.mockito_android" +deps.mockito = mockito + +def kotlin = [:] +kotlin.stdlib8 = "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$versions.kotlin" +kotlin.test = "org.jetbrains.kotlin:kotlin-test-junit:$versions.kotlin" +kotlin.plugin = "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin" +kotlin.serialization = "org.jetbrains.kotlin:kotlin-serialization:$versions.kotlin" +kotlin.allopen = "org.jetbrains.kotlin:kotlin-allopen:$versions.kotlin" +kotlin.android_extensions = "org.jetbrains.kotlin:kotlin-android-extensions:$versions.kotlin" +kotlin.version = "1.3.70" + +deps.kotlin = kotlin + +deps.paging_ktx = "androidx.paging:paging-runtime-ktx:$versions.paging" + +deps.json = "org.json:json:$versions.json" + +def glide = [:] +glide.runtime = "com.github.bumptech.glide:glide:$versions.glide" +glide.compiler = "com.github.bumptech.glide:compiler:$versions.glide" +deps.glide = glide + +def slf4j = [:] +slf4j.api = "org.slf4j:slf4j-api:$versions.slf4j" +deps.slf4j = slf4j + +deps.dexmaker = "com.linkedin.dexmaker:dexmaker-mockito:$versions.dexmaker" +deps.constraint_layout = "androidx.constraintlayout:constraintlayout:$versions.constraint_layout" +deps.timber = "com.jakewharton.timber:timber:$versions.timber" +deps.junit = "junit:junit:$versions.junit" +deps.rxjava2 = "io.reactivex.rxjava2:rxjava:$versions.rxjava2" +deps.rx_android = "io.reactivex.rxjava2:rxandroid:$versions.rx_android" +deps.hamcrest = "org.hamcrest:hamcrest-all:$versions.hamcrest" +deps.android_gradle_plugin = "com.android.tools.build:gradle:$versions.android_gradle_plugin" +ext.deps = deps + +def build_versions = [:] +build_versions.min_sdk = 16 +build_versions.compile_sdk = 29 +build_versions.target_sdk = 29 +build_versions.build_tools = "29.0.0" +ext.build_versions = build_versions + +def work = [:] +work.testing = "androidx.work:work-testing:$versions.work" +work.runtime_ktx = "androidx.work:work-runtime-ktx:$versions.work" +work.rxjava = "androidx.work:work-rxjava2:$versions.work" +work.gcm = "androidx.work:work-gcm:$versions.work" +deps.work = work + +def navigation = [:] +navigation.testing = "android.arch.navigation:navigation-testing:$versions.navigation_testing" +navigation.runtime = "androidx.navigation:navigation-runtime-ktx:$versions.navigation" +navigation.fragment = "androidx.navigation:navigation-fragment-ktx:$versions.navigation" +navigation.safe_args_plugin = "androidx.navigation:navigation-safe-args-gradle-plugin:$versions.navigation_plugin" +navigation.ui = "androidx.navigation:navigation-ui-ktx:$versions.navigation" +deps.navigation = navigation + +def preference = [:] +preference.pref = "androidx.preference:preference:$versions.preference" +preference.ktx = "androidx.preference:preference-ktx:$versions.preference" +deps.preference = preference + +def google_services = [:] +google_services.plugin = "com.google.gms:google-services:$versions.google_services" +deps.google_services = google_services + +def fresco = [:] +fresco.fresco = "com.facebook.fresco:fresco:$versions.fresco" +fresco.animated_gif = "com.facebook.fresco:animated-gif:$versions.fresco" +fresco.animated_webp = "com.facebook.fresco:animated-webp:$versions.fresco" +fresco.webp_support = "com.facebook.fresco:webpsupport:$versions.fresco" +deps.fresco = fresco + +def spongy_castle = [:] +spongy_castle.core = "com.madgag.spongycastle:core:$versions.spongy_castle" +spongy_castle.prov = "com.madgag.spongycastle:prov:$versions.spongy_castle" +spongy_castle.bcpkix = "com.madgag.spongycastle:bcpkix-jdk15on:$versions.spongy_castle" +deps.spongy_castle = spongy_castle + +deps.data_binding_compiler = "com.android.databinding:compiler:$versions.data_binding_compiler" +deps.vision = "com.google.android.gms:play-services-vision:$versions.vision" +deps.crashlytics_gradle_plugin = "com.google.firebase:firebase-crashlytics-gradle:$versions.crashlytics_gradle_plugin" +deps.firebase_crashlytics = "com.google.firebase:firebase-crashlytics:$versions.firebase_crashlytics" +deps.firebase = "com.google.firebase:firebase-core:$versions.firebase" +deps.firebase_ml_vision = "com.google.firebase:firebase-ml-vision:$versions.firebase_ml_vision" +deps.firebase_ml_vision_image_label = "com.google.firebase:firebase-ml-vision-image-label-model:$versions.firebase_ml_vision_image_label" +deps.firebase_ml_vision_automl = "com.google.firebase:firebase-ml-vision-automl:$versions.firebase_ml_vision_automl" +deps.firebase_messaging = "com.google.firebase:firebase-messaging:$versions.firebase_messaging" +deps.firebase_dynamic_links = "com.google.firebase:firebase-dynamic-links:$versions.firebase_dynamic_links" +deps.firebase_analytics = "com.google.firebase:firebase-analytics:$versions.firebase_analytics" +deps.ui_automator = "androidx.test.uiautomator:uiautomator:$versions.ui_automator" +deps.gson = "com.google.code.gson:gson:$versions.gson" +deps.ktx = "androidx.core:core-ktx:$versions.ktx" +deps.fragment = "androidx.fragment:fragment:$versions.fragment_ktx" +deps.fragment_ktx = "androidx.fragment:fragment-ktx:$versions.fragment_ktx" +deps.activity_ktx = "androidx.activity:activity-ktx:$versions.activity_ktx" +deps.transition = "androidx.transition:transition:$versions.transition" +deps.viewpager2 = "androidx.viewpager2:viewpager2:$versions.viewpager2" + +ext.deps = deps + +static def addRepos(RepositoryHandler handler) { + handler.google() + handler.jcenter() + // handler.maven { url 'https://oss.sonatype.org/content/repositories/snapshots' } + handler.maven { url 'http://dl.bintray.com/kotlin/kotlin-eap' } + // For the support libraries + handler.maven { url "https://maven.google.com" } + // com.github.javiersantos:AppUpdater + handler.maven { url 'https://jitpack.io' } +} + +ext.addRepos = this.&addRepos