Merge b-i to m-c, a=merge
authorSeth Fowler <seth@mozilla.com>
Sat, 19 Sep 2015 13:21:24 -0700
changeset 297687 b547f85da6c3e56923271c4a96ed2031869ba860
parent 297670 6227054b78114433aeb8c2121715a667b2b11ddf (current diff)
parent 297686 9718f1e5a391dfc85138f04bd26db8479a0a80dc (diff)
child 297692 e035c0741781683d6f7ae0389adf7f724264e565
child 297737 3d9c627fc1c5f623e63e0ff7a3758f6975b9db9b
push id962
push userjlund@mozilla.com
push dateFri, 04 Dec 2015 23:28:54 +0000
treeherdermozilla-release@23a2d286e80f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone43.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge b-i to m-c, a=merge
testing/mozharness/mozharness.json
--- a/b2g/config/aries/sources.xml
+++ b/b2g/config/aries/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
--- a/b2g/config/dolphin/sources.xml
+++ b/b2g/config/dolphin/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="27eb2f04e149fc2c9976d881b1b5984bbe7ee089"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="067c08fb3e5744b42b68d1f861245f7d507109bc"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
--- a/b2g/config/emulator-l/sources.xml
+++ b/b2g/config/emulator-l/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="27eb2f04e149fc2c9976d881b1b5984bbe7ee089"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="067c08fb3e5744b42b68d1f861245f7d507109bc"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="8d83715f08b7849f16a0dfc88f78d5c3a89c0a54">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
-        "git_revision": "3e9de022ede11800170b6665606cb00c3fd92dc5", 
+        "git_revision": "e67d319d0854e32e23210784eb9c4e1b8a025adb", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "45fdde6d54d205a0991f6e3a10fd429fa836aa71", 
+    "revision": "62487ac0eb5432a716c1a8405bd9c5ebc9db2b1d", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/nexus-5-l/sources.xml
+++ b/b2g/config/nexus-5-l/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="c9d4fe680662ee44a4bdea42ae00366f5df399cf">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="3e9de022ede11800170b6665606cb00c3fd92dc5"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="e67d319d0854e32e23210784eb9c4e1b8a025adb"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="e9e2923fd6cab93cf88b4b9ada82225e44fe6635"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="2782648aabf0af464dd9c4202b367b408898546d"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="a1f9532e4157df2dc8d3e9c8100120f80117dcd4"/>
--- a/testing/docker/tester/VERSION
+++ b/testing/docker/tester/VERSION
@@ -1,1 +1,1 @@
-0.3.8
+0.3.9
\ No newline at end of file
--- a/testing/docker/tester/bin/entrypoint
+++ b/testing/docker/tester/bin/entrypoint
@@ -1,26 +1,21 @@
 #! /bin/bash -ex
 
-test $MOZHARNESS_REPOSITORY # mozharness repository
-test $MOZHARNESS_REV # mozharness revision
-
 # This file is intended to be used as the "entrypoint" or first command in the
 # docker image. It uses "eval" so it takes place of the usual /bin/bash -c
 # <stuff> conventions you need when running a docker image. Primarily it
 # bootstraps any processes that need to run outside of mozharness (like Xvfb)
 
 # XXX: Note that all tests could be faster at smaller bit depth
 Xvfb :0 -nolisten tcp -screen 0 1600x1200x24 2>/dev/null &
 export DISPLAY=:0
 
 pulseaudio --start
 
-# First check if the mozharness directory is available. This is intended to be
-# used locally in development to test mozharness changes:
-#
-#   $ docker -v your_mozharness:/home/worker/mozharness ...
-#
-if [ ! -d mozharness ]; then
-  buildbot_step 'Checkout mozharness' tc-vcs checkout mozharness $MOZHARNESS_REPOSITORY $MOZHARNESS_REPOSITORY $MOZHARNESS_REV
+# Download mozharness only when $MOZHARNESS_URL is defined
+if [ ! -z "$MOZHARNESS_URL" ]; then
+  buildbot_step 'Download mozharness' wget -c $MOZHARNESS_URL && \
+    unzip -q mozharness.zip && \
+    rm mozharness.zip
 fi
 
 buildbot_step 'Running tests' $@
--- a/testing/docker/tester/tester.env
+++ b/testing/docker/tester/tester.env
@@ -1,6 +1,4 @@
-MOZHARNESS_REPOSITORY=http://hg.mozilla.org/build/mozharness
-MOZHARNESS_REV=tip
 GAIA_REV=tip
 GAIA_REF=tip
 GAIA_BASE_REPOSITORY=https://hg.mozilla.org/integration/gaia-central
 GAIA_HEAD_REPOSITORY=https://hg.mozilla.org/integration/gaia-central
--- a/testing/mozharness/configs/b2g/mulet_config.py
+++ b/testing/mozharness/configs/b2g/mulet_config.py
@@ -5,22 +5,26 @@ config = {
         'read-buildbot-config',
         'pull',
         'download-and-extract',
         'create-virtualenv',
         'install',
         'run-tests',
     ],
     # testsuite options
