Skip to content
This repository has been archived by the owner on Feb 20, 2023. It is now read-only.

Moves nightly/beta configuration to be a "build type" #1693

Merged
merged 1 commit into from
Apr 22, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 33 additions & 54 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -30,36 +30,48 @@ android {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArguments clearPackageData: 'true'
manifestPlaceholders.isRaptorEnabled = "false"
buildConfigField "boolean", "IS_RELEASED", "false"
}

def releaseTemplate = {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
matchingFallbacks = ['release'] // Use on the "release" build type in dependencies (AARs)
}

buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
releaseRaptor {
initWith release
manifestPlaceholders.isRaptorEnabled = "true"
matchingFallbacks = ['release']
}
debug {
shrinkResources false
minifyEnabled false
applicationIdSuffix ".debug"
manifestPlaceholders.isRaptorEnabled = "true"
}
// "releaseRaptor" is only used for performance testing, and isn't a real "release" type
releaseRaptor releaseTemplate >> { // the ">>" concatenates the releaseRaptor-specific options with the template
manifestPlaceholders.isRaptorEnabled = "true"
}
nightly releaseTemplate >> {
buildConfigField "boolean", "IS_RELEASED", "true"
}
beta releaseTemplate >> {
buildConfigField "boolean", "IS_RELEASED", "true"
}
}

variantFilter { // There's a "release" build type that exists by default that we don't use (it's replaced by "nightly" and "beta")
if (buildType.name == 'release') {
setIgnore true
}
}

testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}

flavorDimensions "abi", "channel"
flavorDimensions "abi"

