зеркало из https://github.com/mozilla/gecko-dev.git
Backed out 6 changesets (bug 1417232) for failing in /python/mozbuild/mozbuild/test/configure/lint.py::Lint::test_mobile_android r=backout on a CLOSED TREE
Backed out changeset 06e72cdd94a5 (bug 1417232) Backed out changeset 036308b8fe6b (bug 1417232) Backed out changeset bb63e12fea6f (bug 1417232) Backed out changeset d0a9d2d4c5b7 (bug 1417232) Backed out changeset b613dde03d99 (bug 1417232) Backed out changeset 8699e19b02e5 (bug 1417232)
This commit is contained in:
Родитель
fc575c2f27
Коммит
53c3b17b09
|
@ -30,9 +30,6 @@ path:try_task_config.json
|
|||
glob:**/moz.build
|
||||
glob:**/*.mozbuild
|
||||
|
||||
# Moz.configure files could trigger changes
|
||||
glob:**/*.configure
|
||||
|
||||
# Tooltool manifests also need to be opened. Assume they
|
||||
# are all somewhere in "tooltool-manifests" directories.
|
||||
glob:**/tooltool-manifests/**
|
||||
|
|
|
@ -376,6 +376,60 @@ android.applicationVariants.all { variant ->
|
|||
configureVariantWithJNIWrappers(variant, "Fennec")
|
||||
}
|
||||
|
||||
// Bug 1299015: Complain to treeherder if checkstyle, lint, or unittest fails. It's not obvious
|
||||
// how to listen to individual errors in most cases, so we just link to the reports for now.
|
||||
def makeTaskExecutionListener(artifactRootUrl) {
|
||||
return new TaskExecutionListener() {
|
||||
void beforeExecute(Task task) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
void afterExecute(Task task, TaskState state) {
|
||||
if (!state.failure) {
|
||||
return
|
||||
}
|
||||
|
||||
// Link to the failing report. The task path and the report path
|
||||
// depend on the android-lint task in
|
||||
// taskcluster/ci/android-stuff/kind.yml. It's not possible to link
|
||||
// directly, so for now consumers will need to copy-paste the URL.
|
||||
switch (task.path) {
|
||||
case ':app:checkstyle':
|
||||
def url = "${artifactRootUrl}/public/android/checkstyle/checkstyle.xml"
|
||||
println "TEST-UNEXPECTED-FAIL | android-checkstyle | Checkstyle rule violations were found. See the report at: $url"
|
||||
break
|
||||
|
||||
case ':app:lintOfficialPhotonDebug':
|
||||
def url = "${artifactRootUrl}/public/android/lint/lint-results-officialPhotonDebug.html"
|
||||
println "TEST-UNEXPECTED-FAIL | android-lint | Lint found errors in the project; aborting build. See the report at: $url"
|
||||
break
|
||||
|
||||
case ':app:testOfficialPhotonDebugUnitTest':
|
||||
def url = "${artifactRootUrl}/public/android/unittest/officialPhotonDebug/index.html"
|
||||
println "TEST-UNEXPECTED-FAIL | android-test | There were failing tests. See the reports at: $url"
|
||||
break
|
||||
|
||||
case ':app:findbugsHtmlOfficialPhotonDebug':
|
||||
def url = "${artifactRootUrl}/public/android/findbugs/findbugs-officialPhotonDebug-output.html"
|
||||
println "TEST-UNEXPECTED-FAIL | android-findbugs | Findbugs found issues in the project. See the report at: $url"
|
||||
break
|
||||
|
||||
case ':app:findbugsXmlOfficialPhotonDebug':
|
||||
def url = "${artifactRootUrl}/public/android/findbugs/findbugs-officialPhotonDebug-output.xml"
|
||||
println "TEST-UNEXPECTED-FAIL | android-findbugs | Findbugs found issues in the project. See the report at: $url"
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TASK_ID and RUN_ID are provided by docker-worker; see
|
||||
// https://docs.taskcluster.net/manual/execution/workers/docker-worker.
|
||||
if (System.env.TASK_ID && System.env.RUN_ID) {
|
||||
def artifactRootUrl = "https://queue.taskcluster.net/v1/task/${System.env.TASK_ID}/runs/${System.env.RUN_ID}/artifacts"
|
||||
gradle.addListener(makeTaskExecutionListener(artifactRootUrl))
|
||||
}
|
||||
|
||||
if (gradle.startParameter.taskNames.any { it.endsWith('UnitTest') }) {
|
||||
// Approach cribbed from https://github.com/rwinch/jce-checker.
|
||||
int maxKeyLen = javax.crypto.Cipher.getMaxAllowedKeyLength("AES")
|
||||
|
|
|
@ -236,7 +236,12 @@ ifdef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
|||
define gradle_command
|
||||
$(1): $(2)
|
||||
@$$(TOUCH) $$@
|
||||
$$(topsrcdir)/mach android assemble-app
|
||||
$$(topsrcdir)/mach gradle \
|
||||
geckoview:generateJNIWrappersForGeneratedRelease \
|
||||
app:generateJNIWrappersForFennecOfficialPhotonDebug \
|
||||
app:assembleOfficialPhotonDebug \
|
||||
app:assembleOfficialPhotonDebugAndroidTest \
|
||||
-x lint
|
||||
endef
|
||||
|
||||
# .gradle.deps: .aapt.deps FORCE
|
||||
|
@ -503,7 +508,7 @@ $(eval $(call gradle_command,.gradle.nodeps,AndroidManifest.xml $(constants_PP_J
|
|||
|
||||
.aapt.nodeps: .gradle.nodeps FORCE
|
||||
@$(TOUCH) $@
|
||||
cp $(GRADLE_ANDROID_APP_APK) gecko-nodeps.ap_
|
||||
cp $(gradle_dir)/app/outputs/apk/app-official-photon-debug.apk gecko-nodeps.ap_
|
||||
cp $(gradle_dir)/app/intermediates/transforms/dex/officialPhoton/debug/folders/1000/1f/main/classes.dex classes.dex
|
||||
else
|
||||
# .aapt.nodeps: AndroidManifest.xml FORCE
|
||||
|
|
|
@ -36,156 +36,6 @@ def gradle(value, build_env):
|
|||
set_config('GRADLE', gradle)
|
||||
|
||||
|
||||
@dependable
|
||||
@imports(_from='itertools', _import='chain')
|
||||
def gradle_android_build_config():
|
||||
def capitalize(s):
|
||||
# str.capitalize lower cases trailing letters.
|
||||
if s:
|
||||
return s[0].upper() + s[1:]
|
||||
else:
|
||||
return s
|
||||
|
||||
# It's not really possible to abstract the GeckoView details just yet; post
|
||||
# Android-Gradle plugin 3.0+, the configurations can be more sensible and
|
||||
# we'll do this work.
|
||||
def variant(productFlavors, buildType):
|
||||
return namespace(
|
||||
productFlavors=productFlavors,
|
||||
buildType=buildType,
|
||||
# Like 'OfficialWithoutGeckoBinariesPhotonDebug'
|
||||
name = ''.join(capitalize(t) for t in chain(productFlavors, (buildType, )))
|
||||
)
|
||||
|
||||
return namespace(
|
||||
app=namespace(
|
||||
variant=variant(('official', 'photon'), 'debug'),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config)
|
||||
def gradle_android_app_variant_name(build_config):
|
||||
'''Like "officialPhotonDebug".'''
|
||||
def uncapitalize(s):
|
||||
if s:
|
||||
return s[0].lower() + s[1:]
|
||||
else:
|
||||
return s
|
||||
|
||||
return uncapitalize(build_config.app.variant.name)
|
||||
|
||||
set_config('GRADLE_ANDROID_APP_VARIANT_NAME', gradle_android_app_variant_name)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config)
|
||||
def gradle_android_app_tasks(build_config):
|
||||
'''Gradle tasks run by |mach android assemble-app|.'''
|
||||
return [
|
||||
'geckoview:generateJNIWrappersForGeneratedRelease',
|
||||
'app:generateJNIWrappersForFennec{app.variant.name}'.format(app=build_config.app),
|
||||
'app:assemble{app.variant.name}'.format(app=build_config.app),
|
||||
'app:assemble{app.variant.name}AndroidTest'.format(app=build_config.app),
|
||||
]
|
||||
|
||||
set_config('GRADLE_ANDROID_APP_TASKS', gradle_android_app_tasks)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config, check_build_environment)
|
||||
def gradle_android_app_apks(build_config, build_env):
|
||||
'''Paths to APK files produced by |mach android assemble-app|.'''
|
||||
flavor = '-'.join(build_config.app.variant.productFlavors)
|
||||
buildType = build_config.app.variant.buildType
|
||||
f = '{}/gradle/build/mobile/android/app/outputs/apk/app-{}-{}.apk'
|
||||
g = '{}/gradle/build/mobile/android/app/outputs/apk/app-{}-{}-androidTest.apk'
|
||||
return namespace(app_apk=f.format(build_env.topobjdir, flavor, buildType),
|
||||
app_androidTest_apk=g.format(build_env.topobjdir, flavor, buildType))
|
||||
|
||||
set_config('GRADLE_ANDROID_APP_APK', gradle_android_app_apks.app_apk)
|
||||
set_config('GRADLE_ANDROID_APP_ANDROIDTEST_APK', gradle_android_app_apks.app_androidTest_apk)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config)
|
||||
def gradle_android_test_tasks(build_config):
|
||||
'''Gradle tasks run by |mach android test|.'''
|
||||
return [
|
||||
'app:test{app.variant.name}UnitTest'.format(app=build_config.app),
|
||||
]
|
||||
|
||||
set_config('GRADLE_ANDROID_TEST_TASKS', gradle_android_test_tasks)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config)
|
||||
def gradle_android_lint_tasks(build_config):
|
||||
'''Gradle tasks run by |mach android lint|.'''
|
||||
return [
|
||||
'app:lint{app.variant.name}'.format(app=build_config.app),
|
||||
]
|
||||
|
||||
set_config('GRADLE_ANDROID_LINT_TASKS', gradle_android_lint_tasks)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config)
|
||||
def gradle_android_checkstyle_tasks(build_config):
|
||||
'''Gradle tasks run by |mach android checkstyle|.'''
|
||||
return [
|
||||
'app:checkstyle',
|
||||
]
|
||||
|
||||
set_config('GRADLE_ANDROID_CHECKSTYLE_TASKS', gradle_android_checkstyle_tasks)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config)
|
||||
def gradle_android_findbugs_tasks(build_config):
|
||||
'''Gradle tasks run by |mach android findbugs|.'''
|
||||
return [
|
||||
'app:findbugsXml{app.variant.name}'.format(app=build_config.app),
|
||||
'app:findbugsHtml{app.variant.name}'.format(app=build_config.app),
|
||||
]
|
||||
|
||||
set_config('GRADLE_ANDROID_FINDBUGS_TASKS', gradle_android_findbugs_tasks)
|
||||
|
||||
|
||||
@depends(gradle_android_build_config)
|
||||
def gradle_android_archive_geckoview_tasks(build_config):
|
||||
'''Gradle tasks run by |mach android archive-geckoview|.'''
|
||||
return [
|
||||
'geckoview:assembleWithGeckoBinaries',
|
||||
'geckoview_example:assembleWithGeckoBinaries',
|
||||
'geckoview_example:assembleWithGeckoBinariesAndroidTest',
|
||||
'geckoview:uploadArchives',
|
||||
]
|
||||
|
||||
set_config('GRADLE_ANDROID_ARCHIVE_GECKOVIEW_TASKS', gradle_android_archive_geckoview_tasks)
|
||||
|
||||
|
||||
@depends(
|
||||
gradle_android_build_config,
|
||||
gradle_android_app_tasks,
|
||||
gradle_android_test_tasks,
|
||||
gradle_android_lint_tasks,
|
||||
gradle_android_checkstyle_tasks,
|
||||
gradle_android_findbugs_tasks,
|
||||
gradle_android_archive_geckoview_tasks,
|
||||
)
|
||||
@imports(_from='itertools', _import='imap')
|
||||
@imports(_from='itertools', _import='chain')
|
||||
@imports(_from='itertools', _import='ifilterfalse')
|
||||
def gradle_android_dependencies_tasks(build_config, *tasks):
|
||||
'''Gradle tasks run by |mach android dependencies|.'''
|
||||
# The union, plus a bit more, of all of the Gradle tasks
|
||||
# invoked by the android-* automation jobs.
|
||||
def withoutGeckoBinaries(task):
|
||||
return task.replace('withGeckoBinaries', 'withoutGeckoBinaries')
|
||||
|
||||
def isUploadArchives(task):
|
||||
return 'uploadArchives' in task
|
||||
|
||||
return list(ifilterfalse(isUploadArchives, imap(withoutGeckoBinaries, chain(*tasks))))
|
||||
|
||||
set_config('GRADLE_ANDROID_DEPENDENCIES_TASKS', gradle_android_dependencies_tasks)
|
||||
|
||||
|
||||
# Automation uses this to change log levels, not use the daemon, and use
|
||||
# offline mode.
|
||||
option(env='GRADLE_FLAGS', default='', help='Flags to pass to Gradle.')
|
||||
|
|
|
@ -40,13 +40,6 @@ def REMOVED(cls):
|
|||
|
||||
@CommandProvider
|
||||
class MachCommands(MachCommandBase):
|
||||
def _root_url(self, artifactdir=None, objdir=None):
|
||||
if 'TASK_ID' in os.environ and 'RUN_ID' in os.environ:
|
||||
return 'https://queue.taskcluster.net/v1/task/{}/runs/{}/artifacts/{}'.format(os.environ['TASK_ID'], os.environ['RUN_ID'], artifactdir)
|
||||
else:
|
||||
return os.path.join(self.topobjdir, objdir)
|
||||
|
||||
|
||||
@Command('android', category='devenv',
|
||||
description='Run Android-specific commands.',
|
||||
conditions=[conditions.is_android])
|
||||
|
@ -54,22 +47,15 @@ class MachCommands(MachCommandBase):
|
|||
pass
|
||||
|
||||
|
||||
@SubCommand('android', 'assemble-app',
|
||||
"""Assemble Firefox for Android.
|
||||
See http://firefox-source-docs.mozilla.org/build/buildsystem/toolchains.html#firefox-for-android-with-gradle""")
|
||||
@CommandArgument('args', nargs=argparse.REMAINDER)
|
||||
def android_assemble_app(self, args):
|
||||
ret = self.gradle(self.substs['GRADLE_ANDROID_APP_TASKS'] + ['-x', 'lint', '--continue'] + args, verbose=True)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
@SubCommand('android', 'test',
|
||||
"""Run Android local unit tests.
|
||||
See https://developer.mozilla.org/en-US/docs/Mozilla/Android-specific_test_suites#android-test""")
|
||||
@CommandArgument('args', nargs=argparse.REMAINDER)
|
||||
def android_test(self, args):
|
||||
ret = self.gradle(self.substs['GRADLE_ANDROID_TEST_TASKS'] + ["--continue"] + args, verbose=True)
|
||||
gradle_targets = [
|
||||
'app:testOfficialPhotonDebugUnitTest',
|
||||
]
|
||||
ret = self.gradle(gradle_targets + ["--continue"] + args, verbose=True)
|
||||
|
||||
# Findbug produces both HTML and XML reports. Visit the
|
||||
# XML report(s) to report errors and link to the HTML
|
||||
|
@ -81,11 +67,12 @@ class MachCommands(MachCommandBase):
|
|||
FileFinder,
|
||||
)
|
||||
|
||||
root_url = self._root_url(
|
||||
artifactdir='public/android/unittest',
|
||||
objdir='gradle/build/mobile/android/app/reports/tests')
|
||||
if 'TASK_ID' in os.environ and 'RUN_ID' in os.environ:
|
||||
root_url = "https://queue.taskcluster.net/v1/task/{}/runs/{}/artifacts/public/android/unittest".format(os.environ['TASK_ID'], os.environ['RUN_ID'])
|
||||
else:
|
||||
root_url = os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/reports/tests')
|
||||
|
||||
reports = (self.substs['GRADLE_ANDROID_APP_VARIANT_NAME'],)
|
||||
reports = ('officialPhotonDebug',)
|
||||
for report in reports:
|
||||
finder = FileFinder(os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/test-results/', report))
|
||||
for p, _ in finder.find('TEST-*.xml'):
|
||||
|
@ -93,14 +80,6 @@ class MachCommands(MachCommandBase):
|
|||
tree = ET.parse(f)
|
||||
root = tree.getroot()
|
||||
|
||||
# Log reports for Tree Herder "Job Details".
|
||||
print('TinderboxPrint: report<br/><a href="{}/{}/index.html">HTML {} report</a>, visit "Inspect Task" link for details'.format(root_url, report, report))
|
||||
|
||||
# And make the report display as soon as possible.
|
||||
failed = root.findall('testcase/error') or root.findall('testcase/failure')
|
||||
if failed:
|
||||
print('TEST-UNEXPECTED-FAIL | android-test | There were failing tests. See the reports at: {}/{}/index.html'.format(root_url, report))
|
||||
|
||||
print('SUITE-START | android-test | {} {}'.format(report, root.get('name')))
|
||||
|
||||
for testcase in root.findall('testcase'):
|
||||
|
@ -132,6 +111,9 @@ class MachCommands(MachCommandBase):
|
|||
|
||||
print('SUITE-END | android-test | {} {}'.format(report, root.get('name')))
|
||||
|
||||
title = report
|
||||
print("TinderboxPrint: report<br/><a href='{}/{}/index.html'>HTML {} report</a>, visit \"Inspect Task\" link for details".format(root_url, report, title))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
|
@ -140,33 +122,27 @@ class MachCommands(MachCommandBase):
|
|||
See https://developer.mozilla.org/en-US/docs/Mozilla/Android-specific_test_suites#android-lint""")
|
||||
@CommandArgument('args', nargs=argparse.REMAINDER)
|
||||
def android_lint(self, args):
|
||||
ret = self.gradle(self.substs['GRADLE_ANDROID_LINT_TASKS'] + ["--continue"] + args, verbose=True)
|
||||
gradle_targets = [
|
||||
'app:lintOfficialPhotonDebug',
|
||||
]
|
||||
ret = self.gradle(gradle_targets + ["--continue"] + args, verbose=True)
|
||||
|
||||
# Android Lint produces both HTML and XML reports. Visit the
|
||||
# XML report(s) to report errors and link to the HTML
|
||||
# report(s) for human consumption.
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
root_url = self._root_url(
|
||||
artifactdir='public/android/lint',
|
||||
objdir='gradle/build/mobile/android/app/reports')
|
||||
if 'TASK_ID' in os.environ and 'RUN_ID' in os.environ:
|
||||
root_url = "https://queue.taskcluster.net/v1/task/{}/runs/{}/artifacts/public/android/lint".format(os.environ['TASK_ID'], os.environ['RUN_ID'])
|
||||
else:
|
||||
root_url = os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/reports')
|
||||
|
||||
reports = (self.substs['GRADLE_ANDROID_APP_VARIANT_NAME'],)
|
||||
reports = ('officialPhotonDebug',)
|
||||
for report in reports:
|
||||
f = open(os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/reports/lint-results-{}.xml'.format(report)), 'rt')
|
||||
tree = ET.parse(f)
|
||||
root = tree.getroot()
|
||||
|
||||
# Log reports for Tree Herder "Job Details".
|
||||
html_report_url = '{}/lint-results-{}.html'.format(root_url, report)
|
||||
xml_report_url = '{}/lint-results-{}.xml'.format(root_url, report)
|
||||
print('TinderboxPrint: report<br/><a href="{}">HTML {} report</a>, visit "Inspect Task" link for details'.format(html_report_url, report))
|
||||
print('TinderboxPrint: report<br/><a href="{}">XML {} report</a>, visit "Inspect Task" link for details'.format(xml_report_url, report))
|
||||
|
||||
# And make the report display as soon as possible.
|
||||
if root.findall("issue[@severity='Error']"):
|
||||
print('TEST-UNEXPECTED-FAIL | android-lint | Lint found errors in the project; aborting build. See the report at: {}'.format(html_report_url))
|
||||
|
||||
print('SUITE-START | android-lint | {}'.format(report))
|
||||
for issue in root.findall("issue[@severity='Error']"):
|
||||
# There's no particular advantage to formatting the
|
||||
|
@ -177,6 +153,10 @@ class MachCommands(MachCommandBase):
|
|||
ret |= 1
|
||||
print('SUITE-END | android-lint | {}'.format(report))
|
||||
|
||||
title = report
|
||||
print("TinderboxPrint: report<br/><a href='{}/lint-results-{}.html'>HTML {} report</a>, visit \"Inspect Task\" link for details".format(root_url, report, title))
|
||||
print("TinderboxPrint: report<br/><a href='{}/lint-results-{}.xml'>XML {} report</a>, visit \"Inspect Task\" link for details".format(root_url, report, title))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
|
@ -185,7 +165,10 @@ class MachCommands(MachCommandBase):
|
|||
See https://developer.mozilla.org/en-US/docs/Mozilla/Android-specific_test_suites#android-checkstyle""")
|
||||
@CommandArgument('args', nargs=argparse.REMAINDER)
|
||||
def android_checkstyle(self, args):
|
||||
ret = self.gradle(self.substs['GRADLE_ANDROID_CHECKSTYLE_TASKS'] + ["--continue"] + args, verbose=True)
|
||||
gradle_targets = [
|
||||
'app:checkstyle',
|
||||
]
|
||||
ret = self.gradle(gradle_targets + ["--continue"] + args, verbose=True)
|
||||
|
||||
# Checkstyle produces both HTML and XML reports. Visit the
|
||||
# XML report(s) to report errors and link to the HTML
|
||||
|
@ -196,22 +179,6 @@ class MachCommands(MachCommandBase):
|
|||
tree = ET.parse(f)
|
||||
root = tree.getroot()
|
||||
|
||||
# Now the reports, linkified.
|
||||
root_url = self._root_url(
|
||||
artifactdir='public/android/checkstyle',
|
||||
objdir='gradle/build/mobile/android/app/reports/checkstyle')
|
||||
|
||||
# Log reports for Tree Herder "Job Details".
|
||||
print('TinderboxPrint: report<br/><a href="{}/checkstyle.html">HTML checkstyle report</a>, visit "Inspect Task" link for details'.format(root_url))
|
||||
print('TinderboxPrint: report<br/><a href="{}/checkstyle.xml">XML checkstyle report</a>, visit "Inspect Task" link for details'.format(root_url))
|
||||
|
||||
# And make the report display as soon as possible.
|
||||
if root.findall('file/error'):
|
||||
ret |= 1
|
||||
|
||||
if ret:
|
||||
print('TEST-UNEXPECTED-FAIL | android-checkstyle | Checkstyle rule violations were found. See the report at: {}/checkstyle.html'.format(root_url))
|
||||
|
||||
print('SUITE-START | android-checkstyle')
|
||||
for file in root.findall('file'):
|
||||
name = file.get('name')
|
||||
|
@ -226,11 +193,21 @@ class MachCommands(MachCommandBase):
|
|||
for line in ET.tostring(error).strip().splitlines():
|
||||
print('TEST-UNEXPECTED-FAIL | {}'.format(line))
|
||||
error_count += 1
|
||||
ret |= 1
|
||||
|
||||
if not error_count:
|
||||
print('TEST-PASS | {}'.format(name))
|
||||
print('SUITE-END | android-checkstyle')
|
||||
|
||||
# Now the reports, linkified.
|
||||
if 'TASK_ID' in os.environ and 'RUN_ID' in os.environ:
|
||||
root_url = "https://queue.taskcluster.net/v1/task/{}/runs/{}/artifacts/public/android/checkstyle".format(os.environ['TASK_ID'], os.environ['RUN_ID'])
|
||||
else:
|
||||
root_url = os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/reports/checkstyle')
|
||||
|
||||
print("TinderboxPrint: report<br/><a href='{}/checkstyle.html'>HTML checkstyle report</a>, visit \"Inspect Task\" link for details".format(root_url))
|
||||
print("TinderboxPrint: report<br/><a href='{}/checkstyle.xml'>XML checkstyle report</a>, visit \"Inspect Task\" link for details".format(root_url))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
|
@ -239,37 +216,32 @@ class MachCommands(MachCommandBase):
|
|||
See https://developer.mozilla.org/en-US/docs/Mozilla/Android-specific_test_suites#android-findbugs""")
|
||||
@CommandArgument('args', nargs=argparse.REMAINDER)
|
||||
def android_findbugs(self, dryrun=False, args=[]):
|
||||
ret = self.gradle(self.substs['GRADLE_ANDROID_FINDBUGS_TASKS'] + ["--continue"] + args, verbose=True)
|
||||
gradle_targets = [
|
||||
'app:findbugsXmlOfficialPhotonDebug',
|
||||
'app:findbugsHtmlOfficialPhotonDebug',
|
||||
]
|
||||
ret = self.gradle(gradle_targets + ["--continue"] + args, verbose=True)
|
||||
|
||||
# Findbug produces both HTML and XML reports. Visit the
|
||||
# XML report(s) to report errors and link to the HTML
|
||||
# report(s) for human consumption.
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
root_url = self._root_url(
|
||||
artifactdir='public/android/findbugs',
|
||||
objdir='gradle/build/mobile/android/app/reports/findbugs')
|
||||
if 'TASK_ID' in os.environ and 'RUN_ID' in os.environ:
|
||||
root_url = "https://queue.taskcluster.net/v1/task/{}/runs/{}/artifacts/public/artifacts/findbugs".format(os.environ['TASK_ID'], os.environ['RUN_ID'])
|
||||
else:
|
||||
root_url = os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/reports/findbugs')
|
||||
|
||||
reports = (self.substs['GRADLE_ANDROID_APP_VARIANT_NAME'],)
|
||||
reports = ('findbugs-officialPhotonDebug-output.xml',)
|
||||
for report in reports:
|
||||
try:
|
||||
f = open(os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/reports/findbugs', 'findbugs-{}-output.xml'.format(report)), 'rt')
|
||||
f = open(os.path.join(self.topobjdir, 'gradle/build/mobile/android/app/reports/findbugs', report), 'rt')
|
||||
except IOError:
|
||||
continue
|
||||
|
||||
tree = ET.parse(f)
|
||||
root = tree.getroot()
|
||||
|
||||
# Log reports for Tree Herder "Job Details".
|
||||
html_report_url = '{}/findbugs-{}-output.html'.format(root_url, report)
|
||||
xml_report_url = '{}/findbugs-{}-output.xml'.format(root_url, report)
|
||||
print('TinderboxPrint: report<br/><a href="{}">HTML {} report</a>, visit "Inspect Task" link for details'.format(html_report_url, report))
|
||||
print('TinderboxPrint: report<br/><a href="{}">XML {} report</a>, visit "Inspect Task" link for details'.format(xml_report_url, report))
|
||||
|
||||
# And make the report display as soon as possible.
|
||||
if root.findall("./BugInstance"):
|
||||
print('TEST-UNEXPECTED-FAIL | android-findbugs | Findbugs found issues in the project. See the report at: {}'.format(html_report_url))
|
||||
|
||||
print('SUITE-START | android-findbugs | {}'.format(report))
|
||||
for error in root.findall('./BugInstance'):
|
||||
# There's no particular advantage to formatting the
|
||||
|
@ -281,6 +253,10 @@ class MachCommands(MachCommandBase):
|
|||
ret |= 1
|
||||
print('SUITE-END | android-findbugs | {}'.format(report))
|
||||
|
||||
title = report.replace('findbugs-', '').replace('-output.xml', '')
|
||||
print("TinderboxPrint: report<br/><a href='{}/{}'>HTML {} report</a>, visit \"Inspect Task\" link for details".format(root_url, report.replace('.xml', '.html'), title))
|
||||
print("TinderboxPrint: report<br/><a href='{}/{}'>XML {} report</a>, visit \"Inspect Task\" link for details".format(root_url, report, title))
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
|
@ -289,24 +265,30 @@ class MachCommands(MachCommandBase):
|
|||
See http://firefox-source-docs.mozilla.org/build/buildsystem/toolchains.html#firefox-for-android-with-gradle""")
|
||||
@CommandArgument('args', nargs=argparse.REMAINDER)
|
||||
def android_gradle_dependencies(self, args):
|
||||
# The union, plus a bit more, of all of the Gradle tasks
|
||||
# invoked by the android-* automation jobs.
|
||||
gradle_targets = [
|
||||
'app:checkstyle',
|
||||
'app:assembleOfficialPhotonRelease',
|
||||
'app:assembleOfficialPhotonDebug',
|
||||
'app:assembleOfficialPhotonDebugAndroidTest',
|
||||
'app:findbugsXmlOfficialPhotonDebug',
|
||||
'app:findbugsHtmlOfficialPhotonDebug',
|
||||
'app:lintOfficialPhotonDebug',
|
||||
# Does not include Gecko binaries -- see mobile/android/gradle/with_gecko_binaries.gradle.
|
||||
'geckoview:assembleWithoutGeckoBinaries',
|
||||
# So that we pick up the test dependencies for the builders.
|
||||
'geckoview_example:assembleWithoutGeckoBinaries',
|
||||
'geckoview_example:assembleWithoutGeckoBinariesAndroidTest',
|
||||
]
|
||||
# We don't want to gate producing dependency archives on clean
|
||||
# lint or checkstyle, particularly because toolchain versions
|
||||
# can change the outputs for those processes.
|
||||
self.gradle(self.substs['GRADLE_ANDROID_DEPENDENCIES_TASKS'] + ["--continue"] + args, verbose=True)
|
||||
ret = self.gradle(gradle_targets + ["--continue"] + args, verbose=True)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
@SubCommand('android', 'archive-geckoview',
|
||||
"""Create GeckoView archives.
|
||||
See http://firefox-source-docs.mozilla.org/build/buildsystem/toolchains.html#firefox-for-android-with-gradle""")
|
||||
@CommandArgument('args', nargs=argparse.REMAINDER)
|
||||
def android_archive_geckoview(self, args):
|
||||
ret = self.gradle(self.substs['GRADLE_ANDROID_ARCHIVE_GECKOVIEW_TASKS'] + ["--continue"] + args, verbose=True)
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
@Command('gradle', category='devenv',
|
||||
description='Run gradle.',
|
||||
conditions=[conditions.is_android])
|
||||
|
|
|
@ -41,7 +41,6 @@ android-test/opt:
|
|||
skip-unless-changed:
|
||||
- "mobile/android/base/**"
|
||||
- "mobile/android/config/**"
|
||||
- "mobile/android/gradle.configure"
|
||||
- "mobile/android/tests/background/junit4/**"
|
||||
- "**/*.gradle"
|
||||
|
||||
|
@ -97,10 +96,9 @@ android-lint/opt:
|
|||
- "mobile/android/**/*.jpg"
|
||||
- "mobile/android/**/*.png"
|
||||
- "mobile/android/**/*.svg"
|
||||
- "mobile/android/**/*.xml"
|
||||
- "mobile/android/**/*.xml" # Manifest & android resources
|
||||
- "mobile/android/**/Makefile.in"
|
||||
- "mobile/android/config/**"
|
||||
- "mobile/android/gradle.configure"
|
||||
- "mobile/android/**/moz.build"
|
||||
- "**/*.gradle"
|
||||
|
||||
|
@ -152,7 +150,6 @@ android-checkstyle/opt:
|
|||
- "mobile/android/**/*.java"
|
||||
- "mobile/android/**/Makefile.in"
|
||||
- "mobile/android/config/**"
|
||||
- "mobile/android/gradle.configure"
|
||||
- "mobile/android/**/moz.build"
|
||||
- "**/*.gradle"
|
||||
|
||||
|
@ -203,6 +200,5 @@ android-findbugs/opt:
|
|||
- "mobile/android/**/*.java"
|
||||
- "mobile/android/**/Makefile.in"
|
||||
- "mobile/android/config/**"
|
||||
- "mobile/android/gradle.configure"
|
||||
- "mobile/android/**/moz.build"
|
||||
- "**/*.gradle"
|
||||
|
|
|
@ -313,7 +313,6 @@ linux64-android-gradle-dependencies:
|
|||
- '**/*.gradle'
|
||||
- 'mobile/android/config/mozconfigs/android-api-16-gradle-dependencies/**'
|
||||
- 'mobile/android/config/mozconfigs/common*'
|
||||
- 'mobile/android/gradle.configure'
|
||||
toolchain-artifact: public/build/android-gradle-dependencies.tar.xz
|
||||
toolchain-alias: android-gradle-dependencies
|
||||
toolchains:
|
||||
|
|
|
@ -25,7 +25,7 @@ include $(topsrcdir)/config/android-common.mk
|
|||
ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
||||
robocop_apk := $(topobjdir)/mobile/android/tests/browser/robocop/robocop-debug-unsigned-unaligned.apk
|
||||
else
|
||||
robocop_apk := $(GRADLE_ANDROID_APP_ANDROIDTEST_APK)
|
||||
robocop_apk := $(topobjdir)/gradle/build/mobile/android/app/outputs/apk/app-official-photon-debug-androidTest.apk
|
||||
endif
|
||||
|
||||
stage-package-android:
|
||||
|
|
|
@ -1003,7 +1003,9 @@ class AndroidArguments(ArgumentContainer):
|
|||
|
||||
if not options.robocopApk and build_obj:
|
||||
if build_obj.substs.get('MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE'):
|
||||
options.robocopApk = build_obj.substs.get('GRADLE_ANDROID_APP_ANDROIDTEST_APK')
|
||||
options.robocopApk = os.path.join(build_obj.topobjdir, 'gradle', 'build',
|
||||
'mobile', 'android', 'app', 'outputs', 'apk',
|
||||
'app-official-photon-debug-androidTest.apk')
|
||||
else:
|
||||
options.robocopApk = os.path.join(build_obj.topobjdir, 'mobile', 'android',
|
||||
'tests', 'browser',
|
||||
|
|
|
@ -130,8 +130,10 @@ config = {
|
|||
# binaries are in the object directory, ready to be packaged into the
|
||||
# GeckoView AAR.
|
||||
'postflight_build_mach_commands': [
|
||||
['android',
|
||||
'archive-geckoview',
|
||||
['gradle',
|
||||
'geckoview:assembleWithGeckoBinaries',
|
||||
'geckoview_example:assembleWithGeckoBinaries',
|
||||
'uploadArchives',
|
||||
],
|
||||
],
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ UPLOAD_EXTRA_FILES += robocop.apk
|
|||
ifndef MOZ_BUILD_MOBILE_ANDROID_WITH_GRADLE
|
||||
robocop_apk := $(topobjdir)/mobile/android/tests/browser/robocop/robocop-debug-unsigned-unaligned.apk
|
||||
else
|
||||
robocop_apk := $(GRADLE_ANDROID_APP_ANDROIDTEST_APK)
|
||||
robocop_apk := $(topobjdir)/gradle/build/mobile/android/app/outputs/apk/app-official-photon-debug-androidTest.apk
|
||||
endif
|
||||
|
||||
INNER_ROBOCOP_PACKAGE= \
|
||||
|
|
Загрузка…
Ссылка в новой задаче