-    "reftest_options": [
-        "--mulet",
-        "--profile=%(gaia_profile)s",
-        "--appname=%(application)s",
-        "--total-chunks=%(total_chunks)s",
-        "--this-chunk=%(this_chunk)s",
-        "--symbols-path=%(symbols_path)s",
-        "--enable-oop",
-        "%(test_manifest)s"
-    ],
+    "suite_definitions": {
+        "reftest": {
+            "options": [
+                "--mulet",
+                "--profile=%(gaia_profile)s",
+                "--appname=%(application)s",
+                "--total-chunks=%(total_chunks)s",
+                "--this-chunk=%(this_chunk)s",
+                "--symbols-path=%(symbols_path)s",
+                "--enable-oop",
+                "%(test_manifest)s"
+            ],
+        }
+    },
     "run_file_names": {
         "reftest": "runreftestb2g.py",
     },
 }
deleted file mode 100644
--- a/testing/mozharness/mozharness.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-    "repo": "https://hg.mozilla.org/build/mozharness",
-    "revision": "e218c0e82735"
-}
--- a/testing/mozharness/mozharness/base/script.py
+++ b/testing/mozharness/mozharness/base/script.py
@@ -385,24 +385,22 @@ class ScriptMixin(PlatformMixin):
             raise
         except socket.timeout, e:
             self.warning("Timed out accessing %s: %s" % (url, str(e)))
             raise
         except socket.error, e:
             self.warning("Socket error when accessing %s: %s" % (url, str(e)))
             raise
 
-    def _retry_download(self, url, error_level, file_name=None, retry_config=None):
-        """ Helper method to retry download methods
+    def _retry_download_file(self, url, file_name, error_level, retry_config=None):
+        """ Helper method to retry _download_file().
         Split out so we can alter the retry logic in mozharness.mozilla.testing.gaia_test.
 
         This method calls `self.retry` on `self._download_file` using the passed
-        parameters if a file_name is specified. If no file is specified, we will
-        instead call `self._urlopen`, which grabs the contents of a url but does
-        not create a file on disk.
+        parameters.
 
         Args:
             url (str): URL path where the file is located.
             file_name (str): file_name where the file will be written to.
             error_level (str): log level to use in case an error occurs.
             retry_config (dict, optional): key-value pairs to be passed to
                                            `self.retry`. Defaults to `None`
 
@@ -418,35 +416,22 @@ class ScriptMixin(PlatformMixin):
                               socket.timeout, socket.error),
             error_message="Can't download from %s to %s!" % (url, file_name),
             error_level=error_level,
         )
 
         if retry_config:
             retry_args.update(retry_config)
 
-        download_func = self._urlopen
-        kwargs = {"url": url}
-        if file_name:
-            download_func = self._download_file
-            kwargs = {"url": url, "file_name": file_name}
-
         return self.retry(
-            download_func,
-            kwargs=kwargs,
+            self._download_file,
+            args=(url, file_name),
             **retry_args
         )
 
-    def load_json_url(self, url, error_level=None, *args, **kwargs):
-        """ Returns a json object from a url (it retries). """
-        contents = self._retry_download(
-            url=url, error_level=error_level, *args, **kwargs
-        )
-        return json.loads(contents.read())
-
     # http://www.techniqal.com/blog/2008/07/31/python-file-read-write-with-urllib2/
     # TODO thinking about creating a transfer object.
     def download_file(self, url, file_name=None, parent_dir=None,
                       create_parent_dir=True, error_level=ERROR,
                       exit_code=3, retry_config=None):
         """ Python wget.
         Download the filename at `url` into `file_name` and put it on `parent_dir`.
         On error log with the specified `error_level`, on fatal exit with `exit_code`.
@@ -477,22 +462,17 @@ class ScriptMixin(PlatformMixin):
                 self.log("Unable to get filename from %s; bad url?" % url,
                          level=error_level, exit_code=exit_code)
                 return
         if parent_dir:
             file_name = os.path.join(parent_dir, file_name)
             if create_parent_dir:
                 self.mkdir_p(parent_dir, error_level=error_level)
         self.info("Downloading %s to %s" % (url, file_name))
-        status = self._retry_download(
-            url=url,
-            error_level=error_level,
-            file_name=file_name,
-            retry_config=retry_config
-        )
+        status = self._retry_download_file(url, file_name, error_level, retry_config=retry_config)
         if status == file_name:
             self.info("Downloaded %d bytes." % os.path.getsize(file_name))
         return status
 
     def move(self, src, dest, log_level=INFO, error_level=ERROR,
              exit_code=-1):
         """ recursively move a file or directory (src) to another location (dest).
 
--- a/testing/mozharness/mozharness/mozilla/taskcluster_helper.py
+++ b/testing/mozharness/mozharness/mozilla/taskcluster_helper.py
@@ -1,15 +1,13 @@
 """Taskcluster module. Defines a few helper functions to call into the taskcluster
    client.
 """
 import os
 from datetime import datetime, timedelta
-from urlparse import urljoin
-
 from mozharness.base.log import LogMixin
 
 
 # Taskcluster {{{1
 class Taskcluster(LogMixin):
     """
     Helper functions to report data to Taskcluster
     """
@@ -109,70 +107,8 @@ class Taskcluster(LogMixin):
                 "success": True,
             })
 
     def get_taskcluster_url(self, filename):
         return 'https://queue.taskcluster.net/v1/task/%s/artifacts/public/build/%s' % (
             self.task_id,
             os.path.basename(filename)
         )