productFlavors {
// Processor architectures (abi dimension)

arm {
dimension "abi"
ndk {
Expand All @@ -78,41 +90,6 @@ android {
abiFilter "arm64-v8a"
}
}

// Product channels (channel dimension)

// "Greenfield" is our clean version of Fenix without any of the "Fennec transition" code.
greenfield {
dimension "channel"
}
firefoxNightly {
dimension "channel"

// Aurora was a channel between nightly builds and beta versions. Aurora builds were published on Google
// Play. When the Aurora channel was shutdown in April 2017 the decision was made to instead ship Nightly
// builds to Google Play using the existing application id. Previously Nightly builds were not available
// on Google Play. Since then our Nightly package name is "fennec_aurora" instead of "fennec_nightly".
applicationId "org.mozilla.fennec_aurora"
}
firefoxBeta {
dimension "channel"

applicationId "org.mozilla.firefox_beta"
}
firefoxRelease {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are flavor specific sources in src. If we remove those flavors then let's remove the sources too.

dimension "channel"

applicationId "org.mozilla.firefox"
}
}

variantFilter { variant ->
def flavors = variant.flavors*.name.toString().toLowerCase()

if (!flavors.contains("greenfield")) {
// For now everything that isn't a "greenfield" build isn't used. So let's ignore those variants.
setIgnore(true)
}
}

compileOptions {
Expand Down Expand Up @@ -148,11 +125,12 @@ android.applicationVariants.all { variant ->
// -------------------------------------------------------------------------------------------------

def buildType = variant.buildType.name
def versionCode = null

buildConfigField 'Boolean', 'COLLECTIONS_ENABLED', (buildType != "release").toString()

if (buildType == "release") {
def versionCode = generatedVersionCode
if (buildType == "nightly") {
versionCode = generatedVersionCode

// The Google Play Store does not allow multiple APKs for the same app that all have the
// same version code. Therefore we need to have different version codes for our ARM and x86
Expand All @@ -168,15 +146,16 @@ android.applicationVariants.all { variant ->
versionCode = versionCode + 1
}// else variant.flavorName.contains("Arm")) use generated version code

variant.outputs.all { output ->
variant.outputs.all {
setVersionCodeOverride(versionCode)
}
}

println("----------------------------------------------")
println("Build type: " + buildType)
println("Variant name: " + variant.name)
println("Build type: " + variant.buildType.name)
println("Flavor: " + variant.flavorName)
println("Version code: " + variant.mergedFlavor.versionCode)
println("Version code: " + (versionCode ?: variant.mergedFlavor.versionCode))

// -------------------------------------------------------------------------------------------------
// BuildConfig: Set variables for Sentry, Crash Reporting, and Telemetry
Expand Down Expand Up @@ -215,7 +194,7 @@ android.applicationVariants.all { variant ->

print("Adjust token: ")

if (variantName.contains("Release")) {
if (variant.buildType.buildConfigFields['IS_RELEASED']?.value) {
try {
def token = new File("${rootDir}/.adjust_token").text.trim()
buildConfigField 'String', 'ADJUST_TOKEN', '"' + token + '"'
Expand Down
11 changes: 0 additions & 11 deletions app/src/firefoxBeta/AndroidManifest.xml

This file was deleted.

11 changes: 0 additions & 11 deletions app/src/firefoxNightly/AndroidManifest.xml

This file was deleted.

11 changes: 0 additions & 11 deletions app/src/firefoxRelease/AndroidManifest.xml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class AdjustMetricsService(private val application: Application) : MetricsServic
if ((BuildConfig.ADJUST_TOKEN.isNullOrEmpty())) {
Log.i(LOGTAG, "No adjust token defined")

if (!BuildConfig.DEBUG) {
if (BuildConfig.IS_RELEASED) {
throw IllegalStateException("No adjust token defined for release build")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,8 @@ class SettingsFragment : PreferenceFragmentCompat(), CoroutineScope, AccountObse
preferenceMakeDefaultBrowser?.onPreferenceClickListener =
getClickListenerForMakeDefaultBrowser()

preferenceLeakCanary?.isVisible = BuildConfig.DEBUG
if (BuildConfig.DEBUG) {
preferenceLeakCanary?.isVisible = !BuildConfig.IS_RELEASED
if (!BuildConfig.IS_RELEASED) {
preferenceLeakCanary?.onPreferenceChangeListener =
Preference.OnPreferenceChangeListener { _, newValue ->
(context?.applicationContext as FenixApplication).toggleLeakCanary(newValue as Boolean)
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/java/org/mozilla/fenix/utils/Settings.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ class Settings private constructor(context: Context) {

val isCrashReportingEnabled: Boolean
get() = preferences.getBoolean(appContext.getPreferenceKey(R.string.pref_key_crash_reporter), true) &&
BuildConfig.CRASH_REPORTING && BuildConfig.BUILD_TYPE == "release"
BuildConfig.CRASH_REPORTING && BuildConfig.IS_RELEASED

val isRemoteDebuggingEnabled: Boolean
get() = preferences.getBoolean(appContext.getPreferenceKey(R.string.pref_key_remote_debugging), false)
Expand Down
6 changes: 3 additions & 3 deletions automation/taskcluster/decision_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import taskcluster

from lib import build_variants
from lib.tasks import TaskBuilder, schedule_task_graph, _get_architecture_and_build_type_and_product_from_variant
from lib.tasks import TaskBuilder, schedule_task_graph, get_architecture_and_build_type_from_variant
from lib.chain_of_trust import (
populate_chain_of_trust_task_graph,
populate_chain_of_trust_required_but_unused_files
Expand Down Expand Up @@ -57,7 +57,7 @@ def pr_or_push(is_master_push):
build_tasks[assemble_task_id] = BUILDER.craft_assemble_task(variant)
build_tasks[taskcluster.slugId()] = BUILDER.craft_test_task(variant)

arch, build_type, _ = _get_architecture_and_build_type_and_product_from_variant(variant)
arch, build_type = get_architecture_and_build_type_from_variant(variant)
# autophone only supports arm and aarch64, so only sign/perftest those builds
if (
build_type == 'releaseRaptor' and
Expand Down Expand Up @@ -88,7 +88,7 @@ def nightly(track):
push_tasks = {}

build_task_id = taskcluster.slugId()
build_tasks[build_task_id] = BUILDER.craft_assemble_release_task(architectures, is_staging)
build_tasks[build_task_id] = BUILDER.craft_assemble_nightly_task(architectures, is_staging)

signing_task_id = taskcluster.slugId()
signing_tasks[signing_task_id] = BUILDER.craft_nightly_signing_task(
Expand Down
82 changes: 22 additions & 60 deletions automation/taskcluster/lib/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@ def __init__(
self.date = arrow.get(date_string)
self.trust_level = trust_level

def craft_assemble_release_task(self, architectures, is_staging=False):
def craft_assemble_nightly_task(self, architectures, is_staging=False):
artifacts = {
'public/target.{}.apk'.format(arch): {
"type": 'file',
"path": '/opt/fenix/app/build/outputs/apk/'
'{}Greenfield/release/app-{}-greenfield-release-unsigned.apk'.format(arch, arch),
'{}/nightly/app-{}-nightly-unsigned.apk'.format(arch, arch),
"expires": taskcluster.stringDate(taskcluster.fromNow(DEFAULT_EXPIRES_IN)),
}
for arch in architectures
Expand Down Expand Up @@ -72,7 +72,7 @@ def craft_assemble_release_task(self, architectures, is_staging=False):
)

gradle_commands = (
'./gradlew --no-daemon -PcrashReports=true -Ptelemetry=true clean test assembleRelease',
'./gradlew --no-daemon -PcrashReports=true -Ptelemetry=true clean test assembleNightly',
)

command = ' && '.join(
Expand Down Expand Up @@ -172,8 +172,8 @@ def craft_ktlint_task(self):
def craft_lint_task(self):
return self._craft_clean_gradle_task(
name='lint',
description='Running lint for arm64 release variant',
gradle_task='lintAarch64GreenfieldRelease',
description='Running lint for aarch64 release variant',
gradle_task='lintAarch64Release',
treeherder={
'jobKind': 'test',
'machine': {
Expand Down Expand Up @@ -331,22 +331,20 @@ def _craft_default_task_definition(
def craft_master_commit_signing_task(
self, assemble_task_id, variant
):
architecture, build_type, product = _get_architecture_and_build_type_and_product_from_variant(variant)
product = convert_camel_case_into_kebab_case(product)
postfix = convert_camel_case_into_kebab_case('{}-{}'.format(architecture, build_type))
architecture, build_type = get_architecture_and_build_type_from_variant(variant)
routes = [
'index.project.mobile.fenix.branch.master.revision.{}.{}.{}'.format(
self.commit, product, postfix
'index.project.mobile.fenix.v2.branch.master.revision.{}.{}.{}'.format(
self.commit, build_type, architecture
mitchhentges marked this conversation as resolved.
Show resolved Hide resolved
),
'index.project.mobile.fenix.branch.master.latest.{}.{}'.format(
product, postfix
'index.project.mobile.fenix.v2.branch.master.latest.{}.{}.{}'.format(
product, build_type, architecture
),
'index.project.mobile.fenix.branch.master.pushdate.{}.{}.{}.revision.{}.{}.{}'.format(
'index.project.mobile.fenix.v2.branch.master.pushdate.{}.{}.{}.revision.{}.{}.{}'.format(
self.date.year, self.date.month, self.date.day, self.commit,
product, postfix
build_type, architecture
),
'index.project.mobile.fenix.branch.master.pushdate.{}.{}.{}.latest.{}.{}'.format(
self.date.year, self.date.month, self.date.day, product, postfix
'index.project.mobile.fenix.v2.branch.master.pushdate.{}.{}.{}.latest.{}.{}'.format(
self.date.year, self.date.month, self.date.day, build_type, architecture
),
]

Expand Down Expand Up @@ -439,15 +437,13 @@ def craft_push_task(


def _craft_treeherder_platform_from_variant(variant):
architecture, build_type, _ = _get_architecture_and_build_type_and_product_from_variant(
variant
)
architecture, build_type = get_architecture_and_build_type_from_variant(variant)
return 'android-{}-{}'.format(architecture, build_type)


def _craft_treeherder_group_symbol_from_variant(variant):
_, __, product = _get_architecture_and_build_type_and_product_from_variant(variant)
return product
_, build_type = get_architecture_and_build_type_from_variant(variant)
return build_type


def _craft_artifacts_from_variant(variant):
Expand All @@ -461,29 +457,19 @@ def _craft_artifacts_from_variant(variant):


def _craft_apk_full_path_from_variant(variant):
architecture, build_type, product = _get_architecture_and_build_type_and_product_from_variant(
variant
)

short_variant = variant[:-len(build_type)]
architecture, build_type = get_architecture_and_build_type_from_variant(variant)
postfix = '-unsigned' if build_type.startswith('release') else ''
product = lower_case_first_letter(product)

return '/opt/fenix/app/build/outputs/apk/{short_variant}/{build_type}/app-{architecture}-{product}-{build_type}{postfix}.apk'.format( # noqa: E501
return '/opt/fenix/app/build/outputs/apk/{architecture}/{build_type}/app-{architecture}-{build_type}{postfix}.apk'.format( # noqa: E501
architecture=architecture,
build_type=build_type,
product=product,
short_variant=short_variant,
postfix=postfix
)


_SUPPORTED_ARCHITECTURES = ('aarch64', 'arm', 'x86')
_SUPPORTED_BUILD_TYPES = ('Debug', 'Release', 'ReleaseRaptor')
_SUPPORTED_PRODUCTS = ('FirefoxBeta', 'FirefoxNightly', 'FirefoxRelease', 'Greenfield')


def _get_architecture_and_build_type_and_product_from_variant(variant):
def get_architecture_and_build_type_from_variant(variant):
for supported_architecture in _SUPPORTED_ARCHITECTURES:
if variant.startswith(supported_architecture):
architecture = supported_architecture
Expand All @@ -496,32 +482,8 @@ def _get_architecture_and_build_type_and_product_from_variant(variant):
)
)

for supported_build_type in _SUPPORTED_BUILD_TYPES:
if variant.endswith(supported_build_type):
build_type = lower_case_first_letter(supported_build_type)
break
else:
raise ValueError(
'Cannot identify build type in "{}". '
'Expected to find one of these supported ones: {}'.format(
variant, _SUPPORTED_BUILD_TYPES
)
)

remaining_variant_data = variant[len(architecture):len(variant) - len(build_type)]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

for supported_product in _SUPPORTED_PRODUCTS:
if remaining_variant_data == supported_product:
product = supported_product
break
else:
raise ValueError(
'Cannot identify product in "{}" "{}". '
'Expected to find one of these supported ones: {}'.format(
remaining_variant_data, variant, _SUPPORTED_PRODUCTS
)
)

return architecture, build_type, product
build_type = variant[len(architecture):]
return architecture, build_type


def schedule_task(queue, taskId, task):
Expand Down
2 changes: 1 addition & 1 deletion config/pre-push-recommended.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,4 @@
./gradlew -q \
ktlint \
detekt \
app:assembleX86GreenfieldDebug
app:assembleX86Debug