-
-
-# TasckClusterArtifactFinderMixin {{{1
-class TaskClusterArtifactFinderMixin(object):
-    # This class depends that you have extended from the base script
-    QUEUE_URL = 'https://queue.taskcluster.net/v1/task/'
-    SCHEDULER_URL = 'https://scheduler.taskcluster.net/v1/task-graph/'
-
-    def get_task(self, task_id):
-        """ Get Task Definition """
-        # Signature: task(taskId) : result
-        return self.load_json_url(urljoin(self.QUEUE_URL, task_id))
-
-    def get_list_latest_artifacts(self, task_id):
-        """ Get Artifacts from Latest Run """
-        # Signature: listLatestArtifacts(taskId) : result
-
-        # Notice that this grabs the most recent run of a task since we don't
-        # know the run_id. This slightly slower, however, it is more convenient
-        return self.load_json_url(urljoin(self.QUEUE_URL, '{}/artifacts'.format(task_id)))
-
-    def url_to_artifact(self, task_id, full_path):
-        """ Return a URL for an artifact. """
-        return urljoin(self.QUEUE_URL, '{}/artifacts/{}'.format(task_id, full_path))
-
-    def get_inspect_graph(self, task_group_id):
-        """ Inspect Task Graph """
-        # Signature: inspect(taskGraphId) : result
-        return self.load_json_url(urljoin(self.SCHEDULER_URL, '{}/inspect'.format(task_group_id)))
-
-    def find_parent_task_id(self, task_id):
-        """ Returns the task_id of the parent task associated to the given task_id."""
-        # Find group id to associated to all related tasks
-        task_group_id = self.get_task(task_id)['taskGroupId']
-
-        # Find child task and determine on which task it depends on
-        for task in self.get_inspect_graph(task_group_id)['tasks']:
-            if task['taskId'] == task_id:
-                parent_task_id = task['requires'][0]
-
-        return parent_task_id
-
-    def set_artifacts(self, task_id):
-        """ Sets installer, test and symbols URLs from the artifacts of a task.
-
-        In this case we set:
-            self.installer_url
-            self.test_url (points to test_packages.json)
-            self.symbols_url
-        """
-        # The tasks which represent a buildbot job only uploads one artifact:
-        # the properties.json file
-        p = self.load_json_url(
-            self.url_to_artifact(task_id, 'public/properties.json'))
-
-        # Set importants artifacts for test jobs
-        self.installer_url = p['packageUrl'][0] if p.get('packageUrl') else None
-        self.test_url = p['testPackagesUrl'][0] if p.get('testPackagesUrl') else None
-        self.symbols_url = p['symbolsUrl'][0] if p.get('symbolsUrl') else None
-
-    def set_parent_artifacts(self, child_task_id):
-        self.set_artifacts(self.find_parent_task_id(child_task_id))
--- a/testing/mozharness/mozharness/mozilla/testing/gaia_test.py
+++ b/testing/mozharness/mozharness/mozilla/testing/gaia_test.py
@@ -20,17 +20,17 @@ from mozharness.base.transfer import Tra
 from mozharness.base.vcs.vcsbase import MercurialScript
 from mozharness.mozilla.blob_upload import BlobUploadMixin, blobupload_config_options
 from mozharness.mozilla.buildbot import TBPL_SUCCESS, TBPL_WARNING, TBPL_FAILURE
 from mozharness.mozilla.gaia import GaiaMixin, gaia_config_options
 from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options
 from mozharness.mozilla.proxxy import Proxxy
 
 
-class GaiaTest(TestingMixin, MercurialScript, TransferMixin, GaiaMixin, BlobUploadMixin):
+class GaiaTest(MercurialScript, TestingMixin, BlobUploadMixin, GaiaMixin, TransferMixin):
     config_options = [[
         ["--application"],
         {"action": "store",
          "dest": "application",
          "default": "b2g",
          "help": "application binary name"
          }
     ], [
@@ -169,17 +169,17 @@ class GaiaTest(TestingMixin, MercurialSc
             # 'proxxy' element. If 'proxxy' is not defined it uses PROXXY_CONFIG
             # For GaiaTest, if there's no proxxy element, don't use a proxxy at
             # all. To do this we must pass a special configuraion
             proxxy_conf = {'proxxy': self.config.get('proxxy', {})}
             proxxy = Proxxy(proxxy_conf, self.log_obj)
             self.proxxy = proxxy
         return self.proxxy
 
-    def _retry_download(self, url, file_name, error_level=FATAL, retry_config=None):
+    def _retry_download_file(self, url, file_name, error_level=FATAL, retry_config=None):
         if self.config.get("bypass_download_cache"):
             n = 0
             # ignore retry_config in this case
             max_attempts = 5
             sleeptime = 60
 
             while n < max_attempts:
                 n += 1
@@ -191,19 +191,17 @@ class GaiaTest(TestingMixin, MercurialSc
                 except Exception:
                     if n >= max_attempts:
                         self.log("Can't download from %s to %s!" % (url, file_name),
                                  level=error_level, exit_code=3)
                         return None
                     self.info("Sleeping %s before retrying..." % sleeptime)
                     time.sleep(sleeptime)
         else:
-            # Since we're overwritting _retry_download() we can't call download_file()
-            # directly
-            return super(GaiaTest, self)._retry_download(
+            return super(GaiaTest, self)._retry_download_file(
                 url, file_name, error_level, retry_config=retry_config,
             )
 
     def run_tests(self):
         """
         Run the test suite.
         """
         pass
--- a/testing/mozharness/mozharness/mozilla/testing/testbase.py
+++ b/testing/mozharness/mozharness/mozilla/testing/testbase.py
@@ -19,17 +19,16 @@ from mozharness.base.log import FATAL, W
 from mozharness.base.python import (
     ResourceMonitoringMixin,
     VirtualenvMixin,
     virtualenv_config_options,
 )
 from mozharness.mozilla.buildbot import BuildbotMixin, TBPL_WARNING
 from mozharness.mozilla.proxxy import Proxxy
 from mozharness.mozilla.structuredlog import StructuredOutputParser
-from mozharness.mozilla.taskcluster_helper import TaskClusterArtifactFinderMixin
 from mozharness.mozilla.testing.unittest import DesktopUnittestOutputParser
 from mozharness.mozilla.testing.try_tools import TryToolsMixin
 from mozharness.mozilla.tooltool import TooltoolMixin
 
 from mozharness.lib.python.authentication import get_credentials
 
 INSTALLER_SUFFIXES = ('.tar.bz2', '.zip', '.dmg', '.exe', '.apk', '.tar.gz')
 
@@ -82,18 +81,18 @@ testing_config_options = [
      "type": "choice",
      "choices": ['ondemand', 'true'],
      "help": "Download and extract crash reporter symbols.",
       }],
 ] + copy.deepcopy(virtualenv_config_options)
 
 
 # TestingMixin {{{1
-class TestingMixin(VirtualenvMixin, BuildbotMixin, ResourceMonitoringMixin,
-                   TaskClusterArtifactFinderMixin, TooltoolMixin, TryToolsMixin):
+class TestingMixin(VirtualenvMixin, BuildbotMixin, ResourceMonitoringMixin, TooltoolMixin,
+                   TryToolsMixin):
     """
     The steps to identify + download the proper bits for [browser] unit
     tests and Talos.
     """
 
     installer_url = None
     installer_path = None
     binary_path = None
@@ -192,21 +191,20 @@ class TestingMixin(VirtualenvMixin, Buil
         def _replace_url(url, changes):
             for from_, to_ in changes:
                 if url.startswith(from_):
                     new_url = url.replace(from_, to_)
                     self.info("Replacing url %s -> %s" % (url, new_url))
                     return new_url
             return url
 
-        if c.get("installer_url") is None:
-            self.exception("You must use --installer-url with developer_config.py")
+        assert c["installer_url"], "You must use --installer-url with developer_config.py"
         if c.get("require_test_zip"):
             if not c.get('test_url') and not c.get('test_packages_url'):
-                self.exception("You must use --test-url or --test-packages-url with developer_config.py")
+                raise AssertionError("You must use --test-url or --test-packages-url with developer_config.py")
 
         c["installer_url"] = _replace_url(c["installer_url"], c["replace_urls"])
         if c.get("test_url"):
             c["test_url"] = _replace_url(c["test_url"], c["replace_urls"])
         if c.get("test_packages_url"):
             c["test_packages_url"] = _replace_url(c["test_packages_url"], c["replace_urls"])
 
         for key, value in self.config.iteritems():
@@ -243,83 +241,64 @@ class TestingMixin(VirtualenvMixin, Buil
         # URLs to the right place and enable http authentication
         if "developer_config.py" in self.config["config_files"]:
             return _urlopen_basic_auth(url, **kwargs)
         else:
             return urllib2.urlopen(url, **kwargs)
 
     # read_buildbot_config is in BuildbotMixin.
 
-    def find_artifacts_from_buildbot_changes(self):
-        c = self.config
-        try:
-            files = self.buildbot_config['sourcestamp']['changes'][-1]['files']
-            buildbot_prop_branch = self.buildbot_config['properties']['branch']
-
-            # Bug 868490 - Only require exactly two files if require_test_zip;
-            # otherwise accept either 1 or 2, since we'll be getting a
-            # test_zip url that we don't need.
-            expected_length = [1, 2, 3]
-            if c.get("require_test_zip") and not self.test_url:
-                expected_length = [2, 3]
-            if buildbot_prop_branch.startswith('gaia-try'):
-                expected_length = range(1, 1000)
-            actual_length = len(files)
-            if actual_length not in expected_length:
-                self.fatal("Unexpected number of files in buildbot config %s.\nExpected these number(s) of files: %s, but got: %d" %
-                           (c['buildbot_json_path'], str(expected_length), actual_length))
-            for f in files:
-                if f['name'].endswith('tests.zip'):  # yuk
-                    if not self.test_url:
-                        # str() because of unicode issues on mac
-                        self.test_url = str(f['name'])
-                        self.info("Found test url %s." % self.test_url)
-                elif f['name'].endswith('crashreporter-symbols.zip'):  # yuk
-                    self.symbols_url = str(f['name'])
-                    self.info("Found symbols url %s." % self.symbols_url)
-                elif f['name'].endswith('test_packages.json'):
-                    self.test_packages_url = str(f['name'])
-                    self.info("Found a test packages url %s." % self.test_packages_url)
-                elif not any(f['name'].endswith(s) for s in ('code-coverage-gcno.zip',)):
-                    if not self.installer_url:
-                        self.installer_url = str(f['name'])
-                        self.info("Found installer url %s." % self.installer_url)
-        except IndexError, e:
-            self.error(str(e))
-
-    def find_artifacts_from_taskcluster(self):
-        self.info("Finding installer, test and symbols from parent task. ")
-        task_id = self.buildbot_config['properties']['taskId']
-        self.set_parent_artifacts(task_id)
-
     def postflight_read_buildbot_config(self):
         """
         Determine which files to download from the buildprops.json file
         created via the buildbot ScriptFactory.
         """
         if self.buildbot_config:
             c = self.config
             message = "Unable to set %s from the buildbot config"
             if c.get("installer_url"):
                 self.installer_url = c['installer_url']
             if c.get("test_url"):
                 self.test_url = c['test_url']
             if c.get("test_packages_url"):
                 self.test_packages_url = c['test_packages_url']
+            try:
+                files = self.buildbot_config['sourcestamp']['changes'][-1]['files']
+                buildbot_prop_branch = self.buildbot_config['properties']['branch']
 
-            if self.buildbot_config['sourcestamp']['changes']:
-                self.find_artifacts_from_buildbot_changes()
-            elif 'taskId' in self.buildbot_config['properties']:
-                self.find_artifacts_from_taskcluster()
-            else:
-                self.exception(
-                    "We have not been able to determine which artifacts "
-                    "to use in order to run the tests."
-                )
-
+                # Bug 868490 - Only require exactly two files if require_test_zip;
+                # otherwise accept either 1 or 2, since we'll be getting a
+                # test_zip url that we don't need.
+                expected_length = [1, 2, 3]
+                if c.get("require_test_zip") and not self.test_url:
+                    expected_length = [2, 3]
+                if buildbot_prop_branch.startswith('gaia-try'):
+                    expected_length = range(1, 1000)
+                actual_length = len(files)
+                if actual_length not in expected_length:
+                    self.fatal("Unexpected number of files in buildbot config %s.\nExpected these number(s) of files: %s, but got: %d" %
+                               (c['buildbot_json_path'], str(expected_length), actual_length))
+                for f in files:
+                    if f['name'].endswith('tests.zip'):  # yuk
+                        if not self.test_url:
+                            # str() because of unicode issues on mac
+                            self.test_url = str(f['name'])
+                            self.info("Found test url %s." % self.test_url)
+                    elif f['name'].endswith('crashreporter-symbols.zip'):  # yuk
+                        self.symbols_url = str(f['name'])
+                        self.info("Found symbols url %s." % self.symbols_url)
+                    elif f['name'].endswith('test_packages.json'):
+                        self.test_packages_url = str(f['name'])
+                        self.info("Found a test packages url %s." % self.test_packages_url)
+                    elif not any(f['name'].endswith(s) for s in ('code-coverage-gcno.zip',)):
+                        if not self.installer_url:
+                            self.installer_url = str(f['name'])
+                            self.info("Found installer url %s." % self.installer_url)
+            except IndexError, e:
+                self.error(str(e))
             missing = []
             if not self.installer_url:
                 missing.append("installer_url")
             if c.get("require_test_zip") and not self.test_url and not self.test_packages_url:
                 missing.append("test_url")
             if missing:
                 self.fatal("%s!" % (message % ('+'.join(missing))))
         else:
--- a/testing/mozharness/scripts/desktop_l10n.py
+++ b/testing/mozharness/scripts/desktop_l10n.py
@@ -692,18 +692,17 @@ class DesktopSingleLocale(LocalesMixin, 
             # specified EN_US_BINARY url is an installer file...
             dst_filename = binary_file.split('/')[-1].strip()
             dst_filename = os.path.join(dirs['abs_objdir'], 'dist', dst_filename)
             # we need to set ZIP_IN so make unpack finds this binary file.
             # Please note this is required only if the en-us-binary-url provided
             # has a different version number from the one in the current
             # checkout.
             self.bootstrap_env['ZIP_IN'] = dst_filename
-            return self.download_file(url=binary_file, file_name=dst_filename,
-                                      error_level=FATAL)
+            return self._retry_download_file(binary_file, dst_filename, error_level=FATAL)
 
         # binary url is not an installer, use make wget-en-US to download it
         return self._make(target=["wget-en-US"], cwd=cwd, env=env)
 
     def make_upload(self, locale):
         """wrapper for make upload command"""
         config = self.config
         env = self.query_l10n_env()
--- a/testing/taskcluster/mach_commands.py
+++ b/testing/taskcluster/mach_commands.py
@@ -16,17 +16,16 @@ from mach.decorators import (
     CommandProvider,
     Command,
 )
 
 
 ROOT = os.path.dirname(os.path.realpath(__file__))
 GECKO = os.path.realpath(os.path.join(ROOT, '..', '..'))
 DOCKER_ROOT = os.path.join(ROOT, '..', 'docker')
-MOZHARNESS_CONFIG = os.path.join(GECKO, 'testing', 'mozharness', 'mozharness.json')
 
 # XXX: If/when we have the taskcluster queue use construct url instead
 ARTIFACT_URL = 'https://queue.taskcluster.net/v1/task/{}/artifacts/{}'
 REGISTRY = open(os.path.join(DOCKER_ROOT, 'REGISTRY')).read().strip()
 
 DEFINE_TASK = 'queue:define-task:aws-provisioner-v1/{}'
 
 TREEHERDER_ROUTE_PREFIX = 'tc-treeherder-stage'
@@ -35,20 +34,16 @@ TREEHERDER_ROUTES = {
     'production': 'tc-treeherder'
 }
 
 DEFAULT_TRY = 'try: -b do -p all -u all'
 DEFAULT_JOB_PATH = os.path.join(
     ROOT, 'tasks', 'branches', 'base_jobs.yml'
 )
 
-def load_mozharness_info():
-    with open(MOZHARNESS_CONFIG) as content:
-        return json.load(content)
-
 def docker_image(name):
     ''' Determine the docker tag/revision from an in tree docker file '''
     repository_path = os.path.join(DOCKER_ROOT, name, 'REGISTRY')
     repository = REGISTRY
 
     version = open(os.path.join(DOCKER_ROOT, name, 'VERSION')).read().strip()
 
     if os.path.isfile(repository_path):
@@ -317,38 +312,32 @@ class Graph(object):
         templates = Templates(ROOT)
         job_path = os.path.join(ROOT, 'tasks', 'branches', project, 'job_flags.yml')
         job_path = job_path if os.path.exists(job_path) else DEFAULT_JOB_PATH
 
         jobs = templates.load(job_path, {})
 
         job_graph = parse_commit(message, jobs)
 
-        # once everything uses in-tree mozharness (bug 1187706), this can go away.
-        mozharness = load_mozharness_info()
-
         cmdline_interactive = params.get('interactive', False)
 
         # Template parameters used when expanding the graph
         parameters = dict(gaia_info().items() + {
             'index': 'index',
             'project': project,
             'pushlog_id': params.get('pushlog_id', 0),
             'docker_image': docker_image,
             'base_repository': params['base_repository'] or \
                 params['head_repository'],
             'head_repository': params['head_repository'],
             'head_ref': params['head_ref'] or params['head_rev'],
             'head_rev': params['head_rev'],
             'owner': params['owner'],
             'from_now': json_time_from_now,
             'now': current_json_time(),
-            'mozharness_repository': mozharness['repo'],
-            'mozharness_rev': mozharness['revision'],
-            'mozharness_ref':mozharness.get('reference', mozharness['revision']),
             'revision_hash': params['revision_hash']
         }.items())
 
         treeherder_route = '{}.{}'.format(
             params['project'],
             params.get('revision_hash', '')
         )
 
@@ -394,30 +383,36 @@ class Graph(object):
                                           build_task['task'],
                                           json_routes,
                                           build_parameters)
 
             # Ensure each build graph is valid after construction.
             taskcluster_graph.build_task.validate(build_task)
             graph['tasks'].append(build_task)
 
-            test_packages_url, tests_url = None, None
+            test_packages_url, tests_url, mozharness_url = None, None, None
 
             if 'test_packages' in build_task['task']['extra']['locations']:
                 test_packages_url = ARTIFACT_URL.format(
                     build_parameters['build_slugid'],
                     build_task['task']['extra']['locations']['test_packages']
                 )
 
             if 'tests' in build_task['task']['extra']['locations']:
                 tests_url = ARTIFACT_URL.format(
                     build_parameters['build_slugid'],
                     build_task['task']['extra']['locations']['tests']
                 )
 
+            if 'mozharness' in build_task['task']['extra']['locations']:
+                mozharness_url = ARTIFACT_URL.format(
+                    build_parameters['build_slugid'],
+                    build_task['task']['extra']['locations']['mozharness']
+                )
+
             build_url = ARTIFACT_URL.format(
                 build_parameters['build_slugid'],
                 build_task['task']['extra']['locations']['build']
             )
 
             # img_url is only necessary for device builds
             img_url = ARTIFACT_URL.format(
                 build_parameters['build_slugid'],
@@ -465,16 +460,18 @@ class Graph(object):
                 test = test['allowed_build_tasks'][build['task']]
                 test_parameters = copy.copy(build_parameters)
                 test_parameters['build_url'] = build_url
                 test_parameters['img_url'] = img_url
                 if tests_url:
                     test_parameters['tests_url'] = tests_url
                 if test_packages_url:
                     test_parameters['test_packages_url'] = test_packages_url
+                if mozharness_url:
+                    test_parameters['mozharness_url'] = mozharness_url
                 test_definition = templates.load(test['task'], {})['task']
                 chunk_config = test_definition['extra']['chunks']
 
                 # Allow branch configs to override task level chunking...
                 if 'chunks' in test:
                     chunk_config['total'] = test['chunks']
 
                 test_parameters['total_chunks'] = chunk_config['total']
--- a/testing/taskcluster/scripts/builder/build-b2g-desktop.sh
+++ b/testing/taskcluster/scripts/builder/build-b2g-desktop.sh
@@ -36,15 +36,16 @@ mkdir -p $HOME/artifacts/
 # the right filename in the task payload where artifacts are declared
 mv *.linux-x86_64.tar.bz2       $HOME/artifacts/target.linux-x86_64.tar.bz2
 mv *.linux-x86_64.json          $HOME/artifacts/target.linux-x86_64.json
 for name in common cppunittest reftest mochitest xpcshell web-platform; do
     mv *.$name.tests.zip          $HOME/artifacts/target.$name.tests.zip ;
 done
 mv test_packages_tc.json        $HOME/artifacts/test_packages.json
 mv *.crashreporter-symbols.zip  $HOME/artifacts/target.crashreporter-symbols.zip
+mv mozharness.zip               $HOME/artifacts/mozharness.zip
 
 # If the simulator does not exist don't fail
 mv fxos-simulator*              $HOME/artifacts/fxos-simulator.xpi || :
 
 ccache -s
 
 ################################### build.sh ###################################
--- a/testing/taskcluster/scripts/builder/build-emulator-x86.sh
+++ b/testing/taskcluster/scripts/builder/build-emulator-x86.sh
@@ -58,10 +58,11 @@ ls -lah $gecko_objdir/dist/
 mv $WORKSPACE/B2G/sources.xml $HOME/artifacts/sources.xml
 mv $WORKSPACE/B2G/out/target/product/generic_x86/tests/gaia-tests.zip $HOME/artifacts/gaia-tests.zip
 for name in common cppunittest reftest mochitest xpcshell web-platform; do
     mv $gecko_objdir/dist/*.$name.tests.zip $HOME/artifacts/target.$name.tests.zip ;
 done
 mv $gecko_objdir/dist/test_packages_tc.json $HOME/artifacts/test_packages.json
 mv $WORKSPACE/B2G/out/emulator.tar.gz $HOME/artifacts/emulator.tar.gz
 mv $gecko_objdir/dist/b2g-*.crashreporter-symbols.zip $HOME/artifacts/b2g-crashreporter-symbols.zip
+mv $gecko_objdir/dist/mozharness.zip $HOME/artifacts/mozharness.zip
 
 ccache -s
--- a/testing/taskcluster/scripts/builder/build-emulator.sh
+++ b/testing/taskcluster/scripts/builder/build-emulator.sh
@@ -60,10 +60,11 @@ ls -lah $gecko_objdir/dist/
 mv $WORKSPACE/B2G/sources.xml $HOME/artifacts/sources.xml
 mv $WORKSPACE/B2G/out/target/product/generic/tests/gaia-tests.zip $HOME/artifacts/gaia-tests.zip
 for name in common cppunittest reftest mochitest xpcshell web-platform; do
     mv $gecko_objdir/dist/*.$name.tests.zip  $HOME/artifacts/target.$name.tests.zip ;
 done
 mv $gecko_objdir/dist/test_packages_tc.json $HOME/artifacts/test_packages.json
 mv $WORKSPACE/B2G/out/emulator.tar.gz $HOME/artifacts/emulator.tar.gz
 mv $gecko_objdir/dist/b2g-*.crashreporter-symbols.zip $HOME/artifacts/b2g-crashreporter-symbols.zip
+mv $gecko_objdir/dist/mozharness.zip $HOME/artifacts/mozharness.zip
 
 ccache -s
--- a/testing/taskcluster/scripts/builder/build-mulet-linux.sh
+++ b/testing/taskcluster/scripts/builder/build-mulet-linux.sh
@@ -31,12 +31,13 @@ mkdir -p $HOME/artifacts/
 mv *.linux-x86_64.tar.bz2       $HOME/artifacts/target.linux-x86_64.tar.bz2
 mv *.linux-x86_64.json          $HOME/artifacts/target.linux-x86_64.json
 for name in common cppunittest reftest mochitest xpcshell web-platform; do
     mv *.$name.tests.zip          $HOME/artifacts/target.$name.tests.zip ;
 done
 mv test_packages_tc.json        $HOME/artifacts/test_packages.json
 mv *.crashreporter-symbols.zip  $HOME/artifacts/target.crashreporter-symbols.zip
 mv jsshell-linux-x86_64.zip     $HOME/artifacts/jsshell-linux-x86_64.zip
+mv mozharness.zip               $HOME/artifacts/mozharness.zip
 
 ccache -s
 
 ################################### build.sh ###################################
--- a/testing/taskcluster/tasks/builds/b2g_base.yml
+++ b/testing/taskcluster/tasks/builds/b2g_base.yml
@@ -1,4 +1,9 @@
 $inherits:
   from: 'tasks/build.yml'
   variables:
     build_product: 'b2g'
+task:
+  extra:
+    locations:
+      test_packages: 'public/build/test_packages.json'
+      mozharness: 'public/build/mozharness.zip'
--- a/testing/taskcluster/tasks/builds/b2g_desktop_base.yml
+++ b/testing/taskcluster/tasks/builds/b2g_desktop_base.yml
@@ -29,9 +29,8 @@ task:
       machine:
         platform: b2g-linux64
 
     # Rather then enforcing particular conventions we require that all build
     # tasks provide the "build" extra field to specify where the build and tests
     # files are located.
     locations:
       build: 'public/build/target.linux-x86_64.tar.bz2'
-      test_packages: 'public/build/test_packages.json'
--- a/testing/taskcluster/tasks/builds/b2g_emulator_base.yml
+++ b/testing/taskcluster/tasks/builds/b2g_emulator_base.yml
@@ -28,11 +28,10 @@ task:
         buildbot_step 'Build' ./build-emulator.sh $HOME/workspace
 
   extra:
     # Rather then enforcing particular conventions we require that all build
     # tasks provide the "build" extra field to specify where the build and tests
     # files are located.
     locations:
       build: 'public/build/emulator.tar.gz'
-      test_packages: 'public/build/test_packages.json'
       symbols: 'public/build/b2g-crashreporter-symbols.zip'
       sources: 'public/build/sources.xml'
--- a/testing/taskcluster/tasks/builds/b2g_emulator_x86_base.yml
+++ b/testing/taskcluster/tasks/builds/b2g_emulator_x86_base.yml
@@ -21,12 +21,11 @@ task:
         buildbot_step 'Build' ./build-emulator-x86.sh $HOME/workspace
 
   extra:
     # Rather then enforcing particular conventions we require that all build
     # tasks provide the "build" extra field to specify where the build and tests
     # files are located.
     locations:
       build: 'public/build/emulator.tar.gz'
-      test_packages: 'public/build/test_packages.json'
       tests: 'public/build/b2g-tests.zip'
       symbols: 'public/build/b2g-crashreporter-symbols.zip'
       sources: 'public/build/sources.xml'
--- a/testing/taskcluster/tasks/phone_test.yml
+++ b/testing/taskcluster/tasks/phone_test.yml
@@ -22,18 +22,16 @@ task:
     maxRunTime: 3600
     cache:
       tc-vcs: '/home/worker/.tc-vcs'
     env:
       GAIA_HEAD_REPOSITORY: '{{{gaia_head_repository}}}'
       GAIA_BASE_REPOSITORY: '{{{gaia_base_repository}}}'
       GAIA_REF: '{{{gaia_ref}}}'
       GAIA_REV: '{{{gaia_rev}}}'
-      MOZHARNESS_REPOSITORY: '{{mozharness_repository}}'
-      MOZHARNESS_REV: '{{mozharness_rev}}'
 
     # All builds share a common artifact directory for ease of uploading.
     artifacts:
       'private/logs':
         type: directory
         path: '/home/worker/upload/logs/'
         expires: '{{#from_now}}1 year{{/from_now}}'
 
--- a/testing/taskcluster/tasks/test.yml
+++ b/testing/taskcluster/tasks/test.yml
@@ -31,19 +31,18 @@ task:
       # So pip installs are cached...
       linux-cache: /home/worker/.cache
       tc-vcs: '/home/worker/.tc-vcs'
     env:
       GAIA_HEAD_REPOSITORY: '{{{gaia_head_repository}}}'
       GAIA_BASE_REPOSITORY: '{{{gaia_base_repository}}}'
       GAIA_REF: '{{{gaia_ref}}}'
       GAIA_REV: '{{{gaia_rev}}}'
-      MOZHARNESS_REPOSITORY: '{{mozharness_repository}}'
-      MOZHARNESS_REV: '{{mozharness_rev}}'
       MOZILLA_BUILD_URL: '{{build_url}}'
+      MOZHARNESS_URL: '{{mozharness_url}}'
 
     # All builds share a common artifact directory for ease of uploading.
     artifacts:
       'public/logs/':
         type: directory
         path: '/home/worker/build/upload/logs/'
         expires: '{{#from_now}}1 year{{/from_now}}'
       'public/test_info/':
--- a/testing/testsuite-targets.mk
+++ b/testing/testsuite-targets.mk
@@ -425,17 +425,19 @@ test-packages-manifest:
       $(call PKG_ARG,common) \
       $(foreach pkg,$(TEST_PKGS),$(call PKG_ARG,$(pkg)))
 
 package-tests:
 	@rm -f '$(DIST)/$(PKG_PATH)$(TEST_PACKAGE)'
 	$(NSINSTALL) -D $(DIST)/$(PKG_PATH)
 # Exclude harness specific directories when generating the common zip.
 	$(MKDIR) -p $(abspath $(DIST))/$(PKG_PATH) && \
-	cd $(PKG_STAGE) && \
+	cd $(topsrcdir)/testing/ && \
+	  zip -rq9D $(abspath $(DIST))/$(PKG_PATH)mozharness.zip mozharness && \
+	cd $(abspath $(PKG_STAGE)) && \
 	  zip -rq9D '$(abspath $(DIST))/$(PKG_PATH)$(TEST_PACKAGE)' \
 	  * -x \*/.mkdir.done \*.pyc $(foreach name,$(TEST_PKGS),$(name)\*) && \
 	$(foreach name,$(TEST_PKGS),rm -f '$(DIST)/$(PKG_PATH)$(PKG_BASENAME).'$(name)'.tests.zip' && \
                                 zip -rq9D '$(abspath $(DIST))/$(PKG_PATH)$(PKG_BASENAME).'$(name)'.tests.zip' \
                                 $(name) -x \*/.mkdir.done \*.pyc ;)
 
 ifeq ($(MOZ_BUILD_APP),mobile/android)
 package-tests: stage